Форум: "Потрепаться";
Текущий архив: 2004.05.16;
Скачать: [xml.tar.bz2];
ВнизПодскажите как правильно делать? Найти похожие ветки
← →
SergP © (2004-04-22 19:22) [0]Допустим TClass1 и TClass2 некоторые классы. Хочу сделать свой класс, чтобы при создании объекта этого класса создавался как бы два объекта один в другом...
type
TMyClass = class(TClass1)
A:TClass2;
Constructor Create(AOwner:TComponent);
Procedure Free;
...
end;
...
implementation
...
Constructor TMyClass.Create(AOwner:TComponent);
begin
inherited create(AOwner);
A := TClass2.Create(AOwner);
A.Parent := ... // Как мне установить parent ?
end;
Пробовал так:
Constructor TMyСlass.Create(AOwner:TComponent);
var
P:TMyClass;
begin
P := inherited create(AOwner);
A := TClass2.Create(AOwner);
A.Parent := P;
end;
Вроде все работает, но правильно ли это? (Что-то оно мне не нравится, поэтому и неуверен)
И еще:
Почему компилятор мне выдает Варнинг:
[Warning] Unit1.pas(27): Method "Create" hides virtual method of base type ....? Что ему не нравится?
← →
Reindeer Moss Eater © (2004-04-22 19:25) [1]Ему не нравится отсутствие директивы override в объявлении конструктора.
Точнее ему пофик, он просто предупреждает.
← →
Тимохов © (2004-04-22 19:26) [2]
> [Warning] Unit1.pas(27): Method "Create" hides virtual method
> of base type ....? Что ему не нравится?
На это можно забить в зависимости от того что такое tclass1 и зачем вы лишаете конструктор виртуальности. Если вы это делаете сознательно, то напишиет reintrouduce после конструктора.
> Constructor TMyClass.Create(AOwner:TComponent);
> begin
> inherited create(AOwner);
> A := TClass2.Create(AOwner);
> A.Parent := ... // Как мне установить parent ?
> end;
написать self
← →
Тимохов © (2004-04-22 19:28) [3]
> Constructor TMyСlass.Create(AOwner:TComponent);
> var
> P:TMyClass;
> begin
> P := inherited create(AOwner);
> A := TClass2.Create(AOwner);
> A.Parent := P;
> end;
это нафиг
делайте первый вариант, только self после := напишите.
← →
SergP © (2004-04-22 19:39) [4]Тимохов © (22.04.04 19:26) [2]
Понял. Спасибо.. Просто я как-то забыл про self...
← →
SergP © (2004-04-22 21:54) [5]Кстати еще есть 2 вопроса:
1. Я написал конструктор так:
Constructor TMyClass.Create(AOwner:TComponent);
begin
inherited create(AOwner);
A := TClass2.Create(AOwner);
A.Parent := self;
end;
А если напишу так:
Constructor TMyClass.Create(AOwner:TComponent);
begin
inherited create(AOwner);
A := TClass2.Create(self);
A.Parent := self;
end;
то могу ли я в таком случае не перекрывать метод free?
2. Допустим у меня есть объект класса TMyClass (назовем его MyObject), то если я буду использовать у объекта моего класса event"ы которые имелись в Tclass2, то при передаче процедуре-обработчику Sender"а, кто будет этим Sender"ом - MyObject или MyObject.A ?
← →
Юрий Зотов © (2004-04-22 22:37) [6]> SergP © (22.04.04 21:54) [5]
1. Оба класса - компоненты, поэтому можете и не перекрывать (при унчтожении владельца A уничтожится автоматически). Только не Free, а деструктор. Free вообще никогда перерывать не надо.
2. Если ничего не переопределять, то Sender"ом будет компонент, реально возбудивший событие. Но дело в том, что для использования во внешнем компоненте событий внутреннего компонента, Вам придется вытаскивать их наружу. При этом Вы имеете возможность переопределить Sender"а как Вам нравится.
← →
SergP © (2004-04-22 22:59) [7]>2. Если ничего не переопределять, то Sender"ом будет компонент, реально
>возбудивший событие. Но дело в том, что для использования во внешнем
>компоненте событий внутреннего компонента, Вам придется вытаскивать их
>наружу. При этом Вы имеете возможность переопределить Sender"а как Вам
>нравится.
Т.е я так понял что если я назначу обработчик события таким образом:
...
MyObject:=TMyClass.create(self);
MyObject.A.OnMyEvent:=MyEvent;
...
То в обработчике:
procedure MyEvent(Sender:TObject);
begin
...
sender будет указывать на MyObject.A ?
>Вам придется вытаскивать их наружу. При этом Вы имеете возможность
>переопределить Sender"а как Вам нравится.
Не совсем понятно. Можно подробнее?
← →
SergP © (2004-04-23 11:29) [8]up
Страницы: 1 вся ветка
Форум: "Потрепаться";
Текущий архив: 2004.05.16;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.035 c