runtime error '5' при закрытии модального окна

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

runtime error '5' при закрытии модального окна

Сообщение clou » 16.05.2005 (Пн) 14:44

http://support.microsoft.com/kb/171516/EN-US здесь изложена похожая ситуация
Суть в том что не рекомендовано использование в DLL модальные окна
При закрытии окна вываливается ошибка
всего в проекте 5 модальных окон, каждое при закрытие глючит
Если убрать одно из них из проекта то все остальные будут норамально закрываться.
Как можно обойти такую проблему
Заранее спасибо

codemaster
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 604
Зарегистрирован: 13.02.2004 (Пт) 13:35

Re: runtime error '5' при закрытии модального окна

Сообщение codemaster » 16.05.2005 (Пн) 15:01

clou писал(а):http://support.microsoft.com/kb/171516/EN-US здесь изложена похожая ситуация
Суть в том что не рекомендовано использование в DLL модальные


Покажи код где ты создаеш мод. форму
//<-
Mit freundlichen Grüßen
//->

clou
Начинающий
Начинающий
 
Сообщения: 17
Зарегистрирован: 16.05.2005 (Пн) 14:34

Сообщение clou » 16.05.2005 (Пн) 15:11

я ее если даже не создаю а вызываю готовую frmExampl.show vbmodal при ее закрытии, она выдает ошибку, да еще забыл использую VB6 S.P.6

Igor_123
Осторожный Баянист
Осторожный Баянист
Аватара пользователя
 
Сообщения: 1325
Зарегистрирован: 21.07.2004 (Ср) 13:00
Откуда: Днепропетровск

Сообщение Igor_123 » 16.05.2005 (Пн) 15:20

Код покажи.
Водки я вам не обещаю, но погуляем хорошо.
И. Сусанин.

Аватара (с) Тёмыч

Konst_One
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
Аватара пользователя
 
Сообщения: 3041
Зарегистрирован: 09.04.2004 (Пт) 13:47
Откуда: Химки

Сообщение Konst_One » 16.05.2005 (Пн) 15:20

все открытые тобой объекты должны быть освобождены при завершении работы программы

если у тебя dll, то в коде Terminate принудительно убивай все объекты и выгружай формы, а в формах в QueryUnload делай тоже самое

clou
Начинающий
Начинающий
 
Сообщения: 17
Зарегистрирован: 16.05.2005 (Пн) 14:34

Сообщение clou » 16.05.2005 (Пн) 15:23

а как их убить ( недавно занимаюсь программированием)

Igor_123
Осторожный Баянист
Осторожный Баянист
Аватара пользователя
 
Сообщения: 1325
Зарегистрирован: 21.07.2004 (Ср) 13:00
Откуда: Днепропетровск

Сообщение Igor_123 » 16.05.2005 (Пн) 15:38

Все что было Load делаешь Unload
все что было New делаешь Set varname = Nothing
Водки я вам не обещаю, но погуляем хорошо.
И. Сусанин.

Аватара (с) Тёмыч

clou
Начинающий
Начинающий
 
Сообщения: 17
Зарегистрирован: 16.05.2005 (Пн) 14:34

Сообщение clou » 16.05.2005 (Пн) 15:44

в вызываемой форме отсутствуют какие либо параметры, при закрытии модальной формы например по кнопке - unload me(или имя формы) происходит ошибка, может можно как нибудь сделать например вместо формы модальной делать видимым какойнибудь фрейм, на которой кнопка "ОК" и др данные, по клику на ОК скрыть ее обратно, но как заставить программу ждать данные по таймеру или как?

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

Сообщение tyomitch » 16.05.2005 (Пн) 16:01

Igor_123 писал(а):Код покажи.

Присоединяюсь. Без кода ничего не понятно.
Изображение

clou
Начинающий
Начинающий
 
Сообщения: 17
Зарегистрирован: 16.05.2005 (Пн) 14:34

Сообщение clou » 16.05.2005 (Пн) 16:15

Project activeX Dll состоит из пяти форм
form1
Private Sub Command1_Click()
Form6.Show vbmodal
End Sub

вторая форма пустая - закрываем ее по крестику, появляется ошибка
всего форм у меня 5 все вызываю так как выше
в формах на кнопках выход стоит unload me или (form_name)
все прекрасно работает если в проекте форм 5 (вызываю в разное время)
как только я добовляю 6 ни одна из них больше нормально не выгружается

clou
Начинающий
Начинающий
 
Сообщения: 17
Зарегистрирован: 16.05.2005 (Пн) 14:34

Сообщение clou » 16.05.2005 (Пн) 16:22

примерно все так:
Private Sub Command1_Click()
Form1.Show vbModal
End Sub

Private Sub Command2_Click()
Form2.Show vbModal
End Sub

Private Sub Command3_Click()
Form3.Show vbModal
End Sub

Private Sub Command4_Click()
Form4.Show vbModal
End Sub

Private Sub Command5_Click()
Form5.Show vbModal
End Sub

в каждой форме кнопка Exit
Private Sub Exit_Click()
unload me
end sub
то есть ошибка всплывает на "голом месте" при закрытии любой формы если добавить еще одну форму в проект

Konst_One
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
Аватара пользователя
 
Сообщения: 3041
Зарегистрирован: 09.04.2004 (Пт) 13:47
Откуда: Химки

Сообщение Konst_One » 16.05.2005 (Пн) 16:28

это код из какой по счету формы :?:

clou
Начинающий
Начинающий
 
Сообщения: 17
Зарегистрирован: 16.05.2005 (Пн) 14:34

Сообщение clou » 16.05.2005 (Пн) 16:34

эта главная форма на которой пять кнопок

Konst_One
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
Аватара пользователя
 
Сообщения: 3041
Зарегистрирован: 09.04.2004 (Пт) 13:47
Откуда: Химки

Сообщение Konst_One » 16.05.2005 (Пн) 16:41

Эта которая : Form1 или Form0 :lol:

clou
Начинающий
Начинающий
 
Сообщения: 17
Зарегистрирован: 16.05.2005 (Пн) 14:34

Сообщение clou » 16.05.2005 (Пн) 16:47

ни то не другое это formBig :-) ну это не так важно, подскажите лучше пожалуйста как мне в процедуре дождатся появления значения в какой нить переменной, не пользуясь вызовом модального окна, если это никак уже не решить

Konst_One
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
Аватара пользователя
 
Сообщения: 3041
Зарегистрирован: 09.04.2004 (Пт) 13:47
Откуда: Химки

Сообщение Konst_One » 16.05.2005 (Пн) 16:53

что значит не решить :roll: :?:

попробуй для начала вызвать одну модальную форму и получить от нее нужные тебе значения

Код: Выделить всё
'FormMain
Private Sub Command1_Click()

With Form1
    .ID = 200
    .Show vbModal, Me
    If .Success Then
        Debug.Print .ID
    End If
End With

End Sub


'Form1
Public Success As Boolean
Public ID As Long

Private Sub OK_Click()
    Me.Success = True
    Me.ID = 100
    Unload Me
End Sub

clou
Начинающий
Начинающий
 
Сообщения: 17
Зарегистрирован: 16.05.2005 (Пн) 14:34

Сообщение clou » 16.05.2005 (Пн) 17:00

form1.id = 200 не работает, пишет ошибку
и форма все равно судя повсему вызывается модально, или здесь что то другое происходит отличающееся от обычного show vbmodal
Какие будут предположения почему с 5 формами работает а с 6 уже нет

Konst_One
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
Аватара пользователя
 
Сообщения: 3041
Зарегистрирован: 09.04.2004 (Пт) 13:47
Откуда: Химки

Сообщение Konst_One » 16.05.2005 (Пн) 17:05

хоть 100 :lol:
у тебя проблема в коде вызываемой тобой модально форме
выкладывай весь свой проект, будем искать твою ошибку

clou
Начинающий
Начинающий
 
Сообщения: 17
Зарегистрирован: 16.05.2005 (Пн) 14:34

Сообщение clou » 16.05.2005 (Пн) 17:11

весь проект большой :-) если поможет то кусочками где формами вызываются, и закрываются(или это не поможет, что конкретно выложить?) кода килобайт на 40

Konst_One
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
Аватара пользователя
 
Сообщения: 3041
Зарегистрирован: 09.04.2004 (Пт) 13:47
Откуда: Химки

Сообщение Konst_One » 16.05.2005 (Пн) 17:15

можно весь - запустим и все сразу увидим :wink:

clou
Начинающий
Начинающий
 
Сообщения: 17
Зарегистрирован: 16.05.2005 (Пн) 14:34

Сообщение clou » 16.05.2005 (Пн) 17:22

он не запустится в связи с тем что на компе должно быть установлена субд Каше и медтрак, именно в него я вставляю свою длл, так как советуют эти разработчики медтрака

Konst_One
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
Аватара пользователя
 
Сообщения: 3041
Зарегистрирован: 09.04.2004 (Пт) 13:47
Откуда: Химки

Сообщение Konst_One » 16.05.2005 (Пн) 17:26

тогда вставляй обработчики ошибок во все процедуры и см , что у тебя происходит

вообще практика вызова форм из DLL очень плохая

clou
Начинающий
Начинающий
 
Сообщения: 17
Зарегистрирован: 16.05.2005 (Пн) 14:34

Сообщение clou » 16.05.2005 (Пн) 17:28

Вот вот и я про этоже, обработчик стоит, ошибка вываливается при закрытии формы unload->ошибка->msgbox(если его поставить после unload в этой же форме)
а не подскажите как заствить программу подождать переменную?

Konst_One
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
Аватара пользователя
 
Сообщения: 3041
Зарегистрирован: 09.04.2004 (Пт) 13:47
Откуда: Химки

Сообщение Konst_One » 16.05.2005 (Пн) 19:18

код unload формы мы наконец увидим или нет

clou
Начинающий
Начинающий
 
Сообщения: 17
Зарегистрирован: 16.05.2005 (Пн) 14:34

Сообщение clou » 17.05.2005 (Вт) 9:52

нет никакой unload и если есть то без разницы какой потому что ошибка не из за unload а из за закрытииформы

Igor_123
Осторожный Баянист
Осторожный Баянист
Аватара пользователя
 
Сообщения: 1325
Зарегистрирован: 21.07.2004 (Ср) 13:00
Откуда: Днепропетровск

Сообщение Igor_123 » 17.05.2005 (Вт) 10:20

"Ты ему плюй в глаза, а он тебе Божья роса" (с) Народная мудрость
Водки я вам не обещаю, но погуляем хорошо.
И. Сусанин.

Аватара (с) Тёмыч

clou
Начинающий
Начинающий
 
Сообщения: 17
Зарегистрирован: 16.05.2005 (Пн) 14:34

Сообщение clou » 17.05.2005 (Вт) 10:47

(кому это?) может быть я просто не умею задавать вопросы
вот вырезка с описанием ошибки http://www.kbalertz.com/kb_172059.aspx

если хотите посмотреть код то у меня примерно тоже самое только я использую не excel а другую программу, тоже написаную на vb

The steps below outline how to create an out-of-process OLE Server DLL that shows a modal form inside Excel 7.0.

Step-by-Step Example
This example has three parts:
1. Making a DLL from Visual Basic 4.0.
2. Making a DLL from Visual Basic 5.0 or Visual Basic 6.0.
3. Calling the DLL from Excel.
Part 1: Making a DLL from Visual Basic 4.0
1. Start a new project. Form1 is created by default.
2. On Form1, place a CommandButton, and place the following code in the CommandButton: Private Sub Command1_Click()
Unload Me
End Sub



3. Insert a class module by choosing Insert...Class Module from the menu.
4. In the Class module, place the following code: Public Sub ShowModal()
Form1.Show 1
End Sub



5. Press the F4 key to bring up the Properties window for the class, and change the Name of the class to clsShowForm. Set Instancing to Createable MultiUse, and set Public to True.
6. From the Tools menu, choose Options, and select the Project tab. Change the project name to prjShowForm, select OLE Server, and change the Application Description to "Show Project Example" (without the quotes).
7. Also in the Project tab, switch the Startup Form to Sub Main(). Click OK in the Options dialog box.
8. Add a regular module to the project by choosing Module from the Insert menu.
9. Place a main subroutine into it: Sub main()

End Sub



10. From the Filemenu, choose Make OLE DLL to make the OLE Server. This creates the DLL and registers the OLE Server on the system.
Part 2: Making a DLL from Visual Basic 5.0 or Visual Basic 6.0
1. Start a new ActiveX DLL project. Class1 is created by default.
2. In the Class module, place the following code: Public Sub ShowModal()
Form1.Show 1
End Sub



3. Press the F4 key to bring up the Properties window for the class, and change the Name of the class to clsShowForm. Set Instancing to MultiUse.
4. Add a form... From the Project menu, choose Add Form
5. On Form1, place a CommandButton, and place the following code in the CommandButton: Private Sub Command1_Click()
Unload Me
End Sub



6. From the Tools menu, choose Options, and select the Project tab. Change the project name to prjShowForm, select OLE Server, and change the Application Description to "Show Project Example" (without the quotes).
7. Also in the Project tab, switch the Startup Object to None.
8. From the Filemenu, choose Make OLE DLL to make the OLE Server. This creates the DLL and registers the OLE Server on the system.
Part 3: Calling the DLL from Excel
1. Start Excel, and by default it will start in Book1. This is important because the example above uses the Caption of Excel to find the window handle. From the Insert menu, choose Macro Module to go into the VBA editor.
2. Place the following code in the editor: Sub test()
Dim x As Object
Set x = CreateObject("prjShowForm.clsShowForm")
x.ShowModal
End Sub



3. Run the code in the Excel editor and it will show the modal form provided by the OLE Server DLL. It will be shown modally in front of Excel until the form is dismissed. If the same form is shown from an out-of-process OLE Server, two undesirable characteristics will manifest themselves: Excel will fail to paint as the modal form is moved around and it will be possible to click on Excel to bring it to the foreground


а проблему я решил, отказался от вызова модального окна, вместо него зделал это в фрейме который становится видимым

помоему тему можно закрыть

codemaster
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 604
Зарегистрирован: 13.02.2004 (Пт) 13:35

Сообщение codemaster » 17.05.2005 (Вт) 10:47

clou писал(а):примерно все так:
Private Sub Command1_Click()
Form1.Show vbModal
End Sub



Детский сад "Ромашка" :lol: :lol:

кстати в статье MSDN ( твой линк) подробно описано как это решается . Будем считать что ты недочитал до конца статью

Попробуй так

в Модальной форме

Кидаем кнопку ОК и пр

Код: Выделить всё
Public m_OK As Boolean


Private Sub Form_Load()
'
m_OK = False
  '
End Sub


Private Sub cmdOK_Click()
      m_OK = True
      Hide
End Sub



Вызов модальной формы

Код: Выделить всё
  Dim fBestForm As Form1
  Set fBestForm = New Form1
          '
    With fBestForm
       '
        здесь может быть  конструктор формы
       '
       .Show vbModal
       '
       If .m_OK Then
        '
         обработка успешных  данных формы
        '
       End If
       '
    End With
' выгружаем форму
Unload fBestForm
Set fBestForm = Nothing

//<-
Mit freundlichen Grüßen
//->

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

Сообщение alibek » 17.05.2005 (Вт) 10:59

Только перед блоком With я бы еще добавлял Load fBestForm, структурнее оно так.
Lasciate ogni speranza, voi ch'entrate.

clou
Начинающий
Начинающий
 
Сообщения: 17
Зарегистрирован: 16.05.2005 (Пн) 14:34

Сообщение clou » 17.05.2005 (Вт) 10:59

да действительно, такого решения я не нашол, спасибо за подсказку, сделал все точно так как описано выше только все равно это не работает и пишет все туже ошбку
и как делать при такой ситуации
Set SpARM002 = New tkSPARM002.Print
Set SpARM002.PrintHook_mcontrol = mControl
SpARM002.PrintHook_sCode = Menu(Num)
SpARM002.PrintHook_P1 = gUserRowid
SpARM002.PrintHook_P2 = gLocationRowid
If Num = 1 Then
SpARM002.PrintHook_P3 = Label
SpARM002.PrintHook_P4 = Kol
End If
SpARM002.PrintHook_Show vbModal
чужую то dll мне не подправить :(
. Не подскажите как можно объяснить закономерность - когда одну из форм убираю, то все нормально выгружается

След.

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

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

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 169

    TopList