Как определить, показана ли форма модально при переборе форм

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Space
Combo-маньяк
Combo-маньяк
 
Сообщения: 818
Зарегистрирован: 11.01.2007 (Чт) 1:19
Откуда: Украина

Как определить, показана ли форма модально при переборе форм

Сообщение Space » 26.02.2009 (Чт) 5:38

?

Viper
Артефакт VBStreets
Артефакт VBStreets
Аватара пользователя
 
Сообщения: 4394
Зарегистрирован: 12.04.2005 (Вт) 17:50
Откуда: Н.Новгород

Re: Как определить, показана ли форма модально при переборе форм

Сообщение Viper » 26.02.2009 (Чт) 8:20

А никак (ИМХО), разве что флаг ей ставить.
Весь мир матрица, а мы в нем потоки байтов!

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Как определить, показана ли форма модально при переборе форм

Сообщение Хакер » 26.02.2009 (Чт) 11:12

А откуда осуществляется перебор форм? Из кода этой модальной формы ведь?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Viper
Артефакт VBStreets
Артефакт VBStreets
Аватара пользователя
 
Сообщения: 4394
Зарегистрирован: 12.04.2005 (Вт) 17:50
Откуда: Н.Новгород

Re: Как определить, показана ли форма модально при переборе форм

Сообщение Viper » 26.02.2009 (Чт) 12:43

Хакер писал(а):А откуда осуществляется перебор форм? Из кода этой модальной формы ведь?
Кстати, да. Больше то неоткуда. Только ведь форма может и не знать о своей модальности.
З.Ы. ЕМНИП, было обсуждение такого вопроса лет несколько назад. Только вот не помню, а нашли ли решение.
Весь мир матрица, а мы в нем потоки байтов!

Space
Combo-маньяк
Combo-маньяк
 
Сообщения: 818
Зарегистрирован: 11.01.2007 (Чт) 1:19
Откуда: Украина

Re: Как определить, показана ли форма модально при переборе форм

Сообщение Space » 26.02.2009 (Чт) 16:44

из процедуры обработки клика на иконке в трее. У меня возникло желание скрывать все формы проекта при этом действии (модальные и нет) и показывать обратно. Тут и возник такой вопрос...

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Как определить, показана ли форма модально при переборе форм

Сообщение Хакер » 26.02.2009 (Чт) 17:14

Плохое желание. И непонятно, кроме того, зачем определять.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

ANDLL
Великий гастроном
Великий гастроном
Аватара пользователя
 
Сообщения: 3450
Зарегистрирован: 29.06.2003 (Вс) 18:55

Re: Как определить, показана ли форма модально при переборе форм

Сообщение ANDLL » 26.02.2009 (Чт) 17:15

Кстати, да. Больше то неоткуда.
Почему неоткуда? :roll:
Гастрономия - наука о пище, о ее приготовлении, употреблении, переварении и испражнении.
Блог

Space
Combo-маньяк
Combo-маньяк
 
Сообщения: 818
Зарегистрирован: 11.01.2007 (Чт) 1:19
Откуда: Украина

Re: Как определить, показана ли форма модально при переборе форм

Сообщение Space » 26.02.2009 (Чт) 17:35

Хакер, чё тут непонятного? Чтобы показать окна обратно, надо знать, как была показана форма, так и показать. Кстати, какие преимущества имеет показ форм с указанием родителя (frm.Show vbModal, Me) в сравнении с простым frm.Show vbModal, кроме того, что при выгрузке родителя выгружается и ребёнок?

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Как определить, показана ли форма модально при переборе форм

Сообщение Хакер » 26.02.2009 (Чт) 20:15

ANDLL, потому что при модальном вызове внутри Show инициируется Message-pumping-loop (MPL), который крутится до закрытия модального окна. Возврат в callee не происходит до этого, так что единственный код, который может при этом выполняться, это код, вызванный (косвенно) из MPL. MPL вызывает DispatchMessage для выкачанных сообщений, она в свою очередь вызывает WindowProc, WindowProc же вызывает обработчики событий. Обработчики событий тоже что-то вызывают.

Если смотреть на call-tree, то в период показа модальной формы выполнение не может выйти выше MP-цикла. Если рассматривать только тот код, который написан автором, то можно сказать, что выполнение не может выйти выше обработчиков событий модального окна. Т.е. когда модальное окно показывается, перечисление всех окон в принципе в любом случае производится из обработчиков событий этого окна прямо (т.е. непосредственно) или косвенно (т.е. в обработчики вызвана процедура A, оттуда процедура B, а уже внутри B перечисление).
Это если не выходить за рамки VB. Автор-то вышел.

чё тут непонятного? Чтобы показать окна обратно, надо знать, как была показана форма, так и показать.

Space, архитектура приложения фиговая значит, раз такие проблемы возникают.
с указанием родителя (frm.Show vbModal, Me) в сравнении с простым frm.Show vbModal, кроме того, что при выгрузке родителя выгружается и ребёнок?

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

А отношения родителя и ребёнка это совсем другие отношения. Например если на форме нарисовать PictureBox, а в нём нарисовать кнопку, то главное окно по отношению к PictureBox — родитель, а PictureBox по отношению к главному окну — ребёнок. В то же время PictureBox — родитель по отношению к кнопке, а кнопка — ребёнок PictureBox-а. Отношение это не транзитивно, т.е. кнопка не ребёнок главного окна, хотя безусловно потомок.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Vi
Постоялец
Постоялец
 
Сообщения: 739
Зарегистрирован: 25.01.2002 (Пт) 11:03
Откуда: Россия, Ижевск

Re: Как определить, показана ли форма модально при переборе форм

Сообщение Vi » 27.02.2009 (Пт) 10:19

Для Хакер:
Код: Выделить всё
' на форму брось таймер

Private Sub Form_Click()
  Dim f As New Form1
  f.Show vbModal, Me
End Sub

Private Sub Timer1_Timer()
  Me.Caption = Date & " " & Time
End Sub

При клике на форму появится новая форма, но во всех будут меняться Заголовки.

PS
Забыл про тему написать.

AFAIR, окна под модальным имеют атрибут WS_DISABLED.
#define WS_DISABLED 0x08000000L
и могут быть проверены IsWindowEnabled.
Vita
Выше головы не прыгнешь, ниже земли не упадешь, дальше границы не убежишь! (с) КВН

Space
Combo-маньяк
Combo-маньяк
 
Сообщения: 818
Зарегистрирован: 11.01.2007 (Чт) 1:19
Откуда: Украина

Re: Как определить, показана ли форма модально при переборе форм

Сообщение Space » 27.02.2009 (Пт) 22:38

а есть ли альтернатива frm.Show vbModal, Me, но чтобы выполнение кода продолжилось после вызова frm.Show vbModal, Me?

Viper
Артефакт VBStreets
Артефакт VBStreets
Аватара пользователя
 
Сообщения: 4394
Зарегистрирован: 12.04.2005 (Вт) 17:50
Откуда: Н.Новгород

Re: Как определить, показана ли форма модально при переборе форм

Сообщение Viper » 28.02.2009 (Сб) 7:18

Space писал(а):а есть ли альтернатива frm.Show vbModal, Me, но чтобы выполнение кода продолжилось после вызова frm.Show vbModal, Me?
Уж что нибудь одно - либо продолжение выполнения кода после отображения формы, либо модальное отображение формы.
Весь мир матрица, а мы в нем потоки байтов!

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Re: Как определить, показана ли форма модально при переборе форм

Сообщение tyomitch » 28.02.2009 (Сб) 12:04

Viper писал(а):
Space писал(а):а есть ли альтернатива frm.Show vbModal, Me, но чтобы выполнение кода продолжилось после вызова frm.Show vbModal, Me?
Уж что нибудь одно - либо продолжение выполнения кода после отображения формы, либо модальное отображение формы.

Между тем, есть и без проблем.
Показать немодально как owned и задизаблить все остальные окна.
Изображение

Space
Combo-маньяк
Combo-маньяк
 
Сообщения: 818
Зарегистрирован: 11.01.2007 (Чт) 1:19
Откуда: Украина

Re: Как определить, показана ли форма модально при переборе форм

Сообщение Space » 28.02.2009 (Сб) 17:22

задизаблить - это Enabled=False или что ты имел ввиду? Нет, этот вариант сложноватый в плане того, что надо будет устанавливать Enabled=True после закрытия активного окна, определяя как-то, какое окно будет активно следующим (интересно, какое, если бы мы оставили всем окнам Enabled=False?)
Viper, мне надо завершить выполнение цикла и процедуры после frm.Show vbModal, Me и всё, дальше окно как модальное не должно давать доступа к другим окнам и всё как обычно...

iGrok
Артефакт VBStreets
Артефакт VBStreets
 
Сообщения: 4272
Зарегистрирован: 10.05.2007 (Чт) 16:11
Откуда: Сетевое сознание

Re: Как определить, показана ли форма модально при переборе форм

Сообщение iGrok » 28.02.2009 (Сб) 22:28

Space писал(а):Viper, мне надо завершить выполнение цикла и процедуры после frm.Show vbModal, Me и всё, дальше окно как модальное не должно давать доступа к другим окнам и всё как обычно...

И при этом что-то тебе мешает сначала завершить цикл, а потом показать окно?
label:
cli
jmp label

Space
Combo-маньяк
Combo-маньяк
 
Сообщения: 818
Зарегистрирован: 11.01.2007 (Чт) 1:19
Откуда: Украина

Re: Как определить, показана ли форма модально при переборе форм

Сообщение Space » 28.02.2009 (Сб) 23:01

конечно, иначе бы и вопроса не возникало...

iGrok
Артефакт VBStreets
Артефакт VBStreets
 
Сообщения: 4272
Зарегистрирован: 10.05.2007 (Чт) 16:11
Откуда: Сетевое сознание

Re: Как определить, показана ли форма модально при переборе форм

Сообщение iGrok » 28.02.2009 (Сб) 23:59

И это совсем никак неодолимое что-то?
label:
cli
jmp label

Vi
Постоялец
Постоялец
 
Сообщения: 739
Зарегистрирован: 25.01.2002 (Пт) 11:03
Откуда: Россия, Ижевск

Re: Как определить, показана ли форма модально при переборе форм

Сообщение Vi » 05.03.2009 (Чт) 9:37

Между прочим, есть простой и ясный путь запуска немодальной формы, иммитирующий модальность. Правильно говорит tyomitch: нужно Показать немодально как owned и задизаблить все остальные окна. А момент определить просто - по событиям.
Код: Выделить всё
Dim WithEvents slvfrm As Form

' 0 - Modeless, 1 - Modal
Private Sub Command1_Click(Index As Integer)
  Dim frm As New frmSurModal2
  If Index = 0 Then
    Set slvfrm = frm
    frm.Show vbModeless, Me
  Else
    frm.Show vbModal, Me
  End If
End Sub

Private Sub slvfrm_Load()
  Me.Enabled = False
End Sub

Private Sub slvfrm_Unload(Cancel As Integer)
  Me.Enabled = Not CBool(Cancel)
  If Me.Enabled Then
    Set slvfrm = Nothing
  End If
End Sub

Как-то так.
Vita
Выше головы не прыгнешь, ниже земли не упадешь, дальше границы не убежишь! (с) КВН


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: Google-бот и гости: 50

    TopList