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

Вниз

Освобождение памяти   Найти похожие ветки 

 
kat   (2003-02-26 14:37) [0]

Здравсвуйте, уважаемые мастаки!
Если я Close формы делаю и указываю, что Action := caFree , должна же эта форма удалиться из памяти? и все ее элементы тоже?


 
Digitman ©   (2003-02-26 14:48) [1]

да


 
Roma ©   (2003-02-26 15:02) [2]

>kat (26.02.03 14:37)

А вот насчет ее элементов - если они созданы в runtime и Owner им указан не эта форма, то не удалятся... Не хотелось бы запутывать человека, но возможен (хотя, в данном случае, маловероятен) и такой случай...


 
Anatoly Podgoretsky ©   (2003-02-26 15:06) [3]

В общем случае ДА, в частном что угодно.


 
kat   (2003-02-26 15:19) [4]

При нажатие на кнопку создаю и показываю 2-ую форму.+
Все компоненты созданы во время разработки, так что владелец у них есть. При создание формы создаются несколько TstringList - ов, их при закрытие формы я тоже делаю Free.
Так почему же занимаемая приложением память растет?


 
han_malign ©   (2003-02-26 15:27) [5]

Вероятно из-за фрагментации памяти, и боюсь это не лечится, сборки мусора в Delphi нет...
The GlobalCompact function is obsolete. This function is provided only for compatibility with 16-bit versions of Windows. It has no meaning in the 32-bit environment. - а в придачу еще и свой менеджер кучи...


 
kat   (2003-02-26 15:37) [6]

спасибо за ответы:)))
но не может же мое приложение, съедать всю память (64) компа и вызывать синий экранчик и закрываться?




 
Roma ©   (2003-02-26 15:42) [7]

;))) Может... ;))) На Delphi - все можно... ;)))

PS: nothing personal


 
kat   (2003-02-26 15:47) [8]

Roma © (26.02.03 15:42)
спасибо за оптимизм:))))


 
Anatoly Podgoretsky ©   (2003-02-26 16:00) [9]

kat (26.02.03 15:19)
Где ты им делаешь Free?
Но наверно у тебя все таки где то есть ошибка.


 
kat   (2003-02-26 16:18) [10]

сделала простой пример
по кнопке на форме
Application.CreateForm(TForm2, Form2);
Form2.Show;
Form1.Hide;

unit Unit2;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
ExtCtrls, TeeProcs, TeEngine, Chart, AppEvnts, Menus, StdCtrls;
type
TForm2 = class(TForm)
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure FormShow(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form2: TForm2;
a:TStringList;
implementation
uses Unit1;
{$R *.DFM}
procedure TForm2.FormClose(Sender: TObject; var Action: TCloseAction);
begin
a.Free;
Action := caFree;
Form1.Show;
end;
procedure TForm2.FormShow(Sender: TObject);
var i:integer;
begin
a := TStringList.Create;
for i:=1 to 100 do
a.Add("111");
end;
end.
Так вот если вызывать и закрывать 2-ую форму, память приложения растет. Почему?


 
Roma ©   (2003-02-26 16:28) [11]

А зачем a: TStringList вынесен из класса, если он нигде, кроме как в классе, не используется?... И почему он инициализируется в FormShow? Надо в FormCreate... Скорее всего, ошибка в этом...

FormCreate, FormClose - в жизни формы бывают только раз... FormShow, FormCloseQuery - сколько угодно раз (может, и не одного)...


 
Sheriff   (2003-02-26 16:56) [12]

Application.CreateForm(TForm2, Form2);
try
Form1.Hide;
Form2.ShowModal;
finally
Form2.Hide;
Form1.Show;
Form2.Free;
end;

procedure TForm2.FormClose(Sender: TObject; var Action: TCloseAction);
begin
a.Free;
Action := caFree;
end;

procedure TForm2.FormCreate(Sender: TObject);
var i:integer;
begin
a := TStringList.Create;
for i:=1 to 100 do a.Add("111");
end;


 
Романов Р.В. ©   (2003-02-26 17:11) [13]

Создавай StringList в FormCreate и удаляй в FormDestroy


 
Mike_Goblin ©   (2003-02-26 19:01) [14]

Roma ©
>А вот насчет ее элементов - если они созданы в runtime и Owner >им указан не эта форма, то не удалятся
Если Owner не форма, то компоненты не ее :))). За их удаление и должен отвечать Owner
Для наследников TControl если задан Parent - форма, то они будут удалены даже, если Owner не форма


 
Roma ©   (2003-02-26 19:08) [15]

> Mike_Goblin © (26.02.03 19:01)
Если Owner не форма, то компоненты не ее :)))


Логично, черт побери... ;)))

Для наследников TControl если задан Parent - форма, то они будут удалены даже, если Owner не форма

Понял... Что, в общем-то, тоже совершенно логично... ;) Черт побери... ;)))


 
kat   (2003-02-27 14:47) [16]

при работе с моим приложения периодически возникает синий экранчик с "Неустранимая ошибка OE по адресу 0028:С02Ф0948 в VXD VWIN32(05)+000012D0. Приложение будет снято." и еще стандартные строчки синенького экранчика. 98 Windows. При этом я смотрю Memloader -ом, что память занимаемая приложением не растет, но свободная память винды все уменьшается и уменьшается.
Скажите это ошибка моего приложения или все-таки винда виновата, не очищает кеш?
Когда я работала в 98 Windows, я за день перегружалась несколько раз, из-за того что память у него куда-то утекала.


 
Smashish   (2003-02-27 15:04) [17]

в коде ошибка


 
Anatoly Podgoretsky ©   (2003-02-27 15:07) [18]

kat (26.02.03 15:37)
Может конечно, но не 64 конечно, а много больше. Да и врядли это съедание, это серьезнее.

kat (26.02.03 16:18)
сделала простой пример

var
Form2: TForm2;
a:TStringList;

Так как Form2 и a:TStringList у тебя глобальные то может быть все, как избавиться от глобальности TStringList тебе указали, а от глобальности Form2 можно избавиться так:

TForm2.Create().Show;

Эту строчку совсем удалить. Form2: TForm2;

И естественно создание и удаление всех объектов TForm делать в конструкторе и деструкторе.
То есть попробуй примерно так:

Application.CreateForm(TForm2, Form2);
Form1.Hide;
TForm2.Create(Self).Show;

unit Unit2;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
ExtCtrls, TeeProcs, TeEngine, Chart, AppEvnts, Menus, StdCtrls;
type
TForm2 = class(TForm)
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure FormShow(Sender: TObject);
private
a:TStringList;
end;

implementation
uses Unit1;
{$R *.DFM}

procedure TForm2.FormCreate(Sender: TObject);
var i:integer;
begin
a := TStringList.Create;
for i:=1 to 100 do
a.Add("111");
end;

procedure TForm2.FormClose(Sender: TObject; var Action: TCloseAction);
begin
a.Free;
Action := caFree;
Form1.Show;
end;

end.


 
Anatoly Podgoretsky ©   (2003-02-27 15:09) [19]

Я не проверял в Дельфи, но возможно эту строчку потребуетеся TForm2.Create(Self).Show; заменить на with (TForm2.Create(Self) Show;


 
kat   (2003-02-27 16:07) [20]

Anatoly Podgoretsky ©
спасибо:))
получается что глобальные переменные лучше не использовать?
но от Form2: TForm2 я пока не готова отказаться, если мне надо что-то в форму передать (заголовок, сделать некоторые кнопочки активными/неактивными), то как быть?
TForm2.Create(Self).Show; так создасться и сразу покажется

Если я в в FormClose Action присваиваю caFree
..............
var
Form2:TForm2;
.................
procedure TForm2.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Action := caFree;
Form1.Show;
end;
а в первой форме на кнопку
Application.CreateForm(TForm2, Form2);
Form1.Hide;
Form2.ShowModal;
Form2.Free; - !!!!!!!!здесь не должен возникать except???? ведь форма должна быть уничтожена




 
Smashich ©   (2003-02-27 16:42) [21]

2 Kat
Form2.Free; - !!!!!!!!здесь не должен возникать except???? ведь форма должна быть уничтожена

Free вызывает деструктор только если сам обьект существует
procedure TObject.Free;
begin
if Self <> nil then
Destroy;
end;


 
Roma ©   (2003-02-27 16:44) [22]

>kat (27.02.03 16:07)

получается что глобальные переменные лучше не использовать?


Да. Тем более, когда это ничем не обосновано...

если мне надо что-то в форму передать (заголовок, сделать некоторые кнопочки активными/неактивными), то как быть?

Вот после того как ты ее создала:
Application.CreateForm(TForm2, Form2);
и до того, как показала, можешь сделать с ней все, что нужно:
Form2.Caption := "Другой Caption";
Form2.Button1.Enable := False;
...

а потом уж показываешь:
Form2.ShowModal;

Form2.Free; - !!!!!!!!здесь не должен возникать except????

В данном случае - должен. Ты уж определись, кто будет уничтожать форму, тот кто ее создавал, или она сама (Action := caFree на OnClose), одно из двух, но не в двух местах сразу...


 
Anatoly Podgoretsky ©   (2003-02-27 16:57) [23]

kat (27.02.03 16:07)
with TForm2.Create(Self) do negin
передача параметров
прочие действия
Show;
end;





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

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

Наверх




Память: 0.53 MB
Время: 0.02 c
3-29699
Жук
2003-02-18 11:42
2003.03.10
Внешнее объединение и вложенный select


3-29714
vladimirS
2003-02-19 08:16
2003.03.10
IBRestoreService лаждый раз разный размер БД ...


14-30048
Alexanders
2003-02-20 12:02
2003.03.10
Уровень записи


4-30176
top100
2003-01-18 01:25
2003.03.10
как проверить соединение с инетом


6-29985
Nick_N_A
2003-01-19 05:55
2003.03.10
Soket