Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2003.03.10;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.5 MB
Время: 0.008 c
1-29860
MadGhost
2003-02-28 15:42
2003.03.10
Можно ли както узнать?


14-30038
Igor_thief
2003-02-24 19:37
2003.03.10
Папки и файлы


3-29721
VIB
2003-02-18 16:01
2003.03.10
Блокировка записи.


1-29918
denick
2003-02-21 17:00
2003.03.10
Вопрос про ScrollBar


14-30057
Зорро
2003-02-21 10:11
2003.03.10
Диск с огромным колличеством документации





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