Форум: "Начинающим";
Текущий архив: 2007.10.21;
Скачать: [xml.tar.bz2];
ВнизКто создал экземпляр класса? Найти похожие ветки
← →
yuray © (2007-09-26 10:47) [0]Детский вопрос.
Создал модуль, в котором реализовал класс
Unit MyClassUnt;
interface
type
TMyClass = class
.......
private
.......
public
.......
end;
Var
MyClass: TMyClass;
implementation
..............
end.
В главной форме пишу
uses MyClassUnt;
......
MyClass.SomeMetod;
MyClass.SomeProperty;
Компилирую... Все работает, все нормально...
Вопрос. Кто и где создал экземпляр класса MyClass? Руками нигде я не писал MyClass := TMyClass.Create(); Спасибо.
← →
DVM © (2007-09-26 10:49) [1]
> Кто и где создал экземпляр класса MyClass?
Compiler Magic
← →
Сергей М. © (2007-09-26 10:54) [2]
> Кто и где создал экземпляр класса MyClass?
Никто и нигде.
← →
yuray © (2007-09-26 10:55) [3]2 Сергей М.
Почему работает?
← →
Kolan © (2007-09-26 10:55) [4]> Все работает, все нормально…
Это не ненадолго, было обсуждение уже…
← →
Kolan © (2007-09-26 10:56) [5]
>
> Почему работает?
Покажи что в методах.
← →
Сергей М. © (2007-09-26 11:01) [6]
> yuray © (26.09.07 10:55) [3]
> Почему работает?
Потому что повезло.
В очередной раз может и не повезти)
← →
sniknik © (2007-09-26 11:01) [7]> Компилирую... Все работает, все нормально...
работает ли... вот в чем вопрос. не говоря уже о нормально.
наверное ты хочеш сказать что скомпилировалось, и не дает ошибок при вызове. ну это не "теорема ферма", в методах у тебя попросту нет обращений к данным, он сделан статичным/классовым/(вот с виртуальными не уверен, неоднозначно, там же даже в базовом есть "заглушки" если не обьявлен как абстрактный), т.е. просто код который есть даже без создания экземпляра класса.
сделай так. ничего не изменится. до тех пор пока реально обработку данных не начнешь в них делать.
TMyClass(nil).SomeMetod;
TMyClass(nil).SomeProperty;
← →
sniknik © (2007-09-26 11:03) [8]> обработку
вернее обращения к данным класса.
← →
yuray © (2007-09-26 11:03) [9]В методах реализован доступ и работа с DCOM объектом.
Например, в секции public реализован метод
function TClientDataModule.DCOMConnect(const ACompName: string):boolean;
begin
Result := true;
if not Assigned(Server) then
try
Server := CreateRemoteComObject(ACompName, CLASS_App) as IApp;
except
Result := false;
ShowMessage(SServerNotAssigned);
end;
end;
← →
yuray © (2007-09-26 11:07) [10]2 sniknik
TMyClass(nil).SomeMetod - это понятно. Но я пишу MyClass.SomeMetod...
← →
yuray © (2007-09-26 11:07) [11]2 sniknik
TMyClass(nil).SomeMetod - это понятно. Но я пишу MyClass.SomeMetod...
← →
Сергей М. © (2007-09-26 11:10) [12]
> yuray © (26.09.07 11:03) [9]
В этом коде, очевидно, нет обращения к данным объекта, потому и "работает"
← →
sniknik © (2007-09-26 11:10) [13]> Но я пишу MyClass.SomeMetod...
и что там будет в значении если его не создать(присвоить)? переменная то глобальная...
сделай локальной и в ней будет мусор, вот тогда и ошибка будет (а может и повезет... хотя это как сказать)
← →
yuray © (2007-09-26 11:14) [14]2 sniknik
Согласен. Как правильно создать MyClass? В секции initialization модуля MyClassUnt прописать MyClass := TMyClass.Create();?
← →
Kolan © (2007-09-26 11:20) [15]> Как правильно создать 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;
← →
DVM © (2007-09-26 11:25) [16]
> Kolan © (26.09.07 11:20) [15]
А почему бы в initialization не поместить TDataAccessFacade.Create?
← →
Kolan © (2007-09-26 11:30) [17]> А почему бы в initialization не поместить TDataAccessFacade.Create?
А если он никому не понядобится? Зачаем его создавать…
← →
yuray © (2007-09-26 11:35) [18]> 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:38) [19]> Так делать правильно?
Да пожалуйста делай.
Синглетон не дает сделать больше одного экземпляра(только не это конкретный вариант реализации, это даёт, а как в D7 сделать подругому я незнаю).
← →
Kolan © (2007-09-26 11:39) [20]Нафиг вообще дата модули создавать в ран тайме?
← →
sniknik © (2007-09-26 11:54) [21]> Так делать правильно?
что значит правильно?
как правильно запрягать лошадь в телегу? ........ (и уже после обьяснений) если хочеш покататься верхом.... телега это римская колесница....
правильно это так, как нужно для решения задачи, абстрактных понятий "правильности" не существует.
← →
yuray © (2007-09-26 11:58) [22]И все же. Какое решение выбрать? Для меня это очень важно.
yuray © (26.09.07 11:14) [14]
Kolan © (26.09.07 11:20) [15]
yuray © (26.09.07 11:35) [18] .
В последнем варианте мне не нравится пустая dfm-ка. Почему спрашиваю. Результат написания проги - это правильный код. Спасибо.
← →
Юрий Зотов © (2007-09-26 12:02) [23]> Kolan © (26.09.07 11:38) [19]
> как в D7 сделать подругому я незнаю.
Так же, но не вводить новый метод, а перекрыть NewInstance (где проверять глобальную переменную из implementtation) и FreeInstance (где ее очищать). Будет чистый синглтон.
← →
Сергей М. © (2007-09-26 12:03) [24]
> Какое решение выбрать?
Простейшее и очевиднейшее - объект должен быть создан в любое время до первого обращения к нему и должен быть уничтожен, как только он более никому не нужен.
← →
Игорь Шевченко © (2007-09-26 12:26) [25]
> Нафиг вообще дата модули создавать в ран тайме?
Как бы тебе сказать - вообще-то все объекты в программе создаются в ран-тайме и нигде более...
← →
yuray © (2007-09-26 12:37) [26]Всем спасибо за ответы. Немножко прояснилось...
← →
Kolan © (2007-09-26 13:18) [27]> вообще-то все объекты в программе создаются в ран-тайме
> и нигде более…
Ну вы же меня поняли…
Дада модуль, имхо, придумали для того, чтобы кидать на него контролы в дизайн тайме…
← →
Игорь Шевченко © (2007-09-26 13:21) [28]Kolan © (26.09.07 13:18) [27]
Не совсем понял, каким образом "кидание контролов в дизайн-тайме" относится к созданию датамодулей в ран-тайме. Вроде вещи не связанные. На форму тоже "кидают контролы", однако против фраз
with TFooForm.Create(Application) do
Show
Я особенных возражений на форуме не видел. Возникает естественный вопрос - чем форма лучше/хуже датамодуля, что форму можно создавать в момент,когда она требуется, а датамодуль нет ?
← →
Kolan © (2007-09-26 13:47) [29]> Так же, но не вводить новый метод, а перекрыть NewInstance
> (где проверять глобальную переменную из implementtation)
> и FreeInstance (где ее очищать). Будет чистый синглтон.
Надо попробовать…
> Я особенных возражений на форуме не видел.
С формой понятно, а зачем может понадобится 10 дата модулей?
ЗЫ
То что то о чем вы говорите можно сделать, и что никто не хуже я не спорю…
← →
Reindeer Moss Eater © (2007-09-26 13:50) [30]С формой понятно, а зачем может понадобится 10 дата модулей?
Сервер приложений например. Один поток на клиента и в каждом потоке один экземпляр DM
← →
DVM © (2007-09-26 14:01) [31]
> Один поток на клиента и в каждом потоке один экземпляр DM
Нахрена там вообще эти DataModul-и? Он нужен только для удобства проектирования, не более того.
← →
Reindeer Moss Eater © (2007-09-26 14:03) [32]Шоб мышкой на него кидать всякую хрень.
:)
← →
Kolan © (2007-09-26 14:18) [33]> Шоб мышкой на него кидать всякую хрень.
Мдаа, примерчег… :)
← →
Игорь Шевченко © (2007-09-26 14:57) [34]
> С формой понятно, а зачем может понадобится 10 дата модулей?
Эта... в последнем проекте их в районе 35. 20 из них могут создаваться в произвольный момент времени в произвольном количестве. Даже поясню зачем - одноврменно видеть выборки из одного и того же запроса, но с разными параметрами.
← →
Kolan © (2007-09-26 15:03) [35]> Даже поясню зачем — одноврменно видеть выборки из одного
> и того же запроса, но с разными параметрами.
Ясно.
← →
DVM © (2007-09-26 15:10) [36]
> 20 из них могут создаваться в произвольный момент времени
> в произвольном количестве.
Можно и без них было обойтись. Создавать динамически DataSource и прочее.
← →
Anatoly Podgoretsky © (2007-09-26 15:30) [37]> Kolan (26.09.2007 13:47:29) [29]
У меня на сервере, каждый поток имеет отдельный датамодуль, очень удобно.
← →
Anatoly Podgoretsky © (2007-09-26 15:31) [38]
> Нахрена там вообще эти DataModul-и? Он нужен только для
> удобства проектирования, не более того.
Чего?
← →
Anatoly Podgoretsky © (2007-09-26 15:32) [39]
> Можно и без них было обойтись. Создавать динамически DataSource
> и прочее.
А не устанешь создавать множество объектов в каждом потоке и устанавливать все свойства?
Это не один десяток.
← →
DVM © (2007-09-26 16:12) [40]
> Чего?
Того.
> А не устанешь создавать множество объектов в каждом потоке
> и устанавливать все свойства?
Ну если только их там множество. Да и кто мешает написать функцию ОДИН РАЗ для создания всего чего надо и использовать ее много раз в каждом потоке? Никаких особых плюсов в использовании DataModule я не вижу, как впрочем и особых минусов
← →
Юрий Зотов © (2007-09-26 16:23) [41]DataModule: разделение слоя данных и слоя отображения с сохранением преимуществ RAD. Только и всего.
← →
Anatoly Podgoretsky © (2007-09-26 16:35) [42]> DVM (26.09.2007 16:12:40) [40]
Их не только много, но они связаны с собой, наборы изначально открыты, все настроено и далее создается одной строчкой и автоматически все уничтожается при окончании потока. Логика работы потока изолирована от компонент данных.
← →
Игорь Шевченко © (2007-09-27 10:16) [43]DVM © (26.09.07 15:10) [36]
> Можно и без них было обойтись. Создавать динамически DataSource
> и прочее.
А чем создание заранее подготовленного датамодуля хуже, чем создание dataSet"а, заполнение его свойств и т.д. ?
← →
DVM © (2007-09-27 10:37) [44]
> А чем создание заранее подготовленного датамодуля хуже,
> чем создание dataSet"а, заполнение его свойств и т.д. ?
Это несколько медленнее и расходует больше ресурсов.
← →
Игорь Шевченко © (2007-09-27 11:47) [45]DVM © (27.09.07 10:37) [44]
Замеры в студию. Иначе пустой треп.
← →
Anatoly Podgoretsky © (2007-09-27 11:51) [46]Создатель, точнее владелец, начинается с
constructor Create(AOwner: TComponent); virtual;
← →
Ega23 © (2007-09-27 11:55) [47]А что такое "синглтон"?
← →
b z (2007-09-27 12:07) [48]
> Ega23 © (27.09.07 11:55) [47]
а вы с какой целью интересуетесь? :)
если своими словами - экземпляров данного типа, в приложении (программе, программном комплексе ...), может быть не более одного.
в инете много про это ... ну вот - http://rsdn.ru/article/patterns/singleton.xml
← →
Kolan © (2007-09-27 12:13) [49]> А что такое «синглтон»?
типа к описочке придрался:?синглетон
Если нет, то это класс, который который позволяет создать только один свой экземпляр и обеспечивает глобальный доступ к нему(к экземпляру)…
← →
Юрий Зотов © (2007-09-27 12:47) [50]Какие-такие описочки? Никаких описочек. Правильное русское написание импортных слов - так, как они призносятся на исходном языке (если еще не устоялось другое русское написание). А свежезаимствованное английское слово "singleton" произносится "синглтон". Кто не верит - см. Lingvo.
← →
Ega23 © (2007-09-27 13:17) [51]
> b z (27.09.07 12:07) [48]
А, понял о чём речь.
> Kolan © (27.09.07 12:13) [49]
Нет, не к описке (хотя её там и нет, как ЮЗ справедливо заметил)
← →
Kolan © (2007-09-27 13:19) [52]> Кто не верит — см. Lingvo.
Верю, просто кривые переводы портят моск.
Страницы: 1 2 вся ветка
Форум: "Начинающим";
Текущий архив: 2007.10.21;
Скачать: [xml.tar.bz2];
Память: 0.58 MB
Время: 0.045 c