Форум: "Основная";
Текущий архив: 2003.05.12;
Скачать: [xml.tar.bz2];
ВнизОсвобождение памяти из под динамически созданной формы Найти похожие ветки
← →
R (2003-04-28 01:28) [0]Здравствуйте.
Сначала пример:
var
Form: TForm;
begin
Form := TForm.Create(Application);
with Form do
try
with TButton.Create(Form) do
begin
Parent := Form;
ModalResult := mrOk ;
end;
if ShowModal = mrOk then
finally
Form.Free;
end;
end;
Вот пример динамически созанной формы с кнопкой
собственно здесь все понятно, но вопрос такой я хочу создать
также форму но не модальную я убираю вот эту часть
if ShowModal = mrOk then
и эту Form.Free;не модальная
форма создается, но как мне теперь сделать
Form.Free, т.е. в какой части программы, одно условие что при закрытии этой формы память должна быть высвобождена.
← →
R (2003-04-28 02:03) [1]Да забыл вместо if ShowModal = mrOk пишу Form.Show
← →
Ну (2003-04-28 02:03) [2]Можно на OnClose формы Form повесить Action:=caFree.
Из хелпа:
"caFree The form is closed and all allocated memory for the form is free"
← →
R (2003-04-28 02:32) [3]Если перевести
caFree Форма закрыт и вся размещенная память для формы - свободная - это точно освобождение памяти, а не проверка
← →
Chlavik (2003-04-28 02:40) [4]Ну полюбому Action:=caFree ... Это самый простой вариант......
← →
R (2003-04-28 02:53) [5]Да с освобождением разобрался а вот закрыть это окно
по клику кнопки как лучше я делаю так
procedure TForm1.Button1Click(Sender: TObject);//создаю
var
Form: TForm;
Button:TButton;
begin
Form := TForm.Create(Application);
with Form do
try
Caption:="1";
Button:= TButton.Create(Form);
with Button do
begin
Parent := Form;
ModalResult := mrOk ;
end;
Form.OnClose:= qOnClose;
Button.OnClick:=qOnClick;
Form.Show;
finally
end;
end;
я закрываю так:
procedure TForm1.qOnClick(Sender: TObject);
begin
SendMessage(FindWindow("TForm","1"),WM_Close,0,0)
end;
procedure TForm1.qOnClose(Sender: TObject; var Action: TCloseAction);
begin
Action:= caFree;//освобождаю память
end;
← →
R (2003-04-28 03:15) [6]Есть еще такой вариант закрытия
procedure TForm1.qOnClick(Sender: TObject);
begin
Screen.ActiveForm.Close
end;
Мастера а что вы посоветуете, по моему оба приведенных выше
мною варианта не правильны.
← →
Ну (2003-04-28 03:28) [7]раз уж так, то стоит объявить переменную Form: TForm - как глобальную.
И тогда уже не нужно ни "FindWindow" ни "ActiveForm".
← →
R (2003-04-28 03:37) [8]Да я тоже так предполагаю что без глобальной переменной не обойтись, хотя стремлюсь их не использовать(уж больно их накапливается много).
← →
Sergey Masloff (2003-04-28 04:05) [9]procedure TForm1.qOnClick(Sender: TObject);
begin
// Это на фиг: SendMessage(FindWindow("TForm","1"),WM_Close,0,0)
Close();
end;
Внутри обработчика известно к какому экземпляру класса он применяется.
← →
R (2003-04-28 04:29) [10]>Sergey Masloff
А можно подробнее, ведь Close без параметров.
← →
Sergey Masloff (2003-04-28 07:27) [11]R
>ведь Close без параметров
тогда Close;
на самлм деле я на C тоже пишу и иногда скобки после функции
ставлю на автомате. Кстати иногда в чем-то и удобнее, сразу видно что это функция а не переменная. Например MyVar := Date();
← →
ErikIvanov (2003-04-28 14:38) [12]На самом деле в поцедуру procedure TForm1.qOnClick
передается неявный параметр Self это сылку на класс!
Self.Close; - тоже самое.
← →
Sergey Masloff (2003-04-28 14:43) [13]>Self это сылку на класс!
Все же не на класс, а на конкретный экземпляр оного ;-)
← →
evvcom (2003-04-28 14:58) [14]В методы объекта передается Self - ссылка на объект (экземпляр класса), в методы класса Self - ссылка на класс.
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2003.05.12;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.006 c