Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Метод


Страницы:   1 2 3

VetMIg ©   (2002-05-08 14:45:00) 

Почему, когда я уничтожаю форму методом "Free". После 3-го закрытия этой формы программа выдает ошибку?
Пример:
...
Form1.Visible:= False;
Form1.Free;
...


VetMIg   (2002-05-15 02:08:00) [21]

Ок... Во-первых, строчки кода, пример...

Нужно закрыть About_Form.

procedure TAbout_Form.Image3Click(Sender: TObject);
begin
PlaySound("sound\menu_back.wav", 0, Snd_FileName);
About_Form.Visible:= False;
About_Form.Free;
Main_Form.Visible:= True;
Main_Form.SetFocus;
end;

Теперь ошибка:

Project Project1.exe raised exception class EAccessViolation with message "Access violation at address 0043F419 in module Project1.exe". Read of address 00D34EBD

Все, что просили.


Кулюкин Олег   (2002-05-14 15:41:00) [22]

2 Anatoly Podgoretsky © (14.05.02 15:23)
Может это коммерческая тайна? :)


Anatoly Podgoretsky   (2002-05-14 15:23:00) [23]

VetMIg © (14.05.02 14:25)
Ну секрет прям какой то.
Давай так ты говоришь нам подробности, включая сообщение об ошибки, а мы тебе помогаем. Ты молчишь и мы молчим.


Внук   (2002-05-14 15:17:00) [24]

Пока не будет кода, не будет и толькового ответа, IMHO.


NailS   (2002-05-14 15:10:00) [25]

Повторяясь за Кулюкин Олег, Johnny Smith, все таки решусь спросить

КАКУЮ ОШИБКУ ВЫДАЕТ ПРОГРАММА ПРИ ЗАКРЫТИИ ФОРМЫ?

и где находятся строчки кода

Form1.Visible:= False;
Form1.Free;


kull   (2002-05-14 15:06:00) [26]


> paul_shmakov © (08.05.02 20:25)
> Romkin прав и нечего здесь спорить. Читайте хелп внимательно:

А примечание к этому help-у тоже внимательно читали?

Note: Release returns immediately to the caller. It does not wait for the form to be freed before returning.

А вот Close ждет пока закроется.


Andrey007   (2002-05-14 15:02:00) [27]

if Form1<>nil then FreeAndNil(Form1);

FreeAndNil procedure

Frees an object reference and replaces the reference with nil.

procedure FreeAndNil(var Obj);

Description

Use FreeAndNil to ensure that a variable is nil after you free the object it references. Pass any variable that represents an object as the Obj parameter.

Warning: Do not pass a value for Obj if it is not an instance of TObject or one of its descendants.


VetMIg   (2002-05-14 14:25:00) [28]

Классно конечно, но вот я увидел вопрос: Что значит "После 3-го закрытия формы"? . Так вот... Первые два раза форма закрывается нормально и не выдает никаких ошибок. А на третий раз выводит ошибку.


paul_shmakov   (2002-05-08 20:25:00) [29]

Romkin прав и нечего здесь спорить. Читайте хелп внимательно:

Destroys the form and frees its associated memory.

procedure Release;

Description

Use Release to destroy the form and free its associated memory.

Release does not destroy the form until all event handlers of the form and event handlers of components on the form have finished executing. Any event handlers of the form should use Release. Failing to do so could lead to an access violation.


ну а то, что у кого-то и Free нормально работает, так может и FreeMem какой-нибудь тоже нормально работать будет... некоторое время.


Malder   (2002-05-08 18:59:00) [30]

Лично я не понял вопроса. "После 3-го закрытия этой формы программа выдает ошибку?" - ахинея какая-то. Что значит "После 3-го закрытия формы " ? После того, как три раза вызывал метод Free ?! Да после же первого Form1.Free любое обращение к форме будет вызывать ошибку...


kull   (2002-05-08 18:32:00) [31]


> Romkin ©

Почему Release а не Close?

Мастера, мастера ...


Romkin   (2002-05-08 16:53:00) [32]

Повезло. Зависит от многих факторов, у меня были такие классические AV, программист написал везде Free, и два часа ловил ошибку :-))


Внук   (2002-05-08 16:46:00) [33]

Упс... Правильно писать - НИ разу не использовал ...


Val   (2002-05-08 16:45:00) [34]

ну тогда уж вместе почитаем:
..Any event handlers of the form should use Release..
это нам где же сказано, откуда автор вопроса форму уничтожает, чтобы Release использовать?


Внук   (2002-05-08 16:44:00) [35]

>>Romkin © (08.05.02 16:40)
Теоретически Вы правы, конечно, но практически это большая редкость. Более того, открою страшную тайну - не разу в своей жизни не использовал TForm.Release - и ничего :)


Romkin   (2002-05-08 16:40:00) [36]

См. Help на Release
Дело в том, что у формы есть очередь сообщений, и при вызове Free она может быть не пустой. Результат - форма уничтожена вместе с handle окна, а потом приложение доходит до обработки сообщений, и отправляет сообщения уничтоженному handle.
При этом возникает access violation, причем не сразу и в разных местах - фиг оттрассируешь


Val   (2002-05-08 16:34:00) [37]

>Romkin © (08.05.02 16:17)
почему же не Free, а Release?


Romkin   (2002-05-08 16:17:00) [38]

Потому, что форму надо закрывать не вызовом Free, а вызовом Release. А ошибка должна быть AV


Johnny Smith   (2002-05-08 16:05:00) [39]

А ошибка-то какая?


Alx2   (2002-05-08 15:01:00) [40]

Попробуй вместо метода Free процедуру FreeAndNil


Страницы:   1 2 3

Наверх

Титульная страница Поиск, карта сайта Написать письмо