VB6 Event - Ereignis

Hallo
Wer kann mir weiter helfen?
Ich bastle da an einem Event - Ereignis in VB6 rum, komme aber nicht auf das gewünschte Resultat, da es einfach nicht funktionieren will. Also was ist vorhanden:

  • Eine Standard Exe mit einer Form, dort steht:

Public WithEvents FileDownload As clsDownload

’ Download-Fortschritt
Private Sub FileDownload_Progress(ByVal BytesLoaded As Long, ByVal FileSize As Long)
msgbox „Event Ok“
End Sub

  • Eine Dll mit Klassenmodul clsDownload. In dem Klassenmodul steht:

Public Event Progress(ByVal BytesLoaded As Long, ByVal FileSize As Long)

Public Function ArrivalProgress(ByVal BytesTotal As Long)

RaiseEvent Progress(lngFileSize, lLenBody)

End Function

Wo mache ich da den grundlegenden Fehler? Besten Dank für alle Hinweise.
Grüsse Sebastian

Hallo

Hallo Struppi

Wer kann mir weiter helfen?

Na dann schauen wir mal :smile:

Ich bastle da an einem Event - Ereignis in VB6 rum, komme aber
nicht auf das gewünschte Resultat, da es einfach nicht
funktionieren will. Also was ist vorhanden:

Was funktioniert denn nicht? Wird das Ereignis nicht ausgelöst oder bekommst du nicht die gewünschten Daten?

  • Eine Standard Exe mit einer Form, dort steht:

Public WithEvents FileDownload As clsDownload

Soweit ok. Die Klasse clsDownload ist vorhanden?
Erstellst du auch eine neue Instanz der Klasse?
Schreibe mal im Form Load Ereignis, folgenden Code

 Set FileDownload = New clsDownload

’ Download-Fortschritt
Private Sub FileDownload_Progress(ByVal BytesLoaded As Long,
ByVal FileSize As Long)
msgbox „Event Ok“
End Sub

Hm, ok zur Anzeige ob das Event auslöst ist es ok :smile:

  • Eine Dll mit Klassenmodul clsDownload. In dem Klassenmodul
    steht:

Public Event Progress(ByVal BytesLoaded As Long, ByVal
FileSize As Long)

soweit korrekt :smile:

Public Function ArrivalProgress(ByVal BytesTotal As Long)

RaiseEvent Progress(lngFileSize, lLenBody)

Auch in Ordnung , Event wird ausgelöst

End Function

Wo mache ich da den grundlegenden Fehler? Besten Dank für alle
Hinweise.
Grüsse Sebastian

Gruss Alex

Hallo Struppi,

was mir auch gerade noch einfaellt :wink:

Wenn du eine Klasse erstellst, so kannst/ musst du ja die Eigenschaft Instanzing der Klasse einstellen.
Diese Eigenschaft kann folgende Werte haben.

Private(1)
PublicNotCreatable(2)
SingleUse(3)
GlobalSingleUse(4)
MultiUse(5)
GlobalMultiUse(6)

Diese Eigenschaft hat folgende Bedeutung:

Private:
Ist nur für interne Verwendung in der ActiveX Komponente vorgesehen, als Anwendungsprogrammier hast du darauf keinen Zugriff! Im Objectkatalog ist die Klasse nicht aufgelistet!

PublicNotCreatable:
es kann nur darauf zugegriffen werden, wenn eine Instanz durch eine ActiveX Komponente erstellt wird!

SingleUse:
Neue Instanzen können gebildet werden! Jedoch wird jede neue Instanz erneut in den Speicher geladen!

GlobalSingleUse:
wie SingleUse. Auf Eigenschaften und Methoden kann man jedoch sofort zugreifen, ohne eine Instanz zu bilden

MultiUse
Du kannst via New neue Instanzen bilden. Es wird jedoch nur 1 Instanz in der ActiveX Komponente verwendet!

GlobalMultiUse
wie MultiUse. Auf Eigenschaften und Methoden kannst du jedoch sofort zugreifen, ohne eine Instanz bilden zu muessen.

Bsp:

'In der Klasse würde sich die Methode "Info" befinden

'Private
'Kein Zugriff möglich!

'PublicNotCreatable
'Eigentlich kein direkter Zugriff möglich. Dennoch kannst du hier tricksen! Das erstellen von Instanzen ist ausschließlich dem Server vorenthalten! Erstelle dazu eine Klasse mit der Instancing Eigenschaft vom Typ 6! Diesen kannst du dann ganz bequem auf die Klasse zugreifen lassen!

Public Property Get ZugriffAufC2() as C2
if oc2 is Nothing then set oc2=new oc2
set ZugriffAufC2=oc2
End Property

'Aufruf könnte wiefolgt ausschauen
ZugriffAufC2.Info

'Bedenke. Mit diesem Wege kannst du nur 1 Instanz erzeugen!

'SingleUse
Dim oc3 as New C3
oc3.Info
'oder
Dim oc3 as C3
Set oc3=New C3
oc3.Info

'GlobalSingleUse
c4.info

'MultiUse
Dim oc5 as New C5
oc5.Info
'oder
Dim oc5 as C5
Set oc5=New C5
oc5.Info

'GlobalMultiUse
c6.Info

Bedenke aber das wenn du mehr als nur 1 Instanz vom Typ 3 oder 4 erstellst, so wird jede Instanz erneut in den Speicher geladen, was dazu führt das der Ressourcenbedarf enorm steigt!

So, nun schaue mal in deinem Project, welches Instancing du gesetzt hast und ob du sie richtig aufrufst :wink:

Alternativ kannst du mal in der Klasse im Class_Inialize eine Meldung ausgeben ob die Klasse instanziert ist :wink:

MfG Alex

Es geht noch immer nicht
Danke Alex für die Wertvollen Hinweise
Habe alles nochmals nachgeprüft und ergänzt. Das Klassenmodul habe ich auf 6 gestellt (GlobalMultiUse), versuchte es aber auch mit der 5 (MultiUse), aber das Event-erreignis wird immer noch nicht ausgelöst.
Kann es dann sein, dass das Event erreigniss nur in dem Modul gilt, nicht aber weiter gegeben werden kann an eine standard exe Datei, oder kann es vielleicht nur an eine ActiveX Exe weiter gegeben werden?

Besten Dank für weitere Hinweise
Grüsse Sebastian

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Danke Alex für die Wertvollen Hinweise
Habe alles nochmals nachgeprüft und ergänzt. Das Klassenmodul
habe ich auf 6 gestellt (GlobalMultiUse), versuchte es aber
auch mit der 5 (MultiUse), aber das Event-erreignis wird immer
noch nicht ausgelöst.
Kann es dann sein, dass das Event erreigniss nur in dem Modul
gilt, nicht aber weiter gegeben werden kann an eine standard
exe Datei, oder kann es vielleicht nur an eine ActiveX Exe
weiter gegeben werden?

Besten Dank für weitere Hinweise
Grüsse Sebastian

Hallo Sebastian,

nichts zu danken :smile: Also Mit der Instancing Eigenschaft 5 oder 6 muesste es functionieren.
Wird denn das Class_Initialize ereignis aufgerufen? Und wird die Sub / Function aufgerufen in der das Ereignis ausgelöst werden soll?

Das Ereignis was in der Klasse ausgelöst wird, ist nur in dem Formular verfügbar, wo du die Anweisung private WithEvents … verwendest!

Mich macht eine Aussage von dir ein wenig wirr :frowning: Du sagst du willst das Event an eine andere exe weitergeben? Wie darf man das denn verstehen?

Du schreibst eine Klasse und bindest dann diese Klasse direkt in dein Program mit ein! Weitergeben an eine andere Anwendung kannst du das Ereignis leider nicht :frowning:

Aber fragen wir mal anders rum. Was möchtest du damit eigentlich bezwecken?

MfG Alex

Nochmals von vorne
Also ich habe eine Standard Exe, mit einer Form. In dieser ist der Event deklariert als Privat with event xxx.
Eine mit Verweis eingefügte Dll Besitzt ein Klassenmodul, weches auf die Instancinc 5 gesetzt wurde. In diesem Klasenmodul wird geschaut wann der Event eintrifft. Nun soll der event in der Exe ausgelöst werden, das geht aber irgendwie nicht.

Was möchte ich mit diesem Programm machen:
Ich lade eine Datei über den WinSock herunter. Die Form ist in der Exe, die Downloadprocedure in der DLL Datei (im Klassenmodul). Nun möchte ich die Grösse der Datei, sowie die schon downgeladenen Prozente ausrechnen. Hierfür benötige ich der Event, welcher die Fortschritsleiste in Prozent aktualisiert. Da ja die Form in der Exe liegt, muss ich der Exe das erreignis übergeben, sprich den Event im Klassenmodul auslösen, der in der Exe Deklariert wurde.
Aber der Event-befehl in der Exe wird nach dem Event-Ereignis nicht ausgelöst. Kurz, es löst eben den Event nicht aus.

Besten Dank für jede weitere Hilfe
Grüsse Sebastian

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Hallo Sebastian,

ja nun habe ich es verstanden :smile:
Könntest du mir mal das project auf [email protected] zukommen lassen. Dann schau ich da ma fix rein wo der Fehler liegt. eh wir hier noch lange vermuten :frowning: Wenn du es net magst, dann sage bitte bescheid dann poste ich dir hier noch andere mögliche Fehlerquellen :smile:

MfG Alex