Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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.004 c
1-1126031771
Дмитрий_05
2005-09-06 22:36
2005.10.02
Создать кнопку TabbedNotebook


1-1126172991
ashnurov
2005-09-08 13:49
2005.10.02
XComDrv


1-1126370669
Still Swamp
2005-09-10 20:44
2005.10.02
Как пояснить Excel что мне не надо сохранять файл?


1-1126287500
Pavel__
2005-09-09 21:38
2005.10.02
А что представляет из себя переменная типа string


1-1126172544
Makcim
2005-09-08 13:42
2005.10.02
атрибуты файла





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