Форум: "Основная";
Текущий архив: 2005.10.02;
Скачать: [xml.tar.bz2];
ВнизДинамическое создание форм Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.005 c