Главная страница
    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.46 MB
Время: 0.034 c
9-1073495778
ZAROLF
2004-01-07 20:16
2004.05.16
Как Можно изменить текст в Textout


1-1082810709
^G^
2004-04-24 16:45
2004.05.16
Как выводить значение параметра ключа???(работа с регистром).


8-1078273036
Jaine
2004-03-03 03:17
2004.05.16
Смена иконки (Glyph) на кнопке типа BitBtn or Speedbutton


6-1080647659
SAG
2004-03-30 15:54
2004.05.16
UDPSocket не получает сообщение


14-1083166408
Ega23
2004-04-28 19:33
2004.05.16
Россия - Япония





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