Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Динамическое создание элемента [D6, WinME]


Sokol ©   (2002-11-29 19:15:00) 

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

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

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

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


Song   (2002-11-29 20:20:00) [1]

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


LongIsland   (2002-11-29 20:18:00) [2]


> Song © (29.11.02 20:12)

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


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

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

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

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

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


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

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

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

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.
Я так понимаю, вопрос исчерпан?


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

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


LongIsland   (2002-11-29 20:03:00) [6]

Нет


Song   (2002-11-29 20:02:00) [7]

Попробуйте:

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

Есть AV?


LongIsland   (2002-11-29 19:59:00) [8]


> Song © (29.11.02 19:53)

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


Song   (2002-11-29 19:53:00) [9]

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

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


LongIsland   (2002-11-29 19:49:00) [10]


> Song © (29.11.02 19:44)

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


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

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


LongIsland   (2002-11-29 19:25:00) [12]


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

????

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


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

Надо так:

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;


Song   (2002-11-29 19:16:00) [14]

Edit.Parent:=Form1;


Наверх

Титульная страница Поиск, карта сайта Написать письмо