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

Вниз

Как правильно создать и уничтожить форму   Найти похожие ветки 

 
AndrewK   (2002-01-23 09:54) [0]

Добрый день.

Вопрос такой:

Хочу создать динамически форму, которую принудительно внедряю в панель.

Делаю это так.



public

...
frmCurrent : TForm;
procedure ShowForm (aOwner : TPanel);
procedure CloseForm;

...

end;

procedure TfrmMain.ShowForm (aOwner : TPanel);
begin
frmCurrent.Parent := aOwner;
frmCurrent.Show;
end;

procedure TfrmMain.CloseForm;
begin
frmCurrent.Close;
// !!!
// frmCurrent.Free;
// !!!
frmCurrent.Parent := nil;
end;



В коде по месту создания формы вызываю:



procedure TfrmMain.aNewForm(Sender: TObject);
begin
frmCurrent := TForm1.Create(Self);
ShowForm (pnlWork);
end;

procedure TfrmMain.aClose(Sender: TObject);
begin
CloseForm;
end;



Вопрос в следующем. Форма создается и помещается в панель. Там с ней можно работать. Когда я ее закрываю процедурой CloseForm, то возникают проблемы (закоментированные строки). Я не могу удалить созданную мной форму из памяти методом Free. Работает только Close. Насколько я понимаю Close не удаляет сам объект из памяти а только убирает форму с экрана.

Как мне правильно динамически создать форму, внедрить ее в часть экрана (для чего и использую панель), и правильно удалить и с экрана и из памяти компьютера? Может то что я описал делается как-нибудь по другому?

Заранее благодарен всем отликнувшимся.


 
Alx2   (2002-01-23 10:01) [1]

Сильно не вникал, но, что сразу видно из приведенного:
frmCurrent.Close;
// !!!
// frmCurrent.Free;
// !!!
frmCurrent.Parent := nil;

Если мы уничтожаем форму, а потом обращаемся к ее свойству parent, то ничего, кроме проблем не выйдет.


 
Alx2   (2002-01-23 10:09) [2]

Этот вариант работает. Форма "уходит". Только в ShowForm надо проверить, созданна ли frmCurrent.

procedure TfrmMain.CloseForm;
begin
frmCurrent.Free;
end;


 
AndrewK   (2002-01-23 10:18) [3]

Огромное спасибо. Все работает.

С frmCurrent.Parent := nil; малость лопухнулся.

:)



 
Belov   (2002-01-23 10:19) [4]

Поставь в Обработчике Close
Action:=caFree
Можно сделать и так
if Assigned(frmCurrent) then FreeAndNill(frmCurrent)
вроде бы так



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

Форум: "Основная";
Текущий архив: 2002.02.07;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.45 MB
Время: 0.004 c
1-18797
Super_Drive
2002-01-24 16:58
2002.02.07
Проблема с Chart


3-18764
voice
2002-01-13 12:07
2002.02.07
AppendRecord...


3-18718
DrYou
2002-01-10 10:15
2002.02.07
Некорректно работает связь Master/Detail


1-18899
Muskat
2002-01-22 22:57
2002.02.07
Вопросик есть!


1-18870
Анатолий
2002-01-23 06:31
2002.02.07
Chart





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