
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[216.73.216.207] |
![]() |
|
Страницы: (2) 1 [2] все ( Перейти к последнему сообщению ) |
![]() |
Сообщ.
#16
,
|
|
Цитата RuSA @ это слишком громко сказано, т.к. в достаточно большом или старом проекте, нельзя гарантировать, что использования всегда будут "академически правильными". Вот исходя из опыта как раз работы с большим проектом я тебе и говорю что нотификация спасет мир. а глобальные переменные нужно сводить к минимуму. Добавлено пс. на моей практике я несколько подобных случаев (которых предлагаеш ты) и справлял на нотификацию. я бы не лез (ибо старые проекты лучше не трогать пока они работают) но контейнеров создавалось несколько и каждый создавал для себя дата модуль (при этом глобальная переменная юзалась одна. что тоже являлось ошибкой ибо они повисали в воздухе), и при уничтожении одного из модулей все остальные контейнеры не могли уже работать ибо переменная nil. посему повторюсь что нотификация спасет мир. еще ни разу не подводила. |
Сообщ.
#17
,
|
|
|
![]() ![]() function DataModule1: TDataModule1; procedure DestroyDataModule1; implementation var dmDataModule1: TDataModule1; function DataModule1: TDataModule1; begin if dmDataModule1 = nil then dmDataModule1 := TDataModule1.Create; Result := dmDataModule1; end; procedure DestroyDataModule1; begin FreeAndNil(dmDataModule1); end; А вообще я продолжаю не понимать смысл затеи. Для освобождения памяти достаточно деактивировать все объекты модуля, зачем его сам-то сносить? |
![]() |
Сообщ.
#18
,
|
|
Цитата Fr0sT @ Для освобождения памяти достаточно деактивировать все объекты модуля, зачем его сам-то сносить? да самый простой вариант это авто создание и пусть живет до конца жизни программы. если ничего не трогать в этом механизме то никаких проблем не будет |
Сообщ.
#19
,
|
|
|
Цитата RuSA @ а) если освобождаемая переменная X уже nil, то FreeAndNil выполнится без ошибок, а Free даст "NULL Pointer", Нет, т.к. Free делает проверку if Self <> nil then Destroy; Цитата RuSA @ В исходном варианте проблема была в том, что в момент вызова ... Datamodule2 была <> nil, но сам экземпляр уже был освобождён. Так что вариант с обнулением в деструкторе вылечил бы это, если бы тут использовалось FreeAndNil Ничего бы он не вылечил, т.к. проблема не в обнулении, а в том, что объект DataModule2 сделан слугой фиг знает скольки господ - и TBaseConnector, и Application, и как глобальная переменная ва-аще доступна всем желающим, в частности шаловливым ручонкам г-на cyberovskij ![]() |
Сообщ.
#20
,
|
|
|
Цитата ViktorXP @ на моей практике я несколько подобных случаев (которых предлагаеш ты) и справлял на нотификацию. здесь предлагает автор - ему надо освободить объект datamodule2. Для этого предлагается вызвать элементарное FreeAndNil(DataModule2) в нужном месте проги. + страховка внутри destroy, для очитски АВТОМАТИЧЕКИ созданной Delphi переменной. И всё. Нотификация тут не при чём. Её механизм гораздо более сложный, чем описанное выше. И к тому же, для класса исходного автора её нельзя применить воовсе, т.к. класс не является наследником TComponent. |
Сообщ.
#21
,
|
|
|
Цитата RuSA @ здесь предлагает автор - ему надо освободить объект datamodule2 Еще раз - если автор освобождает объект datamodule2 только в деструкторе TBaseConnector и ДО того как этот объект будет уничтожен Application, то никакое обнуление не нужно. Если же ПОСЛЕ, то - "лопух", и никакое обнуление тут тоже не поможет. Если же где-то удаляет "ручками" через явный вызов datamodule.free, то тоже "лопух" - не подумал, к чему это может привести |
Сообщ.
#22
,
|
|
|
Цитата leo @ Цитата RuSA @ здесь предлагает автор - ему надо освободить объект datamodule2 Еще раз - если автор освобождает объект datamodule2 только в деструкторе TBaseConnector и ДО того как этот объект будет уничтожен Application, то никакое обнуление не нужно. Если же ПОСЛЕ, то - "лопух", и никакое обнуление тут тоже не поможет. Если же где-то удаляет "ручками" через явный вызов datamodule.free, то тоже "лопух" - не подумал, к чему это может привести Уже автор давно не освобождает datamodule2. Я принял во внимание топик #5 от 05772 и решил все дата_объекты создавать и уничтожать в модуле baseconnector; всем спасибо за отписку. Добавлено Цитата leo @ шаловливым ручонкам г-на cyberovskij Ага, видели бы мои ручища |
Сообщ.
#23
,
|
|
|
Цитата cyberovskij @ Уже автор давно не освобождает datamodule2. Я принял во внимание топик #5 от 05772 и решил все дата_объекты создавать и уничтожать в модуле baseconnector; всем спасибо за отписку. Молодец, только, боюсь, что ты так толком и не понял, что модуль с TDataModule ничем особым не отличается от обычного модуля и лишь упрощает создание и настройку компонентов БД - все остальное в твоих руках. Убираешь дата-модуль из автосоздания, удаляешь переменную var DataModule2:TDataModule2, добавляешь описание и код твоего класса TBaseConnector и сохраняешь модуль под именем baseconnector. Ну и ес-но вместо Application.CreateForm юзаешь FDm:=TDataModule2.Create(nil), где FDm:TDataModule2 - приватное поле твоего класса. У-се, работай наздоровье с дата_объектами через свой класс - ни Application, никакие другие шаловливые "ручища" их не удалят ![]() Хотя, если хочешь по совету 05772 все своими "ручищами" создавать, то ради бога |