Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Потрепаться";
Текущий архив: 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.032 c
9-1071409745
ZAROLF
2003-12-14 16:49
2004.05.16
Нужен совет к 2D аркаде!


3-1082371256
Vit
2004-04-19 14:40
2004.05.16
Подскажите пожалуйста.


1-1083254115
van20
2004-04-29 19:55
2004.05.16
RxLib для Delphi7


3-1082103212
RavenD
2004-04-16 12:13
2004.05.16
Как поменять кодировку?


1-1083207568
Артем К.
2004-04-29 06:59
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
Английский Французский Немецкий Итальянский Португальский Русский Испанский