Конференція vbstreets - перегляд теми - як правильно закрити форму

Підкажіть, як правильно вивантажити форму, щоб 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

то залишаються виведені форми, і кожну потрібно закривати окремо. Втрачається сенс "зручності".

От якось так. Можна, звичайно, тупо через меню викликати кожну форму, і окремо кожну закривати. Але - ПКО і довідка взаємопов'язані, хотілося б і для користувача їх логічно зв'язати.
Підкаже хто що? Окремо прохання до Хакер у - пожалйста, чи не відправляй мене в Пошук. Я там вже був.

Osteon писал (а): alibek. я чайник в VB, цього не приховую. Але і VB6 не знає, що таке .Prepare


Іноді при ініціалізації форми необхідно викликати в ній якусь процедуру. Яка, наприклад, смикне БД, і занесе в списки можливі значення, і так далі - цю процедуру alibek умовно назвав Prepare. Її ти повинен написати. Її може і не бути. Тоді, природно, її і викликати не треба. Можна код написати в подію Initialize / Load / Show форми - тут це не має значення (гуру, якщо це не так, поправте).

Програміст - це локальний бог (С) Я

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

Боротися і шукати, знайти і переховати

Вона чо. Врубався тепер. Спасибо-преспасібо.
Тобто під
Код: Виділити все frm.Prepare 'якщо у форми є ініціалізація
шановний alibek мав на увазі що виробляється перевірка, не завантажена чи форма раніше?

Ні.
Я мав на увазі, що в коді форми можна оголосити публічну функцію 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.