Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2003.07.17;
Скачать: [xml.tar.bz2];

Вниз

Как создать объекты производного класса еще в предке?   Найти похожие ветки 

 
Пубертанец   (2003-07-04 09:06) [0]

Уважаемые знатоки,

есть классы TReestr1, TReestr2, TReestr3 и базовый для них класс TReestr. Причем в published properties TReestr3 входят ссылки на TReestr1 и TReestr2.
Чтобы не писать в контрукторе TReestr3:
Reestr1:=TReestr1.Create(nil);
Reestr2:=TReestr2.Create(aaa);

я решил создать их еще в контрукторе предка (TReestr). Например,

constructor TReestr.Create(RemoteServer: TCustomRemoteServer);
var
PropList: PPropList;
i, count: integer;
TypeKind: TTypeKind;
begin
inherited Create;
cds:=TClientDataSet.Create(nil);
cds.RemoteServer:=RemoteServer;
cds.ProviderName:="pr";
cds.Active:=false;
count:=GetPropList(self, PropList);
for i:=0 to count-1 do begin
TypeKind:=PropType(self, PropList[i].Name);
if TypeKind=tkClass then
if GetObjectPropClass(PropList[i]).InheritsFrom(TReestr) then begin
SetObjectProp(self, PropList[i], XXXXX);
end;
end;
end;



вот не знаю, что должно быть вместо ХХХХХ - так, чтобы для Reestr1 было TReestr1.Create(RemoteServer), а для Reestr2 -TReestr2.Create(RemoteServer)


 
Radionov Alexey   (2003-07-04 10:23) [1]

делай виртуальный конструктор, который перекрываешь у потомков и вместо XXXXX просто идет TReestr1, хотя передавть туда можно любой его потомок. Все вызовется правильно. Собственно, виртуальные конструкторы - одно из фундаментальных решений для функционирования VCL


 
Пубертанец   (2003-07-04 10:48) [2]

Спасибо, хоть кто-то отозвался. Но, честно говоря, я ничего не понял. На примере не можешь показать?


 
Radionov Alexey   (2003-07-04 11:32) [3]

Честно говоря не до конца въехал....
Поэтому в первом вопросе немного нагнал.

Попробуй это. Может, идея прокатит.


type

TReesters = class of TReestr;

var cReestr : TReesters;
begin

if GetObjectPropClass(PropList[i]).InheritsFrom(TReestr) then begin
cReestr := GetObjectPropClassi]);// возможно понадобится приведение типов
SetObjectProp(self, PropList[i], cReestr.Create() );
end;


 
Radionov Alexey   (2003-07-04 11:49) [4]

У меня что-то похожее было:
Знал, что надо создавать потомок одного из классов, но не знал какого именно. Сделал так:

type
TFormClass = Class Of TForm;

Procedure TMainForm.ActivateMDIForm(Var Form; Const cType: TFormClass; _ShowModal: Boolean = false); // cType - передаваемый класс, экземпляр которого надо создать. Как я понял, у тебя он тоже известен. Это GetObjectPropClass(PropList[i])
Begin
If Pointer(Form) = Nil Then
Begin
Pointer(Form) := cType.Create(Self); // Создаем
If _ShowModal Then
TForm(Form).ShowModal
Else
TForm(Form).Show;
End
Else
TForm(Form).BringToFront;
End;

По мотивам этого я кинул предыдущий пост. Конечно, надо поправить:


type

TReesters = class of TReestr;

var cReestr : TReesters;
begin

if GetObjectPropClass(PropList[i]).InheritsFrom(TReestr) then begin
cReestr := GetObjectPropClass(PropList[i]);// возможно понадобится приведение типов
SetObjectProp(self, PropList[i], cReestr.Create() );
end;
end;


 
Юрий Зотов   (2003-07-04 11:55) [5]

Реализуется все это проще, без всякой RTTI. Но давайте сначала выясним главное - а ЗАЧЕМ создавать в TReestr объекты, которые реально нужны только в TReestr3? Код усложнится, расход памяти увеличится. В чем СМЫСЛ?


 
Пубертанец   (2003-07-04 12:58) [6]

2 Radionov Alexei
>>cReestr := GetObjectPropClass(PropList[i]);// возможно понадобится приведение типов

Вот в этом и вся проблема. Как привести эти типы в данном случае?


2 Юрий Зотов

Никакого лишнего расхода памяти. Ведь объекты типа TReestr создаются только, если в потомках есть public properties nbgf TReestr


 
Radionov Alexey   (2003-07-04 13:25) [7]

>Вот в этом и вся проблема. Как привести эти типы в данном случае?
cReestr := Pointer(GetObjectPropClass(PropList[i]));



 
Пубертанец   (2003-07-04 14:33) [8]

Ну, ты молодец. Работает.

Большое спасибо


 
Radionov Alexey   (2003-07-04 14:39) [9]

>Пубертанец (04.07.03 14:33)
Не за что.
Все-таки стоит продумать структуру классов, имхо здесь так и попахивает некоторой искусственностью.


 
Юрий Зотов   (2003-07-04 15:12) [10]

> Пубертанец (04.07.03 12:58)
> Никакого лишнего расхода памяти.

1. Две ссылки - 8 байт.
2. Лишний код - думаю, порядка сотни байт.

Скажете, ерунда? Может быть. До тех пор, пока не потребуется создать, например, приличный массив таких объектов. Или их список. После этого может оказаться уже и не ерундой.

Вот из таких "мелочей" и состоят все программы. Мелочь тут, мелочь там - бац! а в сумме-то уже и не мелочь получается!

А главное, что Ваша затея просто не нужна. Потому что никакого реального смысла и никакой реальной логики в ней нет. Она просто "притянута за уши". Просто потому, что так захотела левая нога программиста. Кстати, об этом же сказал и Radionov Alexey.

А делаются подобные вещи - например, посмотрите, как создаются колонки у TDBGrid.



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

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

Наверх





Память: 0.47 MB
Время: 0.008 c
14-55736
belousov
2003-07-02 18:06
2003.07.17
Подземный стук ;)


3-55385
oic
2003-06-22 20:28
2003.07.17
Как вставить картинку в БД


14-55730
Centurion
2003-07-02 17:38
2003.07.17
mwEdit


3-55429
Endi
2003-06-22 12:58
2003.07.17
Длинный DBCtrlGrid


14-55779
MBo
2003-06-30 11:57
2003.07.17
О вечном случайном...





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский