![]() |
|
Модераторы: Poseidon, Snowy, bems, MetalFan |
![]()
|
|
| Teleport |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 557 Регистрация: 5.7.2008 Где: Прибалтика Репутация: 3 Всего: 6 |
Вызвал форму методом ShowModal
Естественно не могу переключиться на главную форму, пока не закрою эту. Возможно ли переключиться на главную форму, не закрывая, вызванную методом ShowModal? Form1.Show - в моем случае не прокатывает. Так как форму вызываю из dll. |
|||
|
||||
| Rrader |
|
|||
|
Inspired =) ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 1535 Регистрация: 7.5.2005 Репутация: 70 Всего: 191 |
Попробуй
|
|||
|
||||
| Teleport |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 557 Регистрация: 5.7.2008 Где: Прибалтика Репутация: 3 Всего: 6 |
вот код библиотеки, из которой я вызываю форму.
либо Form1.Free; как-то убирать, либо с Form1.ShowModal что-то делать Это сообщение отредактировал(а) Teleport - 23.7.2008, 11:21 |
|||
|
||||
| pseud |
|
|||
![]() Экспёрт Тыдыщ ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1175 Регистрация: 18.5.2007 Где: Минск, Беларусь Репутация: 10 Всего: 40 |
делай
Form1.Show а Form1.Free пиши в другой процедурепиши, вызываемой из основного приложения Это сообщение отредактировал(а) pseud - 23.7.2008, 11:27 -------------------- Испытание чужого терпения можно считать успешным, если оно лопнуло... |
|||
|
||||
| Felan |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 284 Регистрация: 2.8.2007 Где: Самара Репутация: 2 Всего: 7 |
А еще лучше создавать форму только в том случае, если она еще не создана, а ври ей делать по событию DLL_PROCESS_DETACH.
Тогда показывать ее через Show можно будет хоть до посинения. -------------------- // Любая сложная система - это темный лес. Каждый в этом лесу протаптывает свои тропинки, по ним и бегает. Лишь изредка, сходя с них, мы находим много интересного, а порою и страшного. |
|||
|
||||
| CodeMonkey |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1839 Регистрация: 24.6.2008 Где: Россия, Тверь Репутация: 38 Всего: 89 |
Попробуйте посмотреть:
http://www.delphikingdom.ru/asp/answer.asp?IDAnswer=58390 http://www.delphikingdom.ru/asp/answer.asp?IDAnswer=62127 http://www.delphikingdom.ru/asp/answer.asp?IDAnswer=55908 http://www.delphikingdom.ru/asp/answer.asp?IDAnswer=50712 http://www.delphikingdom.ru/asp/answer.asp?IDAnswer=53472 -------------------- Опытный программист на C++ легко решает любые не существующие в Паскале проблемы. |
|||
|
||||
| Teleport |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 557 Регистрация: 5.7.2008 Где: Прибалтика Репутация: 3 Всего: 6 |
2 pseud - я только Form1.Free убираю, так сразу при вызове этой формы из dll ошибки лезут.
2 Felan - не совсем понял как это сделать-то 2 CodeMonkey сейчас гляну, спасибо... |
|||
|
||||
| Teleport |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 557 Регистрация: 5.7.2008 Где: Прибалтика Репутация: 3 Всего: 6 |
2 CodeMonkey на страничках понял только русские символы...
сложновато понять остальное... |
|||
|
||||
| Felan |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 284 Регистрация: 2.8.2007 Где: Самара Репутация: 2 Всего: 7 |
Посмотри в DRKB. У каждой длл есть "события", на которые можно повесить определенный функционал. В частности DLL_PROCESS_DETACH, DLL_PROCESS_ATTACH и еще два, названия не помню. В хелпе все это найти можно без проблема. Выглядит в простейшем случае примерно так:
-------------------- // Любая сложная система - это темный лес. Каждый в этом лесу протаптывает свои тропинки, по ним и бегает. Лишь изредка, сходя с них, мы находим много интересного, а порою и страшного. |
|||
|
||||
| morpheyushka |
|
||||
![]() Зеленый человек ![]() ![]() Профиль Группа: Участник Сообщений: 563 Регистрация: 26.2.2008 Где: Киев Репутация: 3 Всего: 8 |
Попробуй на OnClose повесить метод Free:
Ну а вызывай естественно методом Show |
||||
|
|||||
| Teleport |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 557 Регистрация: 5.7.2008 Где: Прибалтика Репутация: 3 Всего: 6 |
да, все получилось
Выкладываю исходник, в котором все решено. Может кто поиском на форуме найдет Присоединённый файл ( Кол-во скачиваний: 3 )
dll_Form.rar 6,97 Kb |
|||
|
||||
| Teleport |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 557 Регистрация: 5.7.2008 Где: Прибалтика Репутация: 3 Всего: 6 |
||||
|
||||
| Akella |
|
|||
![]() Творец ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 18485 Регистрация: 14.5.2003 Где: Корусант Репутация: 36 Всего: 329 |
|
|||
|
||||
| pseud |
|
|||
![]() Экспёрт Тыдыщ ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1175 Регистрация: 18.5.2007 Где: Минск, Беларусь Репутация: 10 Всего: 40 |
Akella, что-то мне подсказывает что не стоит. ведь мы указали уже
дальше объект уж удалиться -------------------- Испытание чужого терпения можно считать успешным, если оно лопнуло... |
|||
|
||||
| Teleport |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 557 Регистрация: 5.7.2008 Где: Прибалтика Репутация: 3 Всего: 6 |
2 Akella - почему лучше?? Подробней можно?
|
|||
|
||||
| Alexeis |
|
|||
![]() Амеба Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 109 Всего: 459 |
опасно делать так
Дальше по уничтожению могут быть обращения к полям. -------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
| Teleport |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 557 Регистрация: 5.7.2008 Где: Прибалтика Репутация: 3 Всего: 6 |
хм... спасиб, я попробую твой вариант
|
|||
|
||||
| Akella |
|
||||
![]() Творец ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 18485 Регистрация: 14.5.2003 Где: Корусант Репутация: 36 Всего: 329 |
ой, немного ошибся, вот так правильнее:
зачем Form1 := nil;? Смотри. В процессе работы пользователь открывает и закрывает окно. При закрытии окна оно не уничтожается, а типа прячется. Там может быть куча компонентов визуальных и невизуальных, вследствие чего окно может жрать кучу памяти. Здесь два пути: 1. Ничего не делать при закрытии формы, тогда она в следующий раз может открыться быстрее, т.к. всё уже создано, просто спрятано и живёт в памяти. 2. Уничтожить, но окно в следующий раз может открываться медленнее. Но память и указатели будут освобождены. , есть код
так вот, если не прописать Form1 := nil, то Assigned вернёт True; Добавлено через 6 минут и 46 секунд По каким полям? Нечего тогда обращаться к несозданной форме или нужно проверять, создана форма или нет. |
||||
|
|||||
| pseud |
|
||||
![]() Экспёрт Тыдыщ ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1175 Регистрация: 18.5.2007 Где: Минск, Беларусь Репутация: 10 Всего: 40 |
но ведь мы указали
и никуда оно не спрячется спрячется оно если
Добавлено через 3 минуты и 19 секунд Akella, ты ли это? глянь исходники форм (Forms.pas) и вывод оттуда, если коротко: Form1 := nil; - не нужен. Добавлено через 10 минут и 52 секунды мало того что создано, так еще и инициализировано и имеет следы похождений юзера по ней. P.S.я бы не рекомендовал использовать глобальные переменные создаваемые средой при создании форм, а-ля Form1: TForm1; -------------------- Испытание чужого терпения можно считать успешным, если оно лопнуло... |
||||
|
|||||
| Akella |
|
|||
![]() Творец ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 18485 Регистрация: 14.5.2003 Где: Корусант Репутация: 36 Всего: 329 |
pseud, ты не понял, если НЕ указывать в OnClose ничего, то окно не уничтожается
Добавлено через 2 минуты и 33 секунды *пошёл глядеть в зеркало Добавлено через 2 минуты и 48 секунд да вроде я Добавлено через 7 минут и 4 секунды уничтож форму с пом caFree, а потом проверь, что вернёт assigned |
|||
|
||||
| Teleport |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 557 Регистрация: 5.7.2008 Где: Прибалтика Репутация: 3 Всего: 6 |
2 Akella , pseudНу вот, узнал кой-чего нового.
|
|||
|
||||
| pseud |
|
||||
![]() Экспёрт Тыдыщ ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1175 Регистрация: 18.5.2007 Где: Минск, Беларусь Репутация: 10 Всего: 40 |
да уж, картинка. я действительно не совсем прав. но и ты до конца не прав тож. объект-форма на самом деле уничтожается, т.е. фраза...
...неверна. а вот ссылка не подчищается. и если после уничтожения я пишу:
получаю AccessViolation. -------------------- Испытание чужого терпения можно считать успешным, если оно лопнуло... |
||||
|
|||||
| VICTAR |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 1108 Регистрация: 6.10.2006 Репутация: 37 Всего: 80 |
||||
|
||||
| morpheyushka |
|
|||
![]() Зеленый человек ![]() ![]() Профиль Группа: Участник Сообщений: 563 Регистрация: 26.2.2008 Где: Киев Репутация: 3 Всего: 8 |
Дык мы же это умолчание и изменяем в методе OnClose
Остается только ссылка |
|||
|
||||
| VICTAR |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 1108 Регистрация: 6.10.2006 Репутация: 37 Всего: 80 |
Складывается такое впечатление, что здесь каждый говорит о своем
|
|||
|
||||
| Akella |
|
||||||
![]() Творец ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 18485 Регистрация: 14.5.2003 Где: Корусант Репутация: 36 Всего: 329 |
я ещё раз повторяю, если ты закрываешь немодальную форму, а в OnClose нет Action := caFree , то форма НЕ уничтожается, как донести это до тебя? Добавлено через 2 минуты и 48 секунд
Посмотри Исходники FreeAndNil Добавлено через 4 минуты и 25 секунд Я ГОВОРИЛ ПРО ТО, ЕСЛИ БЫ НЕ БЫЛО В ONCLOSE НИЧЕГО Добавлено через 6 минут и 11 секунд а как до народа донести, что я писАл это:
имея ввиду то, что в OnClose программист не вставил код action := caFree; Добавлено через 8 минут и 56 секунд Теперь идём дальше. Если программист вставляет action := caFree; , то форма уничтожаентся, но указатель НЕТ. но вот если в событии OnClose будет 2 строки: action := caFree; и ИмяФормы := nil; то и форма уничтожится, и указатель в памяти на форму эту освободиться и тогда уже при последующей проверка if assigned(ИмяФормы) вернёт FALSE ЧТО И ТРЕБОВАЛОСЬ ДОКАЗАТЬ! ФУХ |
||||||
|
|||||||
| pseud |
|
|||
![]() Экспёрт Тыдыщ ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1175 Регистрация: 18.5.2007 Где: Минск, Беларусь Репутация: 10 Всего: 40 |
+1 прошу прощения за еще немножко оффтопа. Akella, та поставил вопрос: и ответил на него: согласиь вопрос с ответом никак не стыкуются. это меня навело на мысль что ты - это не ты. но ты-то, оказывается, все-таки - ты чур я прекращаю этот комаровский рынок. -------------------- Испытание чужого терпения можно считать успешным, если оно лопнуло... |
|||
|
||||
| Alexeis |
|
|||
![]() Амеба Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 109 Всего: 459 |
OnClose вызывается не святым духом, а изнутри методов формы. После выполнения обработчика в методе вызвавшем обработчик или ниже по стеку могут быть еще обращения к полям самой формы. Потенциально это может привести к AV. Насколько я знаю запрещено удалять объект (себя) из своего же обработчика. -------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
| VICTAR |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 1108 Регистрация: 6.10.2006 Репутация: 37 Всего: 80 |
в подтверждение слов http://www.delphilab.ru/content/view/206/63/ |
|||
|
||||
| Akella |
|
||||
![]() Творец ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 18485 Регистрация: 14.5.2003 Где: Корусант Репутация: 36 Всего: 329 |
но код же сначала уничтожает нормально! форму, а потом только освобождает указатель
так что здесь никаких AV не должно быть Это сообщение отредактировал(а) Akella - 30.7.2008, 20:54 |
||||
|
|||||
| VICTAR |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 1108 Регистрация: 6.10.2006 Репутация: 37 Всего: 80 |
Akella, Alexeis говорил про FreeAndNil(Form1)
Давайте наконец дадим этой теме спокойной умереть. Все всё выяснили |
|||
|
||||
| Akella |
|
||||
![]() Творец ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 18485 Регистрация: 14.5.2003 Где: Корусант Репутация: 36 Всего: 329 |
Добавлено через 1 минуту и 37 секунд
а как же caFree Добавлено через 3 минуты и 6 секунд да, так неправильно
но здесь я испроавил свою ошибку |
||||
|
|||||
| pseud |
|
||||
![]() Экспёрт Тыдыщ ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1175 Регистрация: 18.5.2007 Где: Минск, Беларусь Репутация: 10 Всего: 40 |
- это еще не удаление формы, а лишь выставление флага для вызвавшей процедуры DoClose; а уже она решает что с ним делать. да еще ее могу перекрыть и навызывать + процедур кучу. и кста после перекрытий ваще могут забыть OnClose вызвать. Ужастик какой-то. )) -------------------- Испытание чужого терпения можно считать успешным, если оно лопнуло... |
||||
|
|||||
| Alexeis |
|
|||
![]() Амеба Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 109 Всего: 459 |
Чтобы не было пустых разговоров скажу, что вариант хоть логически не идеальный, но может работать в однопоточной программе. Почему в однопоточной? Потому что мы его уже давно проверяли под дебагом. Живой он только потому, что после освобождения памяти ее никто не успевает получить. Так оно будет всегда, пока работает 1 поток, потому что в процессе удаления нет дополнительных выделений памяти (разве что эксепшин выскочит). Если будет работать второй поток, то сразу после удаления формы эту память может кто-то запросить и при последующих операциях может нарушиться память чужого потока и дальше последствия непредсказуемы, как говорят UB.
-------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
| Akella |
|
|||
![]() Творец ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 18485 Регистрация: 14.5.2003 Где: Корусант Репутация: 36 Всего: 329 |
По идее любая программа может быть много поточной, особенно в тех случаях, когда ты используешь сторонние компоненты.
Так как же тогда правильно работать в многопоточной программе в этом случае? Ты хочешь сказать, что если я в программе использую многопоточность, то я должен опасаться использования этих метов закрытия форм: action := caFree; Form1 := nil; ??? Или я тебя не допонял? Но мы же форму уничтожили. Память освободили. Указатель тоже. Ну и пусть себе на здоровье другой поток занимает эту память, что с того? Она же свободна? |
|||
|
||||
| Alexeis |
|
|||
![]() Амеба Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 109 Всего: 459 |
Этих нет, а вот если вызывать FreeAndNil в OnClose то есть шансы завалиться в AV. -------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
| Akella |
|
|||
![]() Творец ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 18485 Регистрация: 14.5.2003 Где: Корусант Репутация: 36 Всего: 329 |
Alexeis, Согласен!!! Я же ответил уже, раза 2 или 3, что в том сообщении я ОШИБСЯ!
|
|||
|
||||
| Alexeis |
|
|||
![]() Амеба Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 109 Всего: 459 |
Прости тут многа букав, а у меня мало времени -------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
| Akella |
|
|||
![]() Творец ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 18485 Регистрация: 14.5.2003 Где: Корусант Репутация: 36 Всего: 329 |
Как я понял, все согласны, что правильно уничтожать немодальную форму будет так:
Кстати при проектировании MDI приложений - этот код будет весьма кстати |
|||
|
||||
| pseud |
|
|||
![]() Экспёрт Тыдыщ ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1175 Регистрация: 18.5.2007 Где: Минск, Беларусь Репутация: 10 Всего: 40 |
отнюдь не кстати т.к. в mdi-приолжениях форм класса TForm1 может быть открыто одновременно n-штук. а Form1 - это всего лишь одна переменная данного класса. -------------------- Испытание чужого терпения можно считать успешным, если оно лопнуло... |
|||
|
||||
| Akella |
|
|||
![]() Творец ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 18485 Регистрация: 14.5.2003 Где: Корусант Репутация: 36 Всего: 329 |
Если ты и прав, то и как тогда быть?
Добавлено через 8 минут и 18 секунд у меня есть MDI приложение, всё там работает очень даже хорошо, даже если я создаю экземляров 5-7 какой либо формы |
|||
|
||||
| pseud |
|
|||
![]() Экспёрт Тыдыщ ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1175 Регистрация: 18.5.2007 Где: Минск, Беларусь Репутация: 10 Всего: 40 |
Akella, я уверен, что у тебя все круто работает по твоему алгоритму.
и у меня все ништяк работает по моему алгоритму. тонкости реализации каждый вынес из своего опыта. давай оставим все как есть. может в другой раз всплывет что-нибудь похожее. обсудим еще раз. а пока тему давно закрыли, а мы с тобой топчемся. пошли отсюда. -------------------- Испытание чужого терпения можно считать успешным, если оно лопнуло... |
|||
|
||||
![]()
|
| Правила форума "Delphi: Общие вопросы" | |
|
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Delphi: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |