Как правильно закрыть форму

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

Как правильно закрыть форму

Сообщение Osteon » 11.02.2016 (Чт) 16:31

Здравствуйте.

Подскажите, как правильно выгрузить форму, чтобы VB6 не матерился?

Имеем первичную MDI-форму.

Из меню вызываю форму печати приходно-кассового ордера (frmPKO).
Код: Выделить всё
Private Sub mnuPKOrderItem_Click() 'заполнение и печать приходного кассового ордера
    frmPKO.Show vbModal
End Sub

Так же из меню (пока) вызываю форму печати справки в ИФНС.
Код: Выделить всё
Private Sub mnuIFNSItem_Click()'заполнение и печать справки в ИФНС
    frmIFNS.Show vbModal
End Sub

По отдельности все работает.

Для удобства хочу по окончании печати ПКО из этой же формы вызвать печать справки в ИФНС.
Код: Выделить всё
If MsgBox("Печатаем справку в ИФНС?", vbYesNo + vbQuestion, "Печать справки") = vbYes Then
   frmIFNS.Show vbModal
End If


И здесь начинается мозгоклюйство:
Код: Выделить всё
Dim rsIFNS As ADODB.Recordset
'заполняем поле "Сумма платежа"
Set rsIFNS = New ADODB.Recordset
    sSQL = "SELECT * FROM PKO WHERE nKart = '" & numKart & "'"
        rsIFNS.Open sSQL, cnDB, adOpenStatic, adLockReadOnly
        If rsIFNS.recordCount = 0 Then 'необходимо сначала выписать ПКО
           MsgBox "Для " & txtFIOnp.Text & vbNewLine & "не выписан кассовый ордер!", vbCritical, "Не выписан ПКО"
          'варианты************   
           cmdExit_Click
          'Set rsIFNS = Nothing
          'Unload Me
          'Exit Sub
          'варианты************
        End If
rsIFNS.Close

Private Sub cmdExit_Click()
    Set rsIFNS = Nothing:    Unload Me
End Sub


Если я выхожу через cmdExit_Click(), или нахально из процедуры выгружаю форму, то выдается ошибка 364 - объект уже выгружен.
'вариант 1:
Код: Выделить всё
           cmdExit_Click
           'Set rsIFNS = Nothing
           'Unload Me

'вариант 2:
Код: Выделить всё
           'cmdExit_Click
           Set rsIFNS = Nothing
           Unload Me


Если выхожу через (вариант 3)
Код: Выделить всё
          'cmdExit_Click
          'Set rsIFNS = Nothing
          'Unload Me
          Exit Sub


то остаются выведенные формы, и каждую нужно закрывать отдельно. Теряется смысл "удобства".

Вот как-то так. Можно, конечно, тупо через меню вызывать каждую форму, и отдельно каждую закрывать. Но - ПКО и справка взаимосвязаны, хотелось бы и для юзера их логически связать.
Подскажет кто что? Отдельно просьба к Хакеру - пожалйста, не отправляй меня в Поиск. Я там уже был.

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

Re: Как правильно закрыть форму

Сообщение alibek » 11.02.2016 (Чт) 16:35

Код: Выделить всё
Dim frm as frmPKO
Set frm = New frmPKO
Load frm
frm.Prepare 'если у формы есть инициализация
frm.Show vbModal
...
Unload frm
Set frm = Nothing
Lasciate ogni speranza, voi ch'entrate.

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

Re: Как правильно закрыть форму

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

Osteon писал(а):Отдельно просьба к Хакеру - пожалйста, не отправляй меня в Поиск.

Пфф... я бы постыдился такие вещи писать.
Я даже сути вопроса/проблемы не понял полноценно.

Но понял, что кое-кому стоит отложить работу над унылыми офисными приложениями и научиться базовым понятиям. Базовым вещам в программированию. Базовому пониманию ООП. Пониманию устройства механизма форм в VB. Понимание
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Osteon
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 122
Зарегистрирован: 17.01.2013 (Чт) 5:53

Re: Как правильно закрыть форму

Сообщение Osteon » 12.02.2016 (Пт) 10:30

Хакер писал(а):Пфф... я бы постыдился такие вещи писать.

Ну куда нам, колхозникам, понять вашу тонкую духовную организацию...
Хакер писал(а):Я даже сути вопроса/проблемы не понял полноценно.

А alibek понял. Спасибо, alibek!

Osteon
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 122
Зарегистрирован: 17.01.2013 (Чт) 5:53

Re: Как правильно закрыть форму

Сообщение Osteon » 12.02.2016 (Пт) 14:04

alibek, я чайник в VB, этого не скрываю. Но и VB6 не знает, что такое .Prepare :( :scratch:
11.jpg
11.jpg (74.02 Кб) Просмотров: 3456

Debugger
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1667
Зарегистрирован: 17.06.2006 (Сб) 15:11

Re: Как правильно закрыть форму

Сообщение Debugger » 12.02.2016 (Пт) 15:37

Osteon писал(а):alibek, я чайник в VB, этого не скрываю. Но и VB6 не знает, что такое .Prepare :( :scratch:
11.jpg

Иногда при инициализации формы необходимо вызвать в ней какую-то процедуру. Которая, например, дернет БД, и занесет в списки возможные значения, и так далее - эту процедуру alibek условно назвал Prepare. Её ты должен написать. Её может и не быть. Тогда, естественно, её и вызывать не надо. Можно код написать в событии Initialize/Load/Show формы - тут это не имеет значения (гуру, если это не так, поправьте).

ger_kar
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1957
Зарегистрирован: 19.05.2011 (Чт) 19:23
Откуда: Кыргызстан, Иссык-Куль, г. Каракол

Re: Как правильно закрыть форму

Сообщение ger_kar » 12.02.2016 (Пт) 15:54

Ну я тоже подозреваю, что что под методом .Prepare подразумевается не встроенный метод, а пользовательский (т.е. метод написанный пользователем) для некой процедуры инициализации.
Бороться и искать, найти и перепрятать

Osteon
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 122
Зарегистрирован: 17.01.2013 (Чт) 5:53

Re: Как правильно закрыть форму

Сообщение Osteon » 14.02.2016 (Вс) 10:39

Вона чо... :roll: Врубился теперь. Спасибо-преспасибо.
Т.е., под
Код: Выделить всё
frm.Prepare 'если у формы есть инициализация

уважаемый alibek имел в виду что производится проверка, не загружена ли форма ранее?

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

Re: Как правильно закрыть форму

Сообщение alibek » 14.02.2016 (Вс) 12:21

Нет.
Я имел ввиду, что в коде формы можно объявить публичную функцию Prepare, которая будет выполнять какие-то подготовительные действия, предшествующие отображению формы. Например инициализировать подключение к БД или проверять права доступа.
Код: Выделить всё
...
If frm.Prepare() Then
  frm.Show vbModal
Else
  MsgBox "Отмена операции, причина: " & frm.Tag
End If
Unload frm
Set frm = Nothing
Lasciate ogni speranza, voi ch'entrate.

Osteon
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 122
Зарегистрирован: 17.01.2013 (Чт) 5:53

Re: Как правильно закрыть форму

Сообщение Osteon » 16.02.2016 (Вт) 10:24

Ясненько. Спасибо. :)


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

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

Сейчас этот форум просматривают: SemrushBot и гости: 94

    TopList