Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2002.12.09;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.47 MB
Время: 0.01 c
4-28364
Алексей Ким
2002-10-28 17:40
2002.12.09
ws_ex_appwindow


14-28206
Праведник
2002-11-15 22:34
2002.12.09
Звук в Делфи


1-28092
Diogen
2002-11-28 10:19
2002.12.09
Как вызвать диалог выбора каталога ?


14-28251
Линуксоид
2002-11-18 13:08
2002.12.09
Русский шрифт в Linux


8-28143
AD
2002-08-24 03:17
2002.12.09
MP3





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