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

Поиск:

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


Эксперт
***


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

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



Akella, Alexeis говорил про FreeAndNil(Form1)
Давайте наконец дадим этой теме спокойной умереть. Все всё выяснили  smile 
PM MAIL   Вверх
Akella
Дата 30.7.2008, 20:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


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

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



smile

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

а как же caFree

Добавлено через 3 минуты и 6 секунд
да, так неправильно
Цитата(Akella @  25.7.2008,  16:11 Найти цитируемый пост)
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  Action := caFree;
  FreeAndNil(Form1);//так лучше
end;


но здесь я испроавил свою ошибку
Цитата(Akella @  30.7.2008,  13:45 Найти цитируемый пост)
ой, немного ошибся, вот так правильнее:
Выделить всёкод Pascal/Delphi
1:
2:
3:
4:
5:
    
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  Action := caFree;
  Form1 := nil; // освобождаем указатель на форму.
end;


PM MAIL   Вверх
pseud
Дата 31.7.2008, 08:49 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(Akella @  30.7.2008,  20:37 Найти цитируемый пост)
но код же сначала уничтожает нормально! форму, а потом только освобождает указатель

Код

action := caFree

- это еще не удаление формы, а лишь выставление флага для вызвавшей процедуры DoClose;
а уже она решает что с ним делать.
да еще ее могу перекрыть и навызывать + процедур кучу. 
и кста после перекрытий ваще могут забыть OnClose вызвать. Ужастик какой-то. ))


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


Амеба
Group Icon


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

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



Чтобы не было пустых разговоров скажу, что вариант хоть логически не идеальный, но может работать в однопоточной программе. Почему в однопоточной? Потому что мы его уже давно проверяли под дебагом. Живой он только потому, что после освобождения памяти ее никто не успевает получить. Так оно будет всегда, пока работает 1 поток, потому что в процессе удаления нет дополнительных выделений памяти (разве что эксепшин выскочит). Если будет работать второй поток, то сразу после удаления формы эту память может кто-то запросить и при последующих операциях может нарушиться память чужого потока и дальше последствия непредсказуемы, как говорят UB. 


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

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

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


Творец
****


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

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



По идее любая программа может быть много поточной, особенно в тех случаях, когда ты используешь сторонние компоненты.
Так как же тогда правильно работать в многопоточной программе в этом случае? 
Ты хочешь сказать, что если я в программе использую многопоточность, то я должен опасаться использования этих метов закрытия форм:
action := caFree;
Form1 := nil;
???

Или я тебя не допонял? smile 

Но мы же форму уничтожили. Память освободили. Указатель тоже. Ну и пусть себе на здоровье другой поток занимает эту память, что с того? Она же свободна?
PM MAIL   Вверх
Alexeis
Дата 31.7.2008, 11:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


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

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



Цитата(Akella @  31.7.2008,  09:48 Найти цитируемый пост)
Ты хочешь сказать, что если я в программе использую многопоточность, то я должен опасаться использования этих метов закрытия форм:
action := caFree;
Form1 := nil;
???

  Этих нет, а вот если вызывать FreeAndNil в OnClose то есть шансы завалиться в AV.


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

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

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


Творец
****


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

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



Alexeis, Согласен!!! Я же ответил уже, раза 2 или 3, что в том сообщении я ОШИБСЯ!
PM MAIL   Вверх
Alexeis
Дата 31.7.2008, 11:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


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

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



Цитата(Akella @  31.7.2008,  10:30 Найти цитируемый пост)
Я же ответил уже, раза 2 или 3, что в том сообщении я ОШИБСЯ!

  Прости тут многа букав, а у меня мало времени smile.


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

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

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


Творец
****


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

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



Как я понял, все согласны, что правильно уничтожать немодальную форму будет так:
Код

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

Кстати при проектировании MDI приложений - этот код будет весьма кстати
PM MAIL   Вверх
pseud
Дата 1.8.2008, 08:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(Akella @  31.7.2008,  18:08 Найти цитируемый пост)
Кстати при проектировании MDI приложений - этот код будет весьма кстати

отнюдь не кстати
т.к. в mdi-приолжениях форм класса TForm1 может быть открыто одновременно n-штук.
а Form1 - это всего лишь одна переменная данного класса.


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


Творец
****


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

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



Если ты и прав, то и как тогда быть?

Добавлено через 8 минут и 18 секунд
у меня есть MDI приложение, всё там работает очень даже хорошо, даже если я создаю экземляров 5-7 какой либо формы smile
PM MAIL   Вверх
pseud
Дата 1.8.2008, 17:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Akella, я уверен, что у тебя все круто работает по твоему алгоритму.
и у меня все ништяк работает по моему алгоритму.
тонкости реализации каждый вынес из своего опыта.

давай оставим все как есть.
может в другой раз всплывет что-нибудь похожее. обсудим еще раз.
а пока тему давно закрыли, а мы с тобой топчемся. 
пошли отсюда.

Цитата(VICTAR @  30.7.2008,  20:40 Найти цитируемый пост)
Давайте наконец дадим этой теме спокойной умереть




--------------------
Испытание чужого терпения можно считать успешным, если оно лопнуло...
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.0623 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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