![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Компоненты в run-time [D6, D7, WinME, WinXP]
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.