Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Компоненты в run-time [D6, D7, WinME, WinXP]


Страницы:   1 2

pOLyMOrpH ©   (2005-08-04 02:03:00) 

доброго времени суток! ситуация следующая: в run-time нужно создать TPanel и  TButton (родитель - созданный TPanel). По нажатию на созданный TButton оба компонента должны уничтожиться.
Жду ваших предложений.


pOLyMOrpH   (2005-08-05 03:08:00) [1]

Всем огромнейшее спасибо за проявленное внимание и советы! Все работает.


evvcom   (2005-08-04 10:11:00) [2]


> ЮЮ ©   (04.08.05 09:55) [21]

Ладно, не придирайся. Исходные условия не описаны или даны слишком мутно, чтобы делать какие-то конкретные выводы. :)


ЮЮ   (2005-08-04 09:55:00) [3]

в [3] - юнит с описанием классов, последний вопрос же об использовании классов

автор [6] не автор ветки, к тому же это ответ на первый вопрос ветки, да уде и там два модуля имеют место


evvcom   (2005-08-04 09:51:00) [4]


> если этот код в том же иодуле

Ну да. А по поводу вероятности - [3] и [6] намекают на обратное.


ЮЮ   (2005-08-04 09:20:00) [5]

>Можно и без свойства: FMyClass1.FMyClass2.Left := 5;

если этот код в том же иодуле, что и TMyClass1, что маловероятно


evvcom   (2005-08-04 08:52:00) [6]

Можно и без свойства: FMyClass1.FMyClass2.Left := 5;


ЮЮ   (2005-08-04 08:45:00) [7]

чтобы уничтожил, нало или в деструкторе явно уничтожать
FMyClass2.Free;
, или
FMyClass2 := Tmyclass2.Create( Self);


pOLyMOrpH   (2005-08-04 08:42:00) [8]


> ЮЮ

да мне тут в чате это же посоветовали


pOLyMOrpH   (2005-08-04 08:40:00) [9]

...
constructor Tmyclass1.Create(AOwner: TComponent);
begin
inherited;
FMyClass2 := Tmyclass2.Create(nil);
FMyClass2.Parent := Self;
end;
...

...
var
FMyClass1: Tmyclass1;
begin
FMyClass1 := Tmyclass1.Create(self);
FMyClass1.Parent := Self;
// тут надо поменять свойство FMyClass2
end;

а деструктор обязательно юзать если FMyClass1 при уничтожении уничтожит и FMyClass2 ???


ЮЮ   (2005-08-04 08:39:00) [10]

Tmyclass 1.Create
...
FMyClass2: Tmyclass 2;
...
FMyClass2 := Tmyclass.Create(self);

Реальный код показать, конечно, тяжедо. Лучше всякую ерунду писать.

Опубликуй св-во и использууй:

Tmyclass1 = class
 ...
public
 property MyClass2: TMyClass2 read FMyClass2;
end;

FMyClass1 := Tmyclass1.Create(self);
FMyClass1.MyClass2.Left := 5;


evvcom   (2005-08-04 08:36:00) [11]


> делаю так:

Конструктор показал, теперь деструктор покажи.

> FMyClass2 := Tmyclass.Create(self);

Что такое Tmyclass?

> // тут надо поменять свойство FMyClass2

Ну и меняй FMyClass2.свойство := ...


evvcom   (2005-08-04 08:36:00) [12]


> то есть создаю FMyClass1 (опечатка)

Где?


pOLyMOrpH   (2005-08-04 08:33:00) [13]

то есть создаю FMyClass1 (опечатка)


pOLyMOrpH   (2005-08-04 08:30:00) [14]

делаю так:


...
constructor Tmyclass1.Create(AOwner: TComponent);
begin
 inherited;
 FMyClass2 := Tmyclass2.Create(nil);
 FMyClass2.Parent := Self;
end;
...


это находится в отдельном юните.

дальше по Form1.Create(...) создаю:


...
var
 FMyClass2: Tmyclass2;
begin
 FMyClass2 := Tmyclass.Create(self);
 FMyClass2.Parent := Self;
 // тут надо поменять свойство FMyClass2
end;


как это сделать?


evvcom   (2005-08-04 08:28:00) [15]


> как получить доступ к компонентам на родителе?

Parent.Controls[i]


pOLyMOrpH   (2005-08-04 06:11:00) [16]

+ во время создания родителя (код выше)


pOLyMOrpH   (2005-08-04 06:05:00) [17]

еще один вопросик по сабжу к мастерам:
как получить доступ к компонентам на родителе? (менять их свойства)


Джо   (2005-08-04 04:41:00) [18]

То есть, примерно, так:

unit Unit2;

interface
uses SysUtils, Classes, Controls;

type
 Tmyclass2 = class; // опережающая ссылка, нужна для компилятора

 Tmyclass1 = class(TcustomControl)
 private
   FMyClass2: TMyClass2;
 public
   constructor Create(AOwner: TComponent); override;
   destructor Destroy; override;
 end;

 Tmyclass2 = class(TcustomControl)
 private
 public
 end;

implementation

{ Tmyclass1 }

constructor Tmyclass1.Create(AOwner: TComponent);
begin
 inherited;
 // владельца у создаваемого экземпляра не задаем,
 // поэтому, его в дальнейнем нужно будет "убить" вручную
 FMyClass2 := Tmyclass2.Create( nil);
 FMyClass2.Parent := Self;
end;

destructor Tmyclass1.Destroy;
begin
 // при собственном удалении, "убиваем" и созданный в конструкторе
 // экземпляр TMyClass2
 FMyClass2.Free;
 inherited;
end;

end.

---
Или так, если задавать владельца:

unit Unit3;

interface
uses SysUtils, Classes, Controls;

type
 Tmyclass2 = class; // опережающая ссылка, нужна для компилятора

 Tmyclass1 = class(TcustomControl)
 private
   FMyClass2: TMyClass2;
 public
   constructor Create(AOwner: TComponent); override;
 end;

 Tmyclass2 = class(TcustomControl)
 private
 public
 end;

implementation

{ Tmyclass1 }

constructor Tmyclass1.Create(AOwner: TComponent);
begin
 inherited;
 // мы будем являться владельцем для создаваемого экземпляра TMyClass2
 // При нашем уничтожении, все, созданное нами будет уничтожено
 // автоматически.
 // Поэтому, удалять созданный экземпляр в нашем деструкторе не нужно.
 FMyClass2 := Tmyclass2.Create( Self);
 FMyClass2.Parent := Self;
end;

end.


Джо   (2005-08-04 04:27:00) [19]

Ггм... Ты ссылку на экземпляр TMyClass2 сохраняй в приватном поле класса TMyClass1, а в деструкторе делай ей .Free. А то у тебя получается, что Owner'а у нее нет (при создании делаешь Tmyclass2.Create( nil)) и экземпляр созданного объекта уничтожен не будет. Утечка.


Джо   (2005-08-04 04:24:00) [20]

Parent := Self.


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо