Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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]

> Все работает, все нормально&#133

Это не ненадолго, было обсуждение уже&#133


 
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?

А если он никому не понядобится? Зачаем его создавать&#133


 
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]

> вообще-то все объекты в программе создаются в ран-тайме
> и нигде более&#133

Ну вы же меня поняли&#133

Дада модуль, имхо, придумали для того, чтобы кидать на него контролы в дизайн тайме&#133


 
Игорь Шевченко ©   (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 (где ее очищать). Будет чистый синглтон.

Надо попробовать&#133


> Я особенных возражений на форуме не видел.

С формой понятно, а зачем может понадобится 10 дата модулей?

ЗЫ
 То что то о чем вы говорите можно сделать, и что никто не хуже я не спорю&#133


 
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]

> Шоб мышкой на него кидать всякую хрень.

Мдаа, примерчег&#133 :)


 
Игорь Шевченко ©   (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 я не вижу, как впрочем и особых минусов



Страницы: 1 2 вся ветка

Форум: "Начинающим";
Текущий архив: 2007.10.21;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.55 MB
Время: 0.056 c
6-1171790033
santey
2007-02-18 12:13
2007.10.21
Как установить IP адрес


15-1190638144
Empleado
2007-09-24 16:49
2007.10.21
И почему я - не таракан?!


2-1190723682
smak
2007-09-25 16:34
2007.10.21
Как заставить прогу реагировать на события при обр. запроса


15-1190540385
Дженкинс
2007-09-23 13:39
2007.10.21
Какие есть способы предоставления Инета в локалку?


15-1190375811
sTEPler
2007-09-21 15:56
2007.10.21
юникс





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский