Форум: "Основная";
Текущий архив: 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.007 c