![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Кто создал экземпляр класса? [D7, WinXP]
yuray © (2007-09-26 10:47:00)Детский вопрос.
Создал модуль, в котором реализовал класс
Unit MyClassUnt;
interface
type
TMyClass = class
.......
private
.......
public
.......
end;
Var
MyClass: TMyClass;
implementation
..............
end.
В главной форме пишу
uses MyClassUnt;
......
MyClass.SomeMetod;
MyClass.SomeProperty;
Компилирую... Все работает, все нормально...
Вопрос. Кто и где создал экземпляр класса MyClass? Руками нигде я не писал MyClass := TMyClass.Create(); Спасибо.
Reindeer Moss Eater (2007-09-26 14:03:00) [21]Шоб мышкой на него кидать всякую хрень.
:)
DVM (2007-09-26 14:01:00) [22]
> Один поток на клиента и в каждом потоке один экземпляр DM
Нахрена там вообще эти DataModul-и? Он нужен только для удобства проектирования, не более того.
Reindeer Moss Eater (2007-09-26 13:50:00) [23]С формой понятно, а зачем может понадобится 10 дата модулей?
Сервер приложений например. Один поток на клиента и в каждом потоке один экземпляр DM
Kolan (2007-09-26 13:47:00) [24]> Так же, но не вводить новый метод, а перекрыть NewInstance
> (где проверять глобальную переменную из implementtation)
> и FreeInstance (где ее очищать). Будет чистый синглтон.
Надо попробовать
> Я особенных возражений на форуме не видел.
С формой понятно, а зачем может понадобится 10 дата модулей?
ЗЫ
То что то о чем вы говорите можно сделать, и что никто не хуже я не спорю
Игорь Шевченко (2007-09-26 13:21:00) [25]Kolan © (26.09.07 13:18) [27]
Не совсем понял, каким образом "кидание контролов в дизайн-тайме" относится к созданию датамодулей в ран-тайме. Вроде вещи не связанные. На форму тоже "кидают контролы", однако против фраз
with TFooForm.Create(Application) do
Show
Я особенных возражений на форуме не видел. Возникает естественный вопрос - чем форма лучше/хуже датамодуля, что форму можно создавать в момент,когда она требуется, а датамодуль нет ?
Kolan (2007-09-26 13:18:00) [26]> вообще-то все объекты в программе создаются в ран-тайме
> и нигде более
Ну вы же меня поняли
Дада модуль, имхо, придумали для того, чтобы кидать на него контролы в дизайнтайме
yuray (2007-09-26 12:37:00) [27]Всем спасибо за ответы. Немножко прояснилось...
Игорь Шевченко (2007-09-26 12:26:00) [28]
> Нафиг вообще дата модули создавать в ран тайме?
Как бы тебе сказать - вообще-то все объекты в программе создаются в ран-тайме и нигде более...
Сергей М. (2007-09-26 12:03:00) [29]
> Какое решение выбрать?
Простейшее и очевиднейшее - объект должен быть создан в любое время допервого обращения к нему и должен быть уничтожен, как только он более никому не нужен.
Юрий Зотов (2007-09-26 12:02:00) [30]> Kolan © (26.09.07 11:38) [19]
> как в D7 сделать подругому я незнаю.
Так же, но не вводить новый метод, а перекрыть NewInstance (где проверять глобальную переменную из implementtation) и FreeInstance (где ее очищать). Будет чистый синглтон.
yuray (2007-09-26 11:58:00) [31]И все же. Какое решение выбрать? Для меня это очень важно.
yuray © (26.09.07 11:14) [14]
Kolan © (26.09.07 11:20) [15]
yuray © (26.09.07 11:35) [18] .
В последнем варианте мне не нравится пустая dfm-ка. Почему спрашиваю. Результат написания проги - это правильный код. Спасибо.
sniknik (2007-09-26 11:54:00) [32]> Так делать правильно?
что значит правильно?
как правильно запрягать лошадь в телегу? ........ (и уже после обьяснений) если хочеш покататься верхом.... телега это римская колесница....
правильно это так, как нужно для решения задачи, абстрактных понятий "правильности" не существует.
Kolan (2007-09-26 11:39:00) [33]Нафиг вообще дата модули создавать в ран тайме?
Kolan (2007-09-26 11:38:00) [34]> Так делать правильно?
Да пожалуйста делай.
Синглетон не дает сделать больше одного экземпляра(только не это конкретный вариант реализации, это даёт, а как в D7 сделать подругому я незнаю).
yuray (2007-09-26 11:35:00) [35]> Kolan © (26.09.07 11:20) [15]
Спасибо за ответ.
А если я добавлю в проект пустой Data Module и там реализую свои методы? Тоесть получится
Unit MyClassUnt;
interface
type
TMyClass = class(TDataModule)
.......
private
.......
public
.......
end;
Var
MyClass: TMyClass;
implementation
..............
end.
В этом случае компилятор сам создаст MyClass при инициализации Application. (Application.CreateForm(TMyClass, MyClass)). Так делать правильно?
Kolan (2007-09-26 11:30:00) [36]> А почему бы в initialization не поместить TDataAccessFacade.Create?
А если он никому не понядобится? Зачаем его создавать
DVM (2007-09-26 11:25:00) [37]
> Kolan © (26.09.07 11:20) [15]
А почему бы в initialization не поместить TDataAccessFacade.Create?
Kolan (2007-09-26 11:20:00) [38]> Как правильно создать MyClass?
Ты хочешь синглетон сделать?
В D7 нет классовых переменных (или нметодов), поэтому я делаю так:
TDataAccessFacade = class
end;
function GetDataAccessFacade: TDataAccessFacade;
implementation
var
DataAccessFacade: TDataAccessFacade;
function GetDataAccessFacade: TDataAccessFacade;
begin
if not Assigned(DataAccessFacade) then
DataAccessFacade := TDataAccessFacade.Create;
Result := DataAccessFacade;
end;
initialization
finalization
DataAccessFacade.Free;
yuray (2007-09-26 11:14:00) [39]2 sniknik
Согласен. Как правильно создать MyClass? В секции initialization модуля MyClassUnt прописать MyClass := TMyClass.Create();?
sniknik (2007-09-26 11:10:00) [40]> Но я пишу MyClass.SomeMetod...
и что там будет в значении если его не создать(присвоить)? переменная то глобальная...
сделай локальной и в ней будет мусор, вот тогда и ошибка будет (а может и повезет... хотя это как сказать)