Главная страница
    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.13 c
1-1083337542
Bim
2004-04-30 19:05
2004.05.16
Помогите советом


7-1081362670
_newver_
2004-04-07 22:31
2004.05.16
как програмно узнать какие программы запущены ....


1-1083061737
IceMaster
2004-04-27 14:28
2004.05.16
Memo


1-1083183959
Михаил
2004-04-29 00:25
2004.05.16
Многомерные динамические массивы


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