Текущий архив: 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