Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.08.28;
Скачать: CL | DM;

Вниз

Компоненты в 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;
Скачать: CL | DM;

Наверх




Память: 0.52 MB
Время: 0.037 c
14-1122974932
Ajax
2005-08-02 13:28
2005.08.28
beat detection algorithms


8-1113660186
Fedor
2005-04-16 18:03
2005.08.28
MotionDetector и DSPack


8-1113978635
SilenBlock
2005-04-20 10:30
2005.08.28
Помогите исправить ошибку в тексте!


14-1123166938
lookin
2005-08-04 18:48
2005.08.28
Музыкальный стиль


4-1117006096
msd
2005-05-25 11:28
2005.08.28
COM порт