Jag har en klassmodul som vi kallar för A, som under vissa omständigheter behöver skapa en instance av en klassmodul som vi kallar för B. Hej. Vad är det du har problem med? Det jag håller på med är ett add-on verktyg till ett CAD program. Mitt verktyg startar med Klassmodul A. Klassmodul B visar bland annat upp en slags dialogruta (finns inbyggd i CAD-programmet) för att man skall kunna klicka på detaljer i CAD programmet och sedan trycka på OK när man valt färdigt. Det konstiga är dock att när jag skapat en instance av B och anropat den subrutin som bl.a. drar igång dialogrutan, så fortsätter program exekveringen i klassmodul A trots att jag ännu inte har hunnit klicka på någonting i CAD programmet och tryckt OK i dialogrutan. Min tanke var om man kunde göra en paus i programexekveringen i klassmodul A och fortsätta först när den får klartecken på något sätt. Jag vet inte om WaitForSingleObject() låser dialogen. Men du kan ju prova.Göra halt i en klassmodul
Kan jag på något vis få kodkörningen att göra halt i klassmodul A och vänta på att den får en klarsignal från klassmodul B innan den fortsätter?
Har hållit på ett antal timmar med detta utan att få till det, och är mycket tacksam för lite hjälp på traven!Sv: Göra halt i en klassmodul
Har du en instans av B i A kan du använda events.
Annars är en billigare lösning en global statevariabel. (typ. BIsReady As Boolean)
//freddaSv: Göra halt i en klassmodul
Om du naropar en metod på Klass B. Kommer denna först att fortsätta efter att anropet till B är slutfört.Sv: Göra halt i en klassmodul
Här är några rader med kod från klassmodul B:
<code>
Public Sub OnCommand(pIronCAD As Object)
…
…
…
…
pSelectionDialog.Show
‘This code now exits and waits for a callback…
End Sub
Public Function ICSelectionInterface_OnFinish(objSelectedObjects As Object, objCallbackData As Object) As Long
…
…
…
…
‘Return OK
ICSelectionInterface_OnFinish = ICCallbackResults.ICCallback_OK
End Function
</code>
Den kod som finns i klassmodul B är hämtad från CAD programmets exempelkod. I deras exempel är dock denna placerad i klassmodul A, och när man klickat OK i dialogrutan så körs den kod som finns inne i rutinen ”Public Function ICSelectionInterface_OnFinish”. Sedan avslutas hela deras add-on verktyg. Jag vill emellertid inte att mitt add-on verktyg skall avslutas, så det är vad jag försöker få till.
Hoppas att jag inte har rört till det för mycket utan att det är någon som förstår vad jag menar!
Tack på förhand! Sv: Göra halt i en klassmodul
Class: A
<code>
Private Const INFINITE As Long = -1&
Private Const WAIT_OBJECT_0 As Long = &H0&
Private Const WAIT_ABANDONED As Long = &H80&
Private Const WAIT_TIMEOUT As Long = &H102&
Private Declare Function CreateEvent Lib "kernel32" Alias "CreateEventA" (lpEventAttributes As Any, ByVal bManualReset As Long, ByVal bInitialState As Long, ByVal lpName As String) As Long
'Private Declare Function SetEvent Lib "kernel32" (ByVal hEvent As Long) As Long
'Private Declare Function ResetEvent Lib "kernel32" (ByVal hEvent As Long) As Long
Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
Private Declare Function WaitForSingleObject Lib "kernel32" (ByVal hHandle As Long, ByVal dwMilliseconds As Long) As Long
Function DoStuff()
Dim hEvent As Long
Dim lReturn As Long
hEvent = CreateEvent(ByVal 0&, True, False, "Dialog")
B.hEvent = hEvent
B.DoStuff
lReturn = WaitForSingleObject(hEvent, INFINITE)
' Select Case lReturn
' Case WAIT_OBJECT_0
' 'Ok
' Case WAIT_TIMEOUT
' Case WAIT_ABANDONED
' End Select
CloseHandle hEvent
End Function
</code>
Class: B
<code>
Public hEvent As Long
Private Declare Function SetEvent Lib "kernel32" (ByVal hEvent As Long) As Long
Public Function ICSelectionInterface_OnFinish(objSelectedObjects As Object, objCallbackData As Object) As Long
'…
'…
'…
'…
'Return OK
SetEvent hEvent
ICSelectionInterface_OnFinish = ICCallbackResults.ICCallback_OK
End Function
</code>