Открыта ли форма?

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

Открыта ли форма?

Сообщение sergey-911 » 26.02.2007 (Пн) 2:30

Доброго времени уважаемые. Прошу прощения за наивный вопрос!
Нужно узнать, загружена (открыта) ли форма?

Проверка
Код: Выделить всё

If frmPersonalADD.Visible = False Then

, соответственно, приводит к открытию формы, а не к желаемому результату!

Собственно суть задачи...
Есть форма1 с таблицей. Нажимаем "Добавить запись в таблице". Запускаем DoEvents (ожидание) на этой форме1, пока открыта форма2 для внесения изменений в БД. Как только форма2 закрывается, форма1 вносит изменения из БД в таблицу.

Короче, надо узнать, форма2 видна или нет?

Делаю сие событие через переменную "ADD ", но это неправильно...
Код: Выделить всё

'Форма1 (с таблицей) - "frmPersonal"
'-------------------------------------------------------
Option Explicit
Public ADD As Boolean   'Ожидание завершения формы
'-------------------------------------------------------
Private Sub mnuADD_Click()
On Error GoTo Er
   
    Consts.ID = Empty
    'Открываем форму для внесения изменений в БД
    frmPersonalADD.Show
    frmPersonalADD.ZOrder
    frmPersonalADD.Caption = "Персонал: Новый"
   
    'V Ожидание завершения формы-----------------------
    ADD = True
    Do
        If ADD = False Then
            'Приложение завершается!
            Exit Do
        End If
        DoEvents
    Loop While True
    'A Ожидание завершения формы-----------------------
   
    'Обновление набора записей в таблице
    ...
    ...
    ...
   
Exit Sub
Er:
Screen.MousePointer = vbDefault
MsgBox "Error " & Err.Number & ": " & Err.Description, vbOKOnly + vbCritical, "Error"
End Sub


Код: Выделить всё

'Форма2 (для добавления информации в БД) - "frmPersonalADD"
'-------------------------------------------------------
Private Sub Form_Unload(Cancel As Integer)
On Error GoTo Er

    'Завершаем ожидание цикла в предыдущей форме
    frmPersonal.ADD = False
   
Exit Sub
Er:
Screen.MousePointer = vbDefault
MsgBox "Error " & Err.Number & ": " & Err.Description, vbOKOnly + vbCritical, "Error"
End Sub


P.S. Обе формы чилдреновские[/syntax]
С уважением, Сергей.

sergey-911
Постоялец
Постоялец
 
Сообщения: 545
Зарегистрирован: 17.01.2005 (Пн) 19:10

Сообщение sergey-911 » 26.02.2007 (Пн) 2:33

Заодно ещё вопрос, как узнать список всех открытых форм?

Однажды пример попадался на глаза. Всё перерыл, не нашёл
С уважением, Сергей.

DirectXManiac
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1543
Зарегистрирован: 03.11.2005 (Чт) 13:32
Откуда: из DirectX SDK

Сообщение DirectXManiac » 26.02.2007 (Пн) 4:48

sergey-911
1. В аттаче пример!
2. EnumWindows :)
Вложения
Forms.rar
(1.42 Кб) Скачиваний: 91
#define ROFL 0xDDDD

sergey-911
Постоялец
Постоялец
 
Сообщения: 545
Зарегистрирован: 17.01.2005 (Пн) 19:10

Сообщение sergey-911 » 26.02.2007 (Пн) 7:34

Спасибо DirectXManiac!
С уважением, Сергей.

DirectXManiac
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1543
Зарегистрирован: 03.11.2005 (Чт) 13:32
Откуда: из DirectX SDK

Сообщение DirectXManiac » 26.02.2007 (Пн) 7:47

sergey-911
Незашто :D
2. Посмотри в API-Guide.
#define ROFL 0xDDDD

sergey-911
Постоялец
Постоялец
 
Сообщения: 545
Зарегистрирован: 17.01.2005 (Пн) 19:10

Сообщение sergey-911 » 26.02.2007 (Пн) 18:05

Прошу прощения, сразу не проверил на чилдреновских формах.
Данный пример корректно работает, если формы не чилдреновские. В противном случае, код
Код: Выделить всё

Private Sub Timer1_Timer()
    B = Form2.Visible
    If B Then
        Me.Circle (Rnd * 5000, Rnd * 5000), 50
    End If
End Sub

, приведенный в примере DirectXManiac-а, вызывает открытие формы2 вместо проверки на открытие.
В общем, предложенный вариант не подходит в данном случае. Нужно другое решение.
В аттаче пример данной проблемы!
Вложения
Forms.rar
пример данной проблемы
(1.74 Кб) Скачиваний: 55
С уважением, Сергей.

dr.MIG
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1441
Зарегистрирован: 18.12.2004 (Сб) 9:53
Откуда: г.Ярославль

Сообщение dr.MIG » 26.02.2007 (Пн) 21:09

А нельзя устанавливать значение какой-нибудь Boolean-переменной каждый раз когда форма делается видимой в True, а когда невидимой - в False, а затем проверять значение этой переменной?
Salus populi suprema lex

sergey-911
Постоялец
Постоялец
 
Сообщения: 545
Зарегистрирован: 17.01.2005 (Пн) 19:10

Сообщение sergey-911 » 26.02.2007 (Пн) 22:59

Можно. Я так и делаю. См. внимательно первый пример
Public ADD As Boolean 'Ожидание завершения формы

Но так неудобно, т.к. форм таких очень много, и каждая из них вызывает ещё кучу форм... Вот и хотелось без лишних переменных...
Неужели нельзя у дочерних форм узнать, открыты они, или нет...? :evil:
С уважением, Сергей.

DirectXManiac
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1543
Зарегистрирован: 03.11.2005 (Чт) 13:32
Откуда: из DirectX SDK

Сообщение DirectXManiac » 27.02.2007 (Вт) 5:46

sergey-911
Можно! Если правильно их создавать то можно. Если создавать
Dim newform As New frmADD
newform.Show
Создай такой массив и при создании нового окна увеличивай массив на 1. Потом проверяй из массив нужное тебе окно! Можно вообще коллекцией - но это изврат ИМХО!
#define ROFL 0xDDDD

sergey-911
Постоялец
Постоялец
 
Сообщения: 545
Зарегистрирован: 17.01.2005 (Пн) 19:10

Сообщение sergey-911 » 27.02.2007 (Вт) 7:45

DirectXManiac
Предложенный тобой способ
Dim newform As New frmADD
newform.Show

мне не подходит. Есть свои особенности. А чем способ открытия форм
Код: Выделить всё
    frmPersonalADD.Show
    frmPersonalADD.ZOrder

не правильный?
Но это так, к топику не относится.
DirectXManiac
, подскажи, как коллекцией? У меня же не массив форм?
С уважением, Сергей.

EUGY
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 214
Зарегистрирован: 09.11.2006 (Чт) 22:51
Откуда: Мурманск

Сообщение EUGY » 27.02.2007 (Вт) 20:47

'Может поможет?
Private Function IsFormaObject(frmstr As String) As Boolean

For x = 0 To Forms.Count - 1
If Forms(x).Name = frmstr Then
IsFormaObject = True
Exit Function
End if
Next
IsFormaObject = False
End Function
...
Debug.Print IsFormaObject("frmPersonalADD")
...

sergey-911
Постоялец
Постоялец
 
Сообщения: 545
Зарегистрирован: 17.01.2005 (Пн) 19:10

Сообщение sergey-911 » 27.02.2007 (Вт) 22:14

EUGY
Спасибо тебе БОЛЬШУЩЕЕ! :D
РАБОТАЕТ! :D
С уважением, Сергей.

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 28.02.2007 (Ср) 9:05

2 EUGY

Dim frm1 As frmPersonalADD
Set frm1 = New frmPersonalADD
Load frm1
...
Dim frm2 As frmPersonalADD
Set frm2 = New frmPersonalADD
Load frm2
Lasciate ogni speranza, voi ch'entrate.

sergey-911
Постоялец
Постоялец
 
Сообщения: 545
Зарегистрирован: 17.01.2005 (Пн) 19:10

Сообщение sergey-911 » 01.03.2007 (Чт) 4:39

Не alibek, в данном случае, пользователю не нужно открывать две одинаковые формы.
Приложение имеет аксесовский интерфейс, и, когда мы щелкоем по иконке, фссоциируемой с формой, должна загрузиться именно нужная форма, если она не загружена, а если загруженф, то отобразиться.
Поэтому, делаю так:
Код: Выделить всё
frmPersonalADD.Show
frmPersonalADD.ZOrder

http://bbs.vbstreets.ru/viewtopic.php?t=26261
С уважением, Сергей.

sergey-911
Постоялец
Постоялец
 
Сообщения: 545
Зарегистрирован: 17.01.2005 (Пн) 19:10

Сообщение sergey-911 » 01.03.2007 (Чт) 4:44

Всеь спасибо за помощь :)
С уважением, Сергей.

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

Сообщение Vi » 01.03.2007 (Чт) 7:39

Так может так переделать?
Код: Выделить всё
Private Function IsFormaObject(ByVal frm As Object) As Boolean
  Dim frmInForms As Object ' а если вместо Object использовать Form?

  For Each frmInForms In Forms
    If frmInForms Is frm Then

      IsFormaObject = True
      Exit Function

    End if
  Next
End Function
Vita
Выше головы не прыгнешь, ниже земли не упадешь, дальше границы не убежишь! (с) КВН

EUGY
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 214
Зарегистрирован: 09.11.2006 (Чт) 22:51
Откуда: Мурманск

Сообщение EUGY » 01.03.2007 (Чт) 8:20

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

sergey-911
Постоялец
Постоялец
 
Сообщения: 545
Зарегистрирован: 17.01.2005 (Пн) 19:10

Сообщение sergey-911 » 01.03.2007 (Чт) 19:24

Точно EUGY!
С уважением, Сергей.


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

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

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

    TopList  
cron