Форум: "Основная";
Текущий архив: 2005.08.28;
Скачать: [xml.tar.bz2];
ВнизКомпоненты в run-time Найти похожие ветки
← →
pOLyMOrpH © (2005-08-04 02:03) [0]доброго времени суток! ситуация следующая: в run-time нужно создать TPanel и TButton (родитель - созданный TPanel). По нажатию на созданный TButton оба компонента должны уничтожиться.
Жду ваших предложений.
← →
Джо © (2005-08-04 02:39) [1]
> pOLyMOrpH © (04.08.05 02:03)
Пустая форма с кодом:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls;
const
WM_DESTROY_CONTROLS = WM_USER + 2005;
type
TForm1 = class(TForm)
procedure FormCreate(Sender: TObject);
private
FBtn: TButton;
FPanel: TPanel;
procedure OnBtnClick(Sender: TObject);
procedure CreateControls;
procedure WmDestroyControls (var Message: TMessage);
message WM_DESTROY_CONTROLS;
public
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.CreateControls;
begin
FPanel := TPanel.Create (Self);
FPanel.Parent := Self;
FBtn := TButton.Create(FPanel);
FBtn.Parent := FPanel;
FBtn.OnClick := OnBtnClick;
end;
procedure TForm1.OnBtnClick(Sender: TObject);
begin
PostMessage (Handle,WM_DESTROY_CONTROLS,0,0)
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
CreateControls
end;
procedure TForm1.WmDestroyControls(var Message: TMessage);
begin
if Assigned(FPanel) then
FreeAndNil (FPanel)
end;
end.
> Жду ваших предложений.
Не майся ерундой.
← →
pOLyMOrpH © (2005-08-04 04:05) [2]огромнейшее спасибо.
← →
pOLyMOrpH © (2005-08-04 04:22) [3]у меня еще один вопрос к уважаемым мастерам:
пример
...
type
Tmyclass1 = class(TcustomControl)
private
...
public
constructor Create(AOwner: TComponent); override;
...
end;
Tmyclass2 = class(TcustomControl)
private
...
public
constructor Create(AOwner: TComponent); override;
...
end;
...
{ можно ли сделать так: ?}
constructor Tmyclass1.Create(AOwner: TComponent);
var
my:Tmyclass2;
begin
inherited Create(AOwner);
...
my := Tmyclass2.Create(nil);
with my do
begin
...
...
Parent := ... тоже не знаю как сделать чтоб родителем был создаваемый
компонент класса Tmyclass1 ...
end;
end;
Если написанный выше код не является полнейшим бредом (я не силен в ооп) то мне необходимы ваши советы по его реализации.
← →
Джо © (2005-08-04 04:24) [4]Parent := Self.
← →
Джо © (2005-08-04 04:27) [5]Ггм... Ты ссылку на экземпляр TMyClass2 сохраняй в приватном поле класса TMyClass1, а в деструкторе делай ей .Free. А то у тебя получается, что Owner"а у нее нет (при создании делаешь Tmyclass2.Create(nil)) и экземпляр созданного объекта уничтожен не будет. Утечка.
← →
Джо © (2005-08-04 04:41) [6]То есть, примерно, так:
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.
← →
pOLyMOrpH © (2005-08-04 06:05) [7]еще один вопросик по сабжу к мастерам:
как получить доступ к компонентам на родителе? (менять их свойства)
← →
pOLyMOrpH © (2005-08-04 06:11) [8]+ во время создания родителя (код выше)
← →
evvcom © (2005-08-04 08:28) [9]
> как получить доступ к компонентам на родителе?
Parent.Controls[i]
← →
pOLyMOrpH © (2005-08-04 08:30) [10]делаю так:
...
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;
как это сделать?
← →
pOLyMOrpH © (2005-08-04 08:33) [11]то есть создаю FMyClass1 (опечатка)
← →
evvcom © (2005-08-04 08:36) [12]
> делаю так:
Конструктор показал, теперь деструктор покажи.
> FMyClass2 := Tmyclass.Create(self);
Что такое Tmyclass?
> // тут надо поменять свойство FMyClass2
Ну и меняй FMyClass2.свойство := ...
← →
evvcom © (2005-08-04 08:36) [13]
> то есть создаю FMyClass1 (опечатка)
Где?
← →
ЮЮ © (2005-08-04 08:39) [14]Tmyclass1.Create
...
FMyClass2: Tmyclass2;
...
FMyClass2 := Tmyclass.Create(self);
Реальный код показать, конечно, тяжедо. Лучше всякую ерунду писать.
Опубликуй св-во и использууй:
Tmyclass1 = class
...
public
property MyClass2: TMyClass2 read FMyClass2;
end;
FMyClass1 := Tmyclass1.Create(self);
FMyClass1.MyClass2.Left := 5;
← →
pOLyMOrpH © (2005-08-04 08:40) [15]...
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 ???
← →
pOLyMOrpH © (2005-08-04 08:42) [16]
> ЮЮ
да мне тут в чате это же посоветовали
← →
ЮЮ © (2005-08-04 08:45) [17]чтобы уничтожил, нало или в деструкторе явно уничтожать
FMyClass2.Free;
, или
FMyClass2 := Tmyclass2.Create(Self);
← →
evvcom © (2005-08-04 08:52) [18]Можно и без свойства: FMyClass1.FMyClass2.Left := 5;
← →
ЮЮ © (2005-08-04 09:20) [19]>Можно и без свойства: FMyClass1.FMyClass2.Left := 5;
если этот код в том же иодуле, что и TMyClass1, что маловероятно
← →
evvcom © (2005-08-04 09:51) [20]
> если этот код в том же иодуле
Ну да. А по поводу вероятности - [3] и [6] намекают на обратное.
← →
ЮЮ © (2005-08-04 09:55) [21]в [3] - юнит с описанием классов, последний вопрос же об использовании классов
автор [6] не автор ветки, к тому же это ответ на первый вопрос ветки, да уде и там два модуля имеют место
← →
evvcom © (2005-08-04 10:11) [22]
> ЮЮ © (04.08.05 09:55) [21]
Ладно, не придирайся. Исходные условия не описаны или даны слишком мутно, чтобы делать какие-то конкретные выводы. :)
← →
pOLyMOrpH © (2005-08-05 03:08) [23]Всем огромнейшее спасибо за проявленное внимание и советы! Все работает.
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2005.08.28;
Скачать: [xml.tar.bz2];
Память: 0.51 MB
Время: 0.058 c