Aleck D.Shadow
|
|
« : 23-06-2003 17:02 » |
|
for i {= 0 to Screen.FormCount - 1 do if Screen.Forms[i( <> Application.MainForm then Screen.Forms[i(.Close;
При выполнении этого кода, когда в приложении есть окно в которое встроенно еще n окон (методом ManualDock), они не закрываются. При чем при вызове повторно всё отлично закрывается. А если же попытаться вызвать второй раз подряд, то ситуация повторяется. Как будто проге нужно дать время, чтобы она закрыла окна. :?:
|
|
|
Записан
|
|
|
|
PSD
Главный специалист
Offline
Пол:
|
|
« Ответ #1 : 23-06-2003 17:49 » |
|
А вложенные формы являются членами колекции forms[] объекта screen ?
Ты визуально проверял они там есть?
|
|
|
Записан
|
Да да нет нет все остальное от лукавого.
|
|
|
Aleck D.Shadow
|
|
« Ответ #2 : 23-06-2003 18:13 » |
|
Вообще-то являются. MAINForm.Screen - где MAINForm -это главная форма от которой и создаются все формы.Так что является. А как визуально?
|
|
|
Записан
|
|
|
|
PSD
Главный специалист
Offline
Пол:
|
|
« Ответ #3 : 23-06-2003 18:33 » |
|
В дебагере или просто распечатай названия форм указатели на которые есть в forms[].
Я не знаю концепцию делфи. Но думаю что первым шагом неплохобы отрасировать что же ты на самом деле закрывашь. В vb были похожие непонятки. в конечном итоге выяснилось что у меня по умолчанию цеплялась не колеция mainform а активного окна.
|
|
|
Записан
|
Да да нет нет все остальное от лукавого.
|
|
|
Aleck D.Shadow
|
|
« Ответ #4 : 23-06-2003 19:29 » |
|
Дело в том, что при создании очередной формы в программе она привязывается к основной(смотря как создавать) и добавляется в список, не что иное как Screen.
Если, кстати, закрывать форму не close, destroy то всё работает. Вот такая вот бадяга.
Интересно почему через close не закрывает?
|
|
|
Записан
|
|
|
|
Гром
Птычк. Тьфу, птычник... Вот!
Готовлюсь к пенсии
Offline
Пол:
Бодрый птах
|
|
« Ответ #5 : 23-06-2003 20:17 » |
|
Возможно - если я правильно понимаю, WM_CLOSE аналог которого ты вызываешь в дельфи не закрывает окно безусловно... Там есть цепочка проверяющая связи окна и т.д. А WM_DESTROY - убивает безусловно... Глянь разницу между ними в MSDN - у меня нет под рукой.
|
|
|
Записан
|
А птичку нашу прошу не обижать!!!
|
|
|
Aleck D.Shadow
|
|
« Ответ #6 : 24-06-2003 13:05 » |
|
Скорее всего так и есть. Так как проблему решил через Destroy, то соответственно вопрос снимаю. Спасибо.
|
|
|
Записан
|
|
|
|
Anonymous
Гость
|
|
« Ответ #7 : 19-09-2003 10:53 » |
|
Вообще-то являются. MAINForm.Screen - где MAINForm -это главная форма от которой и создаются все формы.Так что является. А как визуально? А откуда, извините, у класса TForm есть свойство Screen? Или метод, что не важно. Нету, или в 7-й есть? Screen это такая переменная типа TScreen, у которой есть свойство Forms, которое предоставляет доступ к формам, созданным в приложении. А вообще-то было-бы не корректней проверять не придочена-ли форма, и если да, то её того, а потом уничтожать. А ещё, как гласит документация у форм КРАЙНЕ не рекомендуется вызывать free и destroy руками. От этого могут быть трудноулавливаемые глюки. Из хельпа: 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 instead of Free. Failing to do so could lead to an access violation.
|
|
|
Записан
|
|
|
|
Aleck D.Shadow
|
|
« Ответ #8 : 22-09-2003 07:13 » |
|
To Гость: Наверное в 7 есть. Насчет удаления ручкам, то коли я сам создал то сам смогу и удалить!
|
|
|
Записан
|
|
|
|
kvlasov
Гость
|
|
« Ответ #9 : 23-09-2003 05:03 » |
|
Цикл надо запустить с хвоста списка for i {= Screen.FormCount - 1 downto 0 do
Если по Close форма отрабатывает уничтожение, то она исчезает из списка, а у всех последующих форм индекс уменьшается на 1. При этом в цикле с начала списка получаются пропуски форм.
|
|
|
Записан
|
|
|
|
Var-Alex
Гость
|
|
« Ответ #10 : 24-09-2003 06:01 » |
|
To Гость: Наверное в 7 есть. Насчет удаления ручкам, то коли я сам создал то сам смогу и удалить! Дыкть удаляй! Я так и не понял, по Free убиваются окна или нет? А по Release? :?:
|
|
|
Записан
|
|
|
|
Aleck D.Shadow
|
|
« Ответ #11 : 24-09-2003 08:51 » |
|
To Var-Alex: Только по Destroy. To KVlasov: Я примерно так и делаю. Спасибо.
|
|
|
Записан
|
|
|
|
kvlasov
Гость
|
|
« Ответ #12 : 24-09-2003 10:36 » |
|
Как будто проге нужно дать время, чтобы она закрыла окна.
Оно и есть. Протормозил. begin Screen.Forms[i(.Close; Application.ProcessMessages; end;
|
|
|
Записан
|
|
|
|
Aleck D.Shadow
|
|
« Ответ #13 : 24-09-2003 10:55 » |
|
Ну всё понятно. Жалко, но слишком поздно. Как обычно бывает хорошее решение приходит слишком поздно.
Спасибо.
|
|
|
Записан
|
|
|
|
Var-Alex
Гость
|
|
« Ответ #14 : 25-09-2003 09:56 » |
|
To Var-Alex: Только по Destroy. To KVlasov: Я примерно так и делаю. Спасибо. :?: :?: :?: :?: :?: :?: Но ведь free это вызов destroy при self <> nil !!! Как оно там может не работать!??!! Не пробовал смотреть почему Free не работает??! а я-бы не так сделал: while screen.formcount > 0 do Screen.Forms[0].free;
|
|
|
Записан
|
|
|
|
Var-Alex
Гость
|
|
« Ответ #15 : 25-09-2003 09:57 » |
|
To Var-Alex: Только по Destroy. To KVlasov: Я примерно так и делаю. Спасибо. :?: :?: :?: :?: :?: :?: Но ведь free это вызов destroy при self <> nil !!! Как оно там может не работать!??!! Не пробовал смотреть почему Free не работает??! а я-бы не так сделал: while screen.formcount > 0 do Screen.Forms[0].free;
|
|
|
Записан
|
|
|
|
Var-Alex
Гость
|
|
« Ответ #16 : 25-09-2003 09:57 » |
|
To Var-Alex: Только по Destroy. To KVlasov: Я примерно так и делаю. Спасибо. :?: :?: :?: :?: :?: :?: Но ведь free это вызов destroy при self <> nil !!! Как оно там может не работать!??!! Не пробовал смотреть почему Free не работает??! а я-бы не так сделал: while screen.formcount > 0 do Screen.Forms[0].free;
|
|
|
Записан
|
|
|
|
x77
Модератор
Offline
Пол:
меняю стакан шмали на обратный билет с Марса.
|
|
« Ответ #17 : 25-09-2003 10:19 » |
|
ну, если уж на то пошло, то именно для формы вызывать лучше не Free, и не Destroy, а Release. она ждёт, пока закончится обработка всех событий формы и всех её компонентов, а также перед закрытием формы отрабатывает всю очередь сообщений этой формы. хотя управление в вызваший метод возвращает сразу, не дожидаясь фактической отработки.
|
|
|
Записан
|
|
|
|
x77
Модератор
Offline
Пол:
меняю стакан шмали на обратный билет с Марса.
|
|
« Ответ #18 : 25-09-2003 10:23 » |
|
Aleck D.Shadow, и, кстати, есть он (release) и в седьмой, и в шестой, и в пятой. насчёт чётверки врать не буду, но сильно удивлюсь, если там его нет.
|
|
|
Записан
|
|
|
|
Aleck D.Shadow
|
|
« Ответ #19 : 25-09-2003 11:46 » |
|
Окей ребята спорить не буду. Короче я это дело забросил всвязи со срочной сменой направления деятельности. Извините если что не так. Всем благодарен.
|
|
|
Записан
|
|
|
|
Aleck D.Shadow
|
|
« Ответ #20 : 25-09-2003 11:48 » |
|
Кстати, Var-Alex, я твое сообщение ТРИ раза перечитал. А потом сообразил что это одно и тоже. Да я сегодня явно переработал....
|
|
|
Записан
|
|
|
|
Var-Alex
Гость
|
|
« Ответ #21 : 30-09-2003 04:29 » |
|
Ничего, бывает у всех ....
|
|
|
Записан
|
|
|
|
Viktor Denk
Участник
Offline
|
|
« Ответ #22 : 09-10-2003 10:34 » |
|
To Var-Alex Но ведь free это вызов destroy при self <> nil !!! Как оно там может не работать!??!! Не пробовал смотреть почему Free не работает??!
Teoreticheski da, a prakticheski net. Bag ot Borland i davnij, s 2-ki, do pjatoj tochno. Poetomu ja vsegda ruchkami proverjaju na nil, i poslednee: posle togo kak free sdelal - ne zabud' imja objekta v nil posadit'.
|
|
|
Записан
|
A u nas v Sibiri!
|
|
|
Var-Alex
Гость
|
|
« Ответ #23 : 09-10-2003 11:57 » |
|
To Var-Alex: Только по Destroy. To KVlasov: Я примерно так и делаю. Спасибо. Ну это вообще-то очень странно. А ты не пробовал трассировать что происходит по вызову Free? Просто инетерсно, почему не рабоатет?
|
|
|
Записан
|
|
|
|
x77
Модератор
Offline
Пол:
меняю стакан шмали на обратный билет с Марса.
|
|
« Ответ #24 : 09-10-2003 12:06 » |
|
2 Viktor_Denk: никакой это не баг. фри был написан как альтернатива Destroy, позволяющая корректно вычистить объект независимо от того, был он инициализирован, или нет. посмотри исходники борладна: procedure TObject.Free; begin if Self <> nil then Destroy; end; и ручками nil выставлять не нужно, для этого юзается FreeAndNil.
|
|
|
Записан
|
|
|
|
Viktor Denk
Участник
Offline
|
|
« Ответ #25 : 13-10-2003 08:24 » |
|
2 Viktor_Denk: никакой это не баг. фри был написан как альтернатива Destroy, позволяющая корректно вычистить объект независимо от того, был он инициализирован, или нет. посмотри исходники борладна: procedure TObject.Free; begin if Self <> nil then Destroy; end; и ручками nil выставлять не нужно, для этого юзается FreeAndNil. Ja eto tozhe smotrel, i eto menjaa vsegda udivljalo: kakogo cherta v vyzovax iz exe lovlju inogda error i sistema letit k chertjam sobach'im. Po logu vsegda videl, chto eto proisxodit pri frjax bez proverko na urovne app. A za FreeAndNil spasibo - posmotrju "odnako".
|
|
|
Записан
|
A u nas v Sibiri!
|
|
|
x77
Модератор
Offline
Пол:
меняю стакан шмали на обратный билет с Марса.
|
|
« Ответ #26 : 13-10-2003 08:38 » |
|
Система может лететь к чертям по той причине, что вызов Free сам по себе не гарантирует установление объекта в nil. Т.е. он может быть уже неприсвоен, но и не равен nil, а какому-нибудь мусору. Например: var P{ Pointer; begin P {= nil; GetMem)P, 1024:; FreeMem)P, 1024:; if p <> nil then FreeMem )p, 1024: ; end; это код однозначно сглючит, хотя указатель был корректно освобождён. и отследить это невозможно, только руками. поэтому и рекомендуется вместо Free везде, где можно юзать FreeAndNil.
|
|
|
Записан
|
|
|
|
Viktor Denk
Участник
Offline
|
|
« Ответ #27 : 13-10-2003 09:04 » |
|
Система может лететь к чертям по той причине, что вызов Free сам по себе не гарантирует установление объекта в nil. Т.е. он может быть уже неприсвоен, но и не равен nil, а какому-нибудь мусору. Например: var P{ Pointer; begin P {= nil; GetMem)P, 1024:; FreeMem)P, 1024:; if p <> nil then FreeMem )p, 1024: ; end; это код однозначно сглючит, хотя указатель был корректно освобождён. и отследить это невозможно, только руками. поэтому и рекомендуется вместо Free везде, где можно юзать FreeAndNil. Nu takix shutok ne delal odnoznachno. V osnovnom pri sozdanii i udalenii formularov poluchal na orexi. Nu i obzhegsis' na moloke dujut na vodu. I eshche raz xochu bol'shoe spasibo skazat' za ukazanie na FreeAndNil. Progljadel kak - to. Ili v D2 ee ne bylo mozhet, ne mogu proverit', nado iskat' CD, installirovat' zanovo - odnoznachno .
|
|
|
Записан
|
A u nas v Sibiri!
|
|
|
Aleck D.Shadow
|
|
« Ответ #28 : 13-10-2003 11:00 » |
|
Viktor Denk , а ты и правда из Германии?
|
|
|
Записан
|
|
|
|
Var-Alex
Гость
|
|
« Ответ #29 : 14-10-2003 04:19 » |
|
Nu takix shutok ne delal odnoznachno. V osnovnom pri sozdanii i udalenii formularov poluchal na orexi. Nu i obzhegsis' na moloke dujut na vodu. I eshche raz xochu bol'shoe spasibo skazat' za ukazanie na FreeAndNil. Progljadel kak - to. Ili v D2 ee ne bylo mozhet, ne mogu proverit', nado iskat' CD, installirovat' zanovo - odnoznachno . Каких еще таких формуляров?? Мож это были глючные кмпаненты каки там использованы? Или ещё где ошибка?? Я много глюкво повидал, оно ой как сильно свзано может быть.... А FreeAndNil уже должно быть во 2-й DELPHI, оно ведь для поддержки многопоточности придумано... з.ы. А транслих это плохо очень... Хрен прочитаешь? Давай по русски, а?
|
|
|
Записан
|
|
|
|
|