Mehrere WithEvent Fenster laden

DrMueller

Erfahrenes Mitglied
Hallo Leute,

vlt. hat jemand grad eine Idee:
Wir laden in einer Class normal ein Form mit Events.
Soweit alles i.O., nur kann dieser Aufruf mehrmals vorkommen, und zwar handelt es sich um eingehende Telefon-Gespräche, daher kann der Code
Code:
  'noch nicht offen:
  If ff Is Nothing Then
    Set fCall = New frmCall
    Call fCall.ShowCall
  End If

x beliebig mal ausgeführt werden. Das Problem ist nur, durch das New verlieren die vorhergegangen Fenster den Bezug, es werden daher keine Events mehr geschossen von den Fenstern.

Gibt es eine Möglichkeit, dass ich x Fenster neu initialisieren und aufmachen kann mit dem selben Objekt und trotzdem die älteren Fenster noch die entsprechenden Events schiessen können?



Vielen Dank im Voraus

Müller Matthias
 
Hi Doc,

kannst du mal den Deklarationsteil der Klasse posten?
bzw. den Teil wo du das Event definierst im Fenster-Modul?
Auch die Funktion, wo du das Event in der Klasse verarbeitest.
 
Zuletzt bearbeitet:
Mal ein kleiner Testcode (Habe ich in Excel gemacht, daher das "UserForm")

1 x Standardmodul "Modul1"
1 x Klassenmodul "Klasse1"
1 x Fenstermodul "frmTest"

Standardmodul "Modul1"
Visual Basic:
Public Klasse As Klasse1

Sub main()

    Set Klasse = New Klasse1
    
    Klasse.main

End Sub

Klassenmodul "Klasse1"
Visual Basic:
Public WithEvents Fenster As frmTest

Public Sub main()

    For i = 1 To 3
    
        Set Fenster = New frmTest
        Fenster.Caption = "Form " & i
        Fenster.Show vbModeless
        
    Next

End Sub

Private Sub Fenster_Clicked(ByVal Nachricht As String)

    MsgBox "Fenster " & Nachricht & " wurde geclickt"

End Sub

Fenstermodul "frmTest"
Visual Basic:
Public Event Clicked(ByVal Nachricht As String)

Private Sub UserForm_Click()

    Set Klasse.Fenster = Me

    RaiseEvent Clicked(Me.Caption)

End Sub


Ich bekomme für alle drei Fenster das richtige Event geschossen
 
clsTelephone
Class Deklaration
Visual Basic:
Dim WithEvents fCall As frmCall

Entsprechender Aufruf
Visual Basic:
Private Sub myCall_ShowCall(mCallkey As String) ', DescriptionComplete As String, ANR As String, CID As Long, StartDateTime As Date)
  On Error Resume Next
  
  Dim thisCall As clsPhonecall
  Dim thisCallIndex As Long
  For thisCallIndex = myCalls.Count To 1 Step -1
    If mCallkey = myCalls(thisCallIndex).Key Then
      Set thisCall = myCalls(thisCallIndex)
      Exit For
    End If
  Next
  
  'prüfen ob das Fenster schon offen ist
  Dim ff As Form
  Dim Y As Integer
  For Y = 0 To Forms.Count - 1
    If LCase$(Forms(Y).Name) = "frmcall" Then
      If (Forms(Y).Handle = thisCall.Handle) And Len(thisCall.Handle) > False Then
        Set ff = Forms(Y)
        ff.Show
        Exit For
      ElseIf ((Forms(Y).Key) = thisCall.Key) And (Len(Forms(Y).Handle) = False) And (Len(thisCall.Handle) = False) Then
        Set ff = Forms(Y)
        ff.Show
        Exit For
      End If
    End If
  Next
  
  'noch nicht offen:
  If ff Is Nothing Then
    Set fCall = New frmCall
    Call fCall.ShowCall(thisCall, myConsSettings, myRep, myImagelist, myIK)
    RaiseEvent RemoveIndicatedCall
  End If
  
  Set thisCall = Nothing
End Sub

frmCall

Visual Basic:
Public Event CreateNewAkt(aktsComment As String, aktlCommentFileName As String, PID As Long, AktType As Long, Technology As Long, myCall As clsPhonecall, mResp As String, mCloseAkt As Boolean)

Und halt entsprechend raiseevent beim frmCall und dann das Abfangen des Events auf clsTelephone, aber dahin kommt er eben nicht bei mehreren Fenstern.
 
Zuletzt bearbeitet von einem Moderator:
@DrMueller
Bitte die VB-Codes in Zukunft selber in VB-Tags setzen. Es ist einfach viel lesbarer:

[code=vb]Dein Code[/code]
 
Doc,

was ich während meinem Testcode erkennen konnte, ist wenn Zeile 5 in meinem Code Fenstermodul fehlt Set Klasse.Fenster = Me, dann wird nur das Event für das letzte (=jüngste) Fenster geschossen. Die älteren Fenster werden ignoriert.

Also genau der Fall, den du beschrieben hast.

Wenn ich es richtig verstehe, muss ein Fenster, bevor es sein Event abschiessen will, die "Aufmerksamkeit" der aufrufenden Klasse auf sich ziehen.

Hoffe du kannst was damit anfangen.
 
@Yaslaw habe ich doch gemacht?

@Zvoni ja genau jetzt sind wir gleich weit. Es werden immer nur die Events vom jüngsten Fenster geschossen. Meine Frage ist eben, ob VB6 überhaupt erlaubt, dass das gleiche Objekt mehrmals instanziert wird und die Class erkenen kann, welches denn nun schiesst.
 
aus

Visual Basic:
Dim WithEvents fCall As frmCall
'wird
Public WithEvents fCall As frmCall

...und im Fenstermodul
Visual Basic:
Set clsTelephone.fCall=Me
RaiseEvent CreateNewAkt(aktsComment As String, aktlCommentFileName As String, PID As Long, AktType As Long, Technology As Long, myCall As clsPhonecall, mResp As String, mCloseAkt As Boolean)

Nachdem ich in meinem Beispiel-Code das
Visual Basic:
Set Klasse.Fenster = Me
 
RaiseEvent Clicked(Me.Caption)
eingefügt hatte, kamen alle Events in der Klasse an.
 
Zurück