Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.10.02;
Скачать: CL | DM;

Вниз

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

 
Max Zyuzin ©   (2005-09-12 10:00) [0]

Добрый день!
У меня 2-а вопроса
1. В приложении при необходимости создаю новую форму, потом ее убиваю
Создаю что то вроде
Application.CreateForm(TBillForm, BillForm);
Удаляю соответсвенно
procedure TBillForm.FormClose(Sender: TObject; var Action: TCloseAction);
begin
...
  Action := caFree;
end;


Смотрю в Task Manager и вижу что занимаемая память не освобождается... почему?

2-й вопрос Перед созданием формы проверяю ее на существование
Что то вроде if BillForm = Nil then ...
Так вот если форма была открыта а потом закрыта, т.е. Action := caFree; Значение BillForm не становится Nil почему?


 
kblc ©   (2005-09-12 10:06) [1]

Короче... нажно после её закрытия писать BillForm:=nil;
А на счёт памяти - не знаю...


 
Max Zyuzin ©   (2005-09-12 10:08) [2]

>kblc ©   (12.09.05 10:06) [1]
И интересно куда это вписывать? У меня форма не модальная...


 
CHES ©   (2005-09-12 10:20) [3]

>Смотрю в Task Manager и вижу что занимаемая память >не освобождается... почему?

1. Возможно утечка памяти.
2.Прочитай статью. Станет понятнео почему так может быть http://www.rsdn.ru/article/Delphi/memmanager.xml#EFBA

>И интересно куда это вписывать? У меня форма не >модальная

А где она у тебя создается? Если при нажатии на кнопку в каком-л окне, то в обработчике TBillForm.FormClose можно слать сообщение этому окну, и по получении его устанавливать BillForm := Nil


 
Dilmo   (2005-09-12 10:28) [4]

Вообще говоря с формами я обычно делаю так:
var
 frm: TMyForm;
begin
 frm := TmyForm.Create(nil);
 try
   //здесь делаешь то что надо
 finally
   frm.Free;
 end;
end;


 
Dilmo   (2005-09-12 10:30) [5]

но это правда для модальных форм подходит


 
CHES ©   (2005-09-12 10:31) [6]

> Dilmo
Ну вообще-то, насколько я понял у автора вопроса, форма как раз немодальная.


 
Max Zyuzin ©   (2005-09-12 10:40) [7]

>CHES ©   (12.09.05 10:20) [3]
Спасибо за ссылку, читаю...

Форма да не модальная.

Порылся в интернете нашел вот такую вот функцию...

function IsFormExists(const FormName : string): Boolean;
var
  i: Integer;
begin
  Result := False;
  for i := Screen.FormCount - 1 DownTo 0 do
    if (Screen.Forms[i].Name = FormName) then
    begin
      Result := True;
      Break;
    end;
end;

Для проверки существования формы... вопрос правда остается открытым почему после Action := caFree ссылка в Nil не превращается


 
CHES ©   (2005-09-12 10:52) [8]

Дык потому, что метод free реализован так:

if Self <> nil then
  Destroy;


То есть экземпляр класса разрушается, а с указателем на него никаких действий не производится.

Если нужно, чтобы указатель на объект, после его разрушения, стал равен nil, используй не Free, а FreeAndNil

Но в твоем случае это не поможет.


 
Плохиш ©   (2005-09-12 10:57) [9]


> Max Zyuzin ©   (12.09.05 10:40) [7]
> Для проверки существования формы... вопрос правда остается
> открытым почему после Action := caFree ссылка в Nil не превращается

Кто-то обещал, что она будет ставится в nil? Если 1000 переменных ссылается на форму, должны все устанавливаться в nil?
Твоя  BillForm является обычной глобальной переменной в программе, созданной средой разработки для чьего-то удобства :-), и форма TBillForm о ней ничего не знает и знать не должна.


 
Max Zyuzin ©   (2005-09-12 11:29) [10]

>Плохиш ©   (12.09.05 10:57) [9] & CHES ©   (12.09.05 10:52) [8]
Спасибо за советы буду разбираться


 
Наиль ©   (2005-09-12 14:11) [11]

Используй [4]. Этот способ под любые формы.
Но прежде, проверь изменение количества форм через Screen.FormCount для своего метода.


 
Anatoly Podgoretsky ©   (2005-09-12 14:27) [12]

Max Zyuzin ©   (12.09.05 11:29) [10]
Способ номер 7 очень качественный, и еще а зачем тебе нужна переменная BillForm, для того чтобы обнулять.



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

Текущий архив: 2005.10.02;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.046 c
1-1126673909
Icemind
2005-09-14 08:58
2005.10.02
Прокрутка формы в среде разаработки


14-1126589798
Jeer
2005-09-13 09:36
2005.10.02
В Новом Орлеане врачи убивали людей


9-1117391938
Cerberus
2005-05-29 22:38
2005.10.02
Собрать команду


1-1125928937
highlander
2005-09-05 18:02
2005.10.02
Работа с сервисами в WinXP


3-1124543918
Dysan
2005-08-20 17:18
2005.10.02
не мог ли бы подсказать почему запрос не работает?