Повторное нажатие на кнопку панели инструментов

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Чудик
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 639
Зарегистрирован: 06.07.2004 (Вт) 12:18
Откуда: г. Егорьевск

Повторное нажатие на кнопку панели инструментов

Сообщение Чудик » 04.09.2005 (Вс) 16:11

Хотел сделать так, чтобы при повторном нажатии на кнопке панели инстументов открытое дочернее окно активизировалось (кнопка на паанели служит именно для открытия определенной дочерней формы). До сих пор просто при таком повторном нажатии ничего не происходило.
Сделал так
Код: Выделить всё
Private Function CheckWindow(NameForm As String)
Dim frm As Form
For Each frm In Forms
  If frm.name = NameForm Then
    CheckWindow(NameForm) = 1
  End If
Next frm
End Function

и так
Код: Выделить всё
   Case "ProductQuery"
            NameForm = "frmProductQuery"
            If CheckWindow(NameForm) = 1 Then
                  frmProductQuery.SetFocus
                  Exit Sub
            End If
            Load frmProductQuery
            frmProductQuery.Show


При таком коде в режиме отладки все работает как положено - при повторном нажатии на кнопке из множества открытых форм активизируется именно нужное. Но стоит проект откомпелировать - при повторном нажатии вся запущенная программа резко закрывается без выдачи какого-либо сообщения об ошибке ...
Век живи - век учись!
www.detal-plast.narod.ru

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

Сообщение tyomitch » 04.09.2005 (Вс) 16:14

Не могу не прокомментировать, что в VB есть тип данных Boolean, который здесь подходит гораздо больше, чем Variant...

По топику ничего не подскажу :-(
Изображение

Amed
Алфизик
Алфизик
 
Сообщения: 5346
Зарегистрирован: 09.03.2003 (Вс) 9:26

Сообщение Amed » 04.09.2005 (Вс) 16:49

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

Чудик
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 639
Зарегистрирован: 06.07.2004 (Вт) 12:18
Откуда: г. Егорьевск

Сообщение Чудик » 04.09.2005 (Вс) 16:58

Про Boolean согласен.
Про создание логов для выполняемых операций не имею представления. Можно как-то раскрыть суть?
Век живи - век учись!
www.detal-plast.narod.ru

Amed
Алфизик
Алфизик
 
Сообщения: 5346
Зарегистрирован: 09.03.2003 (Вс) 9:26

Сообщение Amed » 04.09.2005 (Вс) 17:07

Самое простое.

Код: Выделить всё
Private Sub WriteLog(strLogString As String)
Dim FF As Long
FF = FreeFile
Open "C:\a.log" For Append As #FF
Print #FF, Now & strLogString
Close #FF
End Sub


А в приведенном коде вставить после каждой строки запись лога:

Код: Выделить всё
   Case "ProductQuery"
            NameForm = "frmProductQuery"
            WriteLog "Set NameForm"
            If CheckWindow(NameForm) = 1 Then
                 WriteLog "Checked window: " & NameForm
                  frmProductQuery.SetFocus
                  WriteLog "SetFocus on " &  NameForm
                  Exit Sub
            End If
            Load frmProductQuery
            WriteLog "Loaded " &  NameForm
            frmProductQuery.Show
            WriteLog "Shown " & NameForm


И проанализировать файл на выходе.

Чудик
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 639
Зарегистрирован: 06.07.2004 (Вт) 12:18
Откуда: г. Егорьевск

Сообщение Чудик » 04.09.2005 (Вс) 17:42

Ерунда какая-то!
Сделал как посоветовал, все работает, правда алгоритм выполняется 49 секунд!
При более подробном анализе увидел что при операции присвоения функции CheckWindow значения равного единице программа перескакивает на строку
Код: Выделить всё
For Each frm In Forms

что приводит к зацикливанию программы на эти 49 секунд, после чего все-таки прога выходит из цикла и окно активируется!
Как результат появились такие вопросы:
1. почему происходит перескок?
2. почему прога работает, в то время как без произведения записей в лог она просто закрывается на каком-то моменте?
Век живи - век учись!
www.detal-plast.narod.ru

Amed
Алфизик
Алфизик
 
Сообщения: 5346
Зарегистрирован: 09.03.2003 (Вс) 9:26

Сообщение Amed » 04.09.2005 (Вс) 17:49

Почему перескакивает? А так и должно. После присвоения функции значения она же не прекращает выполнения.
Надо писать

Private Function CheckWindow(NameForm As String)
Dim frm As Form
For Each frm In Forms
If frm.name = NameForm Then
CheckWindow(NameForm) = 1
Exit Function
End If
Next frm
End Function

Сколько форм в проекте? Модальные есть? MDI-формы есть?

Закрываться может, потому что какое-то окно нельзя акивизировать, например.

Чудик
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 639
Зарегистрирован: 06.07.2004 (Вт) 12:18
Откуда: г. Егорьевск

Сообщение Чудик » 04.09.2005 (Вс) 17:59

Там, где ты указал Exit Function я на время тестирования поставил Exit For. Но и Exit Function и Exit For ничего не меняет - зацикливание на 49 секунд имеет место и не проходит.
Прога имеет MDI форму и несколько дочерних форм (более 10). в режиме моделирования модальных форм не создавал.
Век живи - век учись!
www.detal-plast.narod.ru

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

Сообщение tyomitch » 04.09.2005 (Вс) 18:04

Amed писал(а):Почему перескакивает? А так и должно. После присвоения функции значения она же не прекращает выполнения.
Надо писать

Private Function CheckWindow(NameForm As String)
Dim frm As Form
For Each frm In Forms
If frm.name = NameForm Then
CheckWindow(NameForm) = 1
Exit Function
End If
Next frm
End Function

Щелбан за невнимательность.
Рассмотри внимательно, что делает строка: "CheckWindow(NameForm) = 1"
А вылетает прога, если кто ещё не догадался, от переполнения стека.

ЗЫ: если бы вместо Варинатов были Булеаны, то ничего этого не было бы.
Изображение

Amed
Алфизик
Алфизик
 
Сообщения: 5346
Зарегистрирован: 09.03.2003 (Вс) 9:26

Сообщение Amed » 04.09.2005 (Вс) 18:06

Точно. Щелбан, значит?
Афигеть, дайте два.
Последний раз редактировалось Amed 04.09.2005 (Вс) 18:24, всего редактировалось 1 раз.

Чудик
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 639
Зарегистрирован: 06.07.2004 (Вт) 12:18
Откуда: г. Егорьевск

Сообщение Чудик » 04.09.2005 (Вс) 18:20

tyomitch, ты прав ....
Надо не так
Код: Выделить всё
CheckWindow(NameForm) = 1

а так
Код: Выделить всё
CheckWindow = 1

Спасибо.
Век живи - век учись!
www.detal-plast.narod.ru


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

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

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

    TopList