Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
3-1121348982
Uran
2005-07-14 17:49
2005.08.28
Номер недели в ADO


4-1120456317
Kerk
2005-07-04 09:51
2005.08.28
keybd_event - CTRL+C


9-1115123072
Aleksej Kaminsky
2005-05-03 16:24
2005.08.28
удаленная работа по моделированию low-poly


4-1121162964
Nikon
2005-07-12 14:09
2005.08.28
работа с клавиатурой


1-1123106623
pOLyMOrpH
2005-08-04 02:03
2005.08.28
Компоненты в run-time





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский