Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1] 2  Все   Вниз
  Печать  
Автор Тема: Почему используя Form.Screen незакрывает окна?  (Прочитано 38313 раз)
0 Пользователей и 3 Гостей смотрят эту тему.
Aleck D.Shadow
Опытный

tr
Offline Offline
Пол: Мужской

« : 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
Главный специалист

ru
Offline Offline
Пол: Мужской

« Ответ #1 : 23-06-2003 17:49 » 

А вложенные формы  являются членами колекции forms[] объекта screen ?

Ты визуально проверял они там есть?
Записан

Да да нет нет все остальное от лукавого.
Aleck D.Shadow
Опытный

tr
Offline Offline
Пол: Мужской

« Ответ #2 : 23-06-2003 18:13 » 

Вообще-то являются.
MAINForm.Screen - где MAINForm -это главная форма от которой и создаются все формы.Так что является.
А как визуально?
Записан
PSD
Главный специалист

ru
Offline Offline
Пол: Мужской

« Ответ #3 : 23-06-2003 18:33 » 

В дебагере или просто распечатай названия форм указатели на которые есть в forms[].

Я не знаю концепцию делфи. Но думаю что первым шагом неплохобы отрасировать  что же ты на самом деле закрывашь.
В vb  были похожие непонятки. в конечном итоге выяснилось что у меня по умолчанию цеплялась не колеция  mainform а активного окна.
Записан

Да да нет нет все остальное от лукавого.
Aleck D.Shadow
Опытный

tr
Offline Offline
Пол: Мужской

« Ответ #4 : 23-06-2003 19:29 » 

Дело в том, что при создании очередной формы в программе она привязывается к основной(смотря как создавать) и добавляется в список, не что иное как Screen.

Если, кстати, закрывать форму не close, destroy то всё работает.
Вот такая вот бадяга.

Интересно почему через close не закрывает?
Записан
Гром
Птычк. Тьфу, птычник... Вот!
Готовлюсь к пенсии

il
Offline Offline
Пол: Мужской
Бодрый птах


« Ответ #5 : 23-06-2003 20:17 » 

Возможно - если я правильно понимаю, WM_CLOSE аналог которого ты вызываешь в дельфи не закрывает окно безусловно...
Там есть цепочка проверяющая связи окна и т.д.
А WM_DESTROY - убивает безусловно...
Глянь разницу между ними в MSDN - у меня нет под рукой.
Записан

А птичку нашу прошу не обижать!!!
Aleck D.Shadow
Опытный

tr
Offline Offline
Пол: Мужской

« Ответ #6 : 24-06-2003 13:05 » 

Скорее всего так и есть. Так как проблему решил через Destroy, то соответственно вопрос снимаю.
Спасибо.
Записан
Anonymous
Гость
« Ответ #7 : 19-09-2003 10:53 » 

Цитата: Aleck D.Shadow
Вообще-то являются.
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
Опытный

tr
Offline Offline
Пол: Мужской

« Ответ #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 » 

Цитата: Aleck D.Shadow
To Гость: Наверное в 7 есть. Насчет удаления ручкам, то коли я сам создал то сам смогу и удалить!

Дыкть удаляй! Я так и не понял, по Free убиваются окна или нет? А по Release?  :?:
Записан
Aleck D.Shadow
Опытный

tr
Offline Offline
Пол: Мужской

« Ответ #11 : 24-09-2003 08:51 » 

To Var-Alex: Только по Destroy.
To KVlasov: Я примерно так и делаю. Спасибо.
Записан
kvlasov
Гость
« Ответ #12 : 24-09-2003 10:36 » 

Цитата: Aleck D.Shadow

Как будто проге нужно дать время, чтобы она закрыла окна.

Оно и есть. Протормозил.
Код:

  begin
    Screen.Forms[i(.Close;
    Application.ProcessMessages;
  end;
Записан
Aleck D.Shadow
Опытный

tr
Offline Offline
Пол: Мужской

« Ответ #13 : 24-09-2003 10:55 » 

Ну всё понятно. Жалко, но слишком поздно. Как обычно бывает хорошее решение приходит слишком поздно.

Спасибо.
Записан
Var-Alex
Гость
« Ответ #14 : 25-09-2003 09:56 » 

Цитата: Aleck D.Shadow
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 » 

Цитата: Aleck D.Shadow
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 » 

Цитата: Aleck D.Shadow
To Var-Alex: Только по Destroy.
To KVlasov: Я примерно так и делаю. Спасибо.

 :?:  :?:  :?:  :?:  :?:  :?:

Но ведь free это вызов destroy при self <> nil !!! Как оно там может не работать!??!!
Не пробовал смотреть почему Free не работает??!

а я-бы не так сделал:
while screen.formcount > 0 do Screen.Forms[0].free;
Записан
x77
Модератор

ro
Offline Offline
Пол: Мужской
меняю стакан шмали на обратный билет с Марса.


« Ответ #17 : 25-09-2003 10:19 » 

ну, если уж на то пошло, то именно для формы вызывать лучше не Free, и не Destroy, а Release. она ждёт, пока закончится обработка всех событий формы и всех её компонентов, а также перед закрытием формы отрабатывает всю очередь сообщений этой формы. хотя управление в вызваший метод возвращает сразу, не дожидаясь фактической отработки.
Записан

x77
Модератор

ro
Offline Offline
Пол: Мужской
меняю стакан шмали на обратный билет с Марса.


« Ответ #18 : 25-09-2003 10:23 » 

Aleck D.Shadow, и, кстати, есть он (release) и в седьмой, и в шестой, и в пятой. насчёт чётверки врать не буду, но сильно удивлюсь, если там его нет.
Записан

Aleck D.Shadow
Опытный

tr
Offline Offline
Пол: Мужской

« Ответ #19 : 25-09-2003 11:46 » 

Окей ребята спорить не буду. Короче я это дело забросил всвязи со срочной сменой направления деятельности.
Извините если что не так.
Всем благодарен.
Записан
Aleck D.Shadow
Опытный

tr
Offline Offline
Пол: Мужской

« Ответ #20 : 25-09-2003 11:48 » 

Кстати, Var-Alex, я твое сообщение ТРИ раза перечитал. А потом сообразил что это одно и тоже.  Отлично

Да я сегодня явно переработал....
Записан
Var-Alex
Гость
« Ответ #21 : 30-09-2003 04:29 » 

Ничего, бывает у всех ....  Ага
Записан
Viktor Denk
Участник

de
Offline 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 » 

Цитата: Aleck D.Shadow
To Var-Alex: Только по Destroy.
To KVlasov: Я примерно так и делаю. Спасибо.

 Ну это вообще-то очень странно. А ты не пробовал трассировать что происходит по вызову Free? Просто инетерсно, почему не рабоатет?
Записан
x77
Модератор

ro
Offline 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
Участник

de
Offline Offline

« Ответ #25 : 13-10-2003 08:24 » 

Цитата: x77
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
Модератор

ro
Offline 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
Участник

de
Offline Offline

« Ответ #27 : 13-10-2003 09:04 » 

Цитата: x77
Система может лететь к чертям по той причине, что вызов 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
Опытный

tr
Offline Offline
Пол: Мужской

« Ответ #28 : 13-10-2003 11:00 » 

Viktor Denk , а  ты и правда из Германии?
Записан
Var-Alex
Гость
« Ответ #29 : 14-10-2003 04:19 » 

Цитата: Viktor Denk
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, оно ведь для поддержки многопоточности придумано...

з.ы. А транслих это плохо очень... Хрен прочитаешь? Давай по русски, а?
Записан
Страниц: [1] 2  Все   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines