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

Вниз

Динамическое создание элемента   Найти похожие ветки 

 
Sokol   (2002-11-29 19:15) [0]

Подскажите пожалуйста. Нужно создать элемент TEdit, которого изначально на форме нет, а потом показать его. Пробовал так:

// глобальные переменные
var
Edit:TEdit;

// потом в OnButtonClick:
procedure TForm1.Button1Click(Sender: TObject);
begin
Edit:=TEdit.Create(Form1);
//или Edit:=TEdit.CreateParented(Form1.Handle);
Edit.Show;
end;

Ничего не происходит


 
Song ©   (2002-11-29 19:16) [1]

Edit.Parent:=Form1;


 
Sergic   (2002-11-29 19:20) [2]

Надо так:

MyForm=class(TMyForm)
private
...
MyEdit:TEdit;
end;

...

procedure TMyForm.MyFormCreat(Sender:TObject);
begin
//self в данном случае это форма
//при этом за уничтожение будет он же и отвечать
MyEdit:=TEdit.Create(self);
//делаешь форму хозяином edit
MyEdit.Parent:=MyForm;
MyEdit.Left:=0;
MyEdit.Top:=0;
..
end;

procedure TMyForm.MeFormDestroy(sender:TObject);
begin
MyEdit.Free;
end;


 
LongIsland ©   (2002-11-29 19:25) [3]


> procedure TMyForm.MeFormDestroy(sender:TObject);
> begin
> MyEdit.Free;
> end;

????

Сам же написал: делаешь форму хозяином edit


 
Song ©   (2002-11-29 19:44) [4]

>>Сам же написал: делаешь форму хозяином edit
Однако это вовсе не препятствует разрушить компонент самостоятельно, даже если это не обязательно делать.


 
LongIsland ©   (2002-11-29 19:49) [5]


> Song © (29.11.02 19:44)

Как ни странно, в этом случае я получал EAccessEviolation


 
Song ©   (2002-11-29 19:53) [6]

Если AOwner=nil Вы должны разрушить компонент в любом случае.
Если владелец определён, Вы можете разрушать, а можете не разрушать - как хотите. В последнем случае компонент будет разрушен при разрушении собственника.
Подробней смотрим - TComponent.Free

AV Вы могли получать только в единственном случае: если Вы разрушали его из его же обработчика.


 
LongIsland ©   (2002-11-29 19:59) [7]


> Song © (29.11.02 19:53)

Если бы это было так, то я бы не писАл. Ситуация была практически идентичная описанной Sergic (29.11.02 19:20). Только использовался TSpeedButton. Или это локальные глюки?


 
Song ©   (2002-11-29 20:02) [8]

Попробуйте:

With TListBox.Create(Self) Do
try
Parent:=Self;
finally
Free;
end;

Есть AV?


 
LongIsland ©   (2002-11-29 20:03) [9]

Нет


 
Sokol   (2002-11-29 20:07) [10]

Большое СПАСИБО


 
Song ©   (2002-11-29 20:12) [11]

Ну так чего ж тогда? :-)

Можем усложнить задачу: (сделаем вложенный объект)

Var Panel:TPanel;
...
Panel:=TPanel.Create(Self); // Здесь можно также и nil - без разницы
try
Panel.Parent:=Self;
With TListBox.Create(Panel) Do
try
Parent:=Panel;
finally
Free; // **
end;
finally
Panel.Free;
end;

Попробуйте убрать строчку с ** и оставить - результат будет тот же.
Если было бы по-Вашему тогда бы мы получили два AV для панели (если AOwner не nil - как в примере) и для TListBox.
Я так понимаю, вопрос исчерпан?


 
Юрий Зотов ©   (2002-11-29 20:17) [12]

AV может возникнуть при необдуманном коде, например:

destructor TForm1.Destroy;
begin
inherited;
Edit1.Free
end;

Я придерживаюсь сдедующего правила (и рекомендую его другим). Если созданный компонент должен оставаться на форме до самого конца ее работы, то пишу Create(Self) и далее ни о чем не беспокоюсь. Если же нет - то удаляю, естественно, ручками. При этом, если создание идет в одном методе, а удаление - в другом, то пишу Create(Self) - чтобы гарантировать освобождение памяти при любых ошибках. А если создание и удаление идет в одном и том же методе, то пишу Create(nil), а далее try-finally. Это и освобождение памяти гарантирует, и от лишних операций избавляет.

Естественно, правил не бывает без исключений. Иногда, например, нужно, чтобы владельцем компонента был какой-то строго определенный компонент, даже не обязательно с этой формы (что позволяет использовать Owner в дополнительных специальных целях). Но это уже исключения и они должны рассматриваться в каждом случае конкретно.


 
LongIsland ©   (2002-11-29 20:18) [13]


> Song © (29.11.02 20:12)

У меня этот вопрос и не возникал:-) Возникало исключение:-) Сейчас не возникает. Объяснить почему - не могу


 
Song ©   (2002-11-29 20:20) [14]

2LongIsland © (29.11.02 20:18)
Вот смотри, здесь уже это всё обсуждалось: http://delphi.mastak.ru/cgi-bin/forum.pl?look=1&id=1038287761&n=0



Страницы: 1 вся ветка

Текущий архив: 2002.12.09;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.024 c
3-27896
tv
2002-11-21 14:17
2002.12.09
Как определить, есть ли запись в таблице при добавлении новой.


1-27993
Тормоззз
2002-11-29 14:34
2002.12.09
Передача строк из DLL в форму


1-28114
DVM
2002-11-28 15:45
2002.12.09
Как узнать, что кнопку мыши в ListView нажали над значком?


7-28304
Lex
2002-10-06 20:38
2002.12.09
Возможно ли выключить/перезагрузить комп по сетке?


1-27986
Андрей Л.
2002-11-29 07:54
2002.12.09
Power Point в Delphi