Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.05.16;
Скачать: CL | DM;

Вниз

Подскажите как правильно делать?   Найти похожие ветки 

 
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;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.027 c
14-1082704706
paul_k
2004-04-23 11:18
2004.05.16
Есть вакансия в Москве


7-1081509708
Zheks
2004-04-09 15:21
2004.05.16
Как без лишних вопросов выключить комп под WinXP?


6-1080576386
***ghost***
2004-03-29 20:06
2004.05.16
Еще один скрипт!


3-1081404801
ev
2004-04-08 10:13
2004.05.16
Как передать текст из edit в SQL запрос?


3-1082535717
Марат
2004-04-21 12:21
2004.05.16
Разбивка текста