![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Динамическое создание форм [D7, WinXP]
Max Zyuzin © (2005-09-12 10:00:00)Добрый день!
У меня 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 почему?
Anatoly Podgoretsky (2005-09-12 14:27:00) [1]Max Zyuzin © (12.09.05 11:29) [10]
Способ номер 7 очень качественный, и еще а зачем тебе нужна переменная BillForm, для того чтобы обнулять.
Наиль (2005-09-12 14:11:00) [2]Используй [4]. Этот способ под любые формы.
Но прежде, проверь изменение количества форм через Screen.FormCount для своего метода.
Max Zyuzin (2005-09-12 11:29:00) [3]>Плохиш © (12.09.05 10:57) [9] & CHES © (12.09.05 10:52) [8]
Спасибо за советы буду разбираться
Плохиш (2005-09-12 10:57:00) [4]
> Max Zyuzin © (12.09.05 10:40) [7]
> Для проверки существования формы... вопрос правда остается
> открытым почему после Action := caFree ссылка в Nil не превращается
Кто-то обещал, что она будет ставится в nil? Если 1000 переменных ссылается на форму, должны все устанавливаться в nil?
Твоя BillFormявляется обычной глобальной переменной в программе, созданной средой разработки для чьего-то удобства :-), и форма TBillFormо ней ничего не знает и знать не должна.
CHES (2005-09-12 10:52:00) [5]Дык потому, что метод free реализован так:
if Self <> nil then
Destroy;
То есть экземпляр класса разрушается, а с указателем на него никаких действий не производится.
Если нужно, чтобы указатель на объект, после его разрушения, стал равен nil, используй не Free, а FreeAndNil
Но в твоем случае это не поможет.
Max Zyuzin (2005-09-12 10:40:00) [6]>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:31:00) [7]> Dilmo
Ну вообще-то, насколько я понял у автора вопроса, форма как раз немодальная.
Dilmo (2005-09-12 10:30:00) [8]но это правда для модальных форм подходит
Dilmo (2005-09-12 10:28:00) [9]Вообще говоря с формами я обычно делаю так:
var
frm: TMyForm;
begin
frm := TmyForm.Create(nil);
try
//здесь делаешь то что надо
finally
frm.Free;
end;
end;
CHES (2005-09-12 10:20:00) [10]>Смотрю в Task Manager и вижу что занимаемая память >не освобождается... почему?
1. Возможно утечка памяти.
2.Прочитай статью. Станет понятнео почему так может быть http://www.rsdn.ru/article/Delphi/memmanager.xml#EFBA
>И интересно куда это вписывать? У меня форма не >модальная
А где она у тебя создается? Если при нажатии на кнопку в каком-л окне, то в обработчике TBillForm.FormClose можно слать сообщение этому окну, и по получении его устанавливать BillForm := Nil
Max Zyuzin (2005-09-12 10:08:00) [11]>kblc © (12.09.05 10:06) [1]
И интересно куда это вписывать? У меня форма не модальная...
kblc (2005-09-12 10:06:00) [12]Короче... нажно после её закрытия писать BillForm:=nil;
А на счёт памяти - не знаю...