Модераторы: Poseidon, Snowy, bems, MetalFan

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Уйти от Showmodal :) 
V
    Опции темы
Alexeis
Дата 28.7.2008, 09:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 109
Всего: 459



  опасно делать так
Код

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  Action := caFree;
  FreeAndNil(Form1);//так лучше
end;

Дальше по уничтожению могут быть обращения к полям. 


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Teleport
Дата 28.7.2008, 11:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 557
Регистрация: 5.7.2008
Где: Прибалтика

Репутация: 3
Всего: 6



хм... спасиб, я попробую твой вариант smile


--------------------
user posted image
user posted image 
PM MAIL   Вверх
Akella
Дата 30.7.2008, 13:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 36
Всего: 329



ой, немного ошибся, вот так правильнее:
Код

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  Action := caFree;
  Form1 := nil; // освобождаем указатель на форму.
end;


зачем   Form1 := nil;?

Смотри. В процессе работы пользователь открывает и закрывает окно. При закрытии окна оно не уничтожается, а типа прячется. Там может быть куча компонентов визуальных и невизуальных, вследствие чего окно может жрать кучу памяти.
Здесь два пути: 
1. Ничего не делать при закрытии формы, тогда она в следующий раз может открыться быстрее, т.к. всё уже создано, просто спрятано и живёт в памяти.
2. Уничтожить, но окно в следующий раз может открываться медленнее. Но память и указатели будут освобождены.

, есть код

Код

   if not Assigned(Form1) then Form1 := TForm1.create(self);//проверяем, есть ли указатель на форму

так вот, если не прописать Form1 := nil, то Assigned вернёт True;

Добавлено через 6 минут и 46 секунд
Цитата(Alexeis @  28.7.2008,  09:25 Найти цитируемый пост)
Дальше по уничтожению могут быть обращения к полям. 

По каким полям? Нечего тогда обращаться к несозданной форме или нужно проверять, создана форма или нет.
PM MAIL   Вверх
pseud
Дата 30.7.2008, 15:36 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Экспёрт Тыдыщ
***


Профиль
Группа: Завсегдатай
Сообщений: 1175
Регистрация: 18.5.2007
Где: Минск, Беларусь

Репутация: 10
Всего: 40



Цитата(Akella @  30.7.2008,  13:45 Найти цитируемый пост)
зачем   Form1 := nil;?


Цитата(Akella @  30.7.2008,  13:45 Найти цитируемый пост)
При закрытии окна оно не уничтожается, а типа прячется


но ведь мы указали
Код

Action := caFree;

и никуда оно не спрячется
спрячется оно если 
Код

Action := caHide;


Добавлено через 3 минуты и 19 секунд
Akella, ты ли это?
глянь исходники форм (Forms.pas)
и вывод оттуда, если коротко:
Form1 := nil; - не нужен.

Добавлено через 10 минут и 52 секунды
Цитата(Akella @  30.7.2008,  13:45 Найти цитируемый пост)
т.к. всё уже создано, просто спрятано и живёт в памяти

мало того что создано, так еще и инициализировано и имеет следы похождений юзера по ней.
P.S.я бы не рекомендовал использовать глобальные переменные создаваемые средой при создании форм, а-ля Form1: TForm1;




--------------------
Испытание чужого терпения можно считать успешным, если оно лопнуло...
PM MAIL   Вверх
Akella
Дата 30.7.2008, 16:10 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 36
Всего: 329



pseud, ты не понял, если НЕ указывать в OnClose ничего, то окно не уничтожается

Добавлено через 2 минуты и 33 секунды
Цитата(pseud @  30.7.2008,  15:36 Найти цитируемый пост)
Akella, ты ли это?

*пошёл глядеть в зеркало

Добавлено через 2 минуты и 48 секунд
да вроде я smile , а что?

Добавлено через 7 минут и 4 секунды
Цитата(pseud @  30.7.2008,  15:36 Найти цитируемый пост)
Form1 := nil; - не нужен.

уничтож форму с пом caFree, а потом проверь, что вернёт assigned
PM MAIL   Вверх
Teleport
Дата 30.7.2008, 16:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 557
Регистрация: 5.7.2008
Где: Прибалтика

Репутация: 3
Всего: 6



2 Akella , pseudНу вот, узнал кой-чего нового.  smile  Спасибо )))


--------------------
user posted image
user posted image 
PM MAIL   Вверх
pseud
Дата 30.7.2008, 16:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Экспёрт Тыдыщ
***


Профиль
Группа: Завсегдатай
Сообщений: 1175
Регистрация: 18.5.2007
Где: Минск, Беларусь

Репутация: 10
Всего: 40



Цитата(Akella @  30.7.2008,  16:10 Найти цитируемый пост)
уничтож форму с пом caFree, а потом проверь, что вернёт assigned


да уж, картинка.
я действительно не совсем прав. но и ты до конца не прав тож.

объект-форма на самом деле уничтожается, т.е.  фраза...
Цитата(Akella @  30.7.2008,  13:45 Найти цитируемый пост)
При закрытии окна оно не уничтожается, а типа прячется. Там может быть куча компонентов визуальных и невизуальных, вследствие чего окно может жрать кучу памяти.

...неверна.
а вот ссылка не подчищается.
и если после уничтожения я пишу:
Код

  if Assigned(Form1) then
    Form1.Show;

получаю AccessViolation.


--------------------
Испытание чужого терпения можно считать успешным, если оно лопнуло...
PM MAIL   Вверх
VICTAR
Дата 30.7.2008, 17:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник
Сообщений: 1108
Регистрация: 6.10.2006

Репутация: 37
Всего: 80



Цитата(pseud @  30.7.2008,  17:49 Найти цитируемый пост)
...неверна.

По умолчанию для дочерних форм Action = caHide, так что Akella прав.
А про невалидные указатели это известное дело, чтобы этого избежать и существует FreeAndNil.

Это сообщение отредактировал(а) VICTAR - 30.7.2008, 17:02
PM MAIL   Вверх
morpheyushka
Дата 30.7.2008, 17:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Зеленый человек
**


Профиль
Группа: Участник
Сообщений: 563
Регистрация: 26.2.2008
Где: Киев

Репутация: 3
Всего: 8



Цитата(VICTAR @  30.7.2008,  17:01 Найти цитируемый пост)
По умолчанию для дочерних форм Action = caHide

Дык мы же это умолчание и изменяем в методе OnClose
Код

Action := caHide;


Остается только ссылка


--------------------
user posted image
Спасибо делается вот так!!!
PM MAIL WWW   Вверх
VICTAR
Дата 30.7.2008, 17:47 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник
Сообщений: 1108
Регистрация: 6.10.2006

Репутация: 37
Всего: 80



Складывается такое впечатление, что здесь каждый говорит о своем
PM MAIL   Вверх
Akella
Дата 30.7.2008, 18:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 36
Всего: 329



Цитата


объект-форма на самом деле уничтожается, т.е.  фраза...
Цитата(Akella @  30.7.2008,  13:45 Найти цитируемый пост)
При закрытии окна оно не уничтожается, а типа прячется. Там может быть куча компонентов визуальных и невизуальных, вследствие чего окно может жрать кучу памяти.

...неверна.


я ещё раз повторяю, если ты закрываешь немодальную форму, а в OnClose нет Action := caFree , то форма НЕ уничтожается, как донести это до тебя?

Добавлено через 2 минуты и 48 секунд
Цитата

и если после уничтожения я пишу:
    
  if Assigned(Form1) then
    Form1.Show;

получаю AccessViolation. 

 smile  smile  smile  smile  а я тебе о чём? smile  знаешь почему? Потому что assigned возвпащает True! А знаешь почему assigned возвпащает True??? Потому что ты не освободил указатель. Чтобы освободить указатель нужно вызвать Form1 := nil;
Посмотри Исходники FreeAndNil

Добавлено через 4 минуты и 25 секунд
Цитата(morpheyushka @  30.7.2008,  17:37 Найти цитируемый пост)
Дык мы же это умолчание и изменяем в методе OnClose

Я ГОВОРИЛ ПРО ТО, ЕСЛИ БЫ НЕ БЫЛО В ONCLOSE НИЧЕГО smile

Добавлено через 6 минут и 11 секунд
Цитата(VICTAR @  30.7.2008,  17:47 Найти цитируемый пост)
Складывается такое впечатление, что здесь каждый говорит о своем 

 smile 
а как до народа донести, что я писАл это:

Цитата(Akella @  30.7.2008,  13:45 Найти цитируемый пост)
Смотри. В процессе работы пользователь открывает и закрывает окно. При закрытии окна оно не уничтожается, а типа прячется. 


имея ввиду то, что в OnClose программист не вставил код action := caFree;

Добавлено через 8 минут и 56 секунд
Теперь идём дальше. Если программист вставляет action := caFree; , то форма уничтожаентся, но указатель НЕТ.
но вот если в событии OnClose будет 2 строки:
action := caFree; 
и
ИмяФормы := nil;

то и форма уничтожится, и указатель в памяти на форму эту освободиться
и тогда уже при последующей проверка if assigned(ИмяФормы) вернёт FALSE

ЧТО И ТРЕБОВАЛОСЬ ДОКАЗАТЬ!
ФУХ smile 
PM MAIL   Вверх
pseud
Дата 30.7.2008, 18:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Экспёрт Тыдыщ
***


Профиль
Группа: Завсегдатай
Сообщений: 1175
Регистрация: 18.5.2007
Где: Минск, Беларусь

Репутация: 10
Всего: 40



Цитата(VICTAR @  30.7.2008,  17:47 Найти цитируемый пост)
Складывается такое впечатление, что здесь каждый говорит о своем


+1

прошу прощения за еще немножко оффтопа.

Akella, 
та поставил вопрос:
Цитата(Akella @  30.7.2008,  13:45 Найти цитируемый пост)
зачем   Form1 := nil;?

и ответил на него:
Цитата(Akella @  30.7.2008,  13:45 Найти цитируемый пост)
Смотри. В процессе работы пользователь открывает и закрывает окно. При закрытии окна оно не уничтожается, а типа прячется. Там может быть куча компонентов визуальных и невизуальных, вследствие чего окно может жрать кучу памяти.Здесь два пути: 1. Ничего не делать при закрытии формы, тогда она в следующий раз может открыться быстрее, т.к. всё уже создано, просто спрятано и живёт в памяти.2. Уничтожить, но окно в следующий раз может открываться медленнее. Но память и указатели будут освобождены.

согласиь вопрос с ответом никак не стыкуются. 
это меня навело на мысль что ты - это не ты.

но ты-то, оказывается, все-таки - ты  smile . так что Akella не промахнулся...

чур я прекращаю этот комаровский рынок.



--------------------
Испытание чужого терпения можно считать успешным, если оно лопнуло...
PM MAIL   Вверх
Alexeis
Дата 30.7.2008, 19:42 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 109
Всего: 459



Цитата(Akella @  30.7.2008,  12:45 Найти цитируемый пост)
По каким полям? Нечего тогда обращаться к несозданной форме или нужно проверять, создана форма или нет. 

  OnClose вызывается не святым духом, а изнутри методов формы. После выполнения обработчика в методе вызвавшем обработчик или ниже по стеку могут быть еще обращения к полям самой формы. Потенциально это может привести к AV. Насколько я знаю запрещено удалять объект (себя) из своего же обработчика.



--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
VICTAR
Дата 30.7.2008, 19:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник
Сообщений: 1108
Регистрация: 6.10.2006

Репутация: 37
Всего: 80



Цитата(Alexeis @  30.7.2008,  20:42 Найти цитируемый пост)
Насколько я знаю запрещено удалять объект (себя) из своего же обработчика.

в подтверждение слов
http://www.delphilab.ru/content/view/206/63/
PM MAIL   Вверх
Akella
Дата 30.7.2008, 20:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 36
Всего: 329



Цитата(Alexeis @  30.7.2008,  19:42 Найти цитируемый пост)
Насколько я знаю запрещено удалять объект (себя) из своего же обработчика.

но код же сначала уничтожает нормально! форму, а потом только освобождает указатель
Код

action := caFree
Form1 := nil;

так что здесь никаких AV не должно быть


Это сообщение отредактировал(а) Akella - 30.7.2008, 20:54
PM MAIL   Вверх
Страницы: (3) Все 1 [2] 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0658 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.