Текущий архив: 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.47 MB
Время: 0.007 c