WithEvents RaiseEvents Anzeige eigener Events

27/05/2008 - 16:52 von Klaus Oberdalhoff | Report spam
Hi,

im Moment stehe ich auf dem Schlauch:

Wie erzeuge und zeige ich eigene Events aus einer "normalen" Funktion heraus
an?
Ich bekomme das nicht zum Laufen, das Formular wird angezeigt und
verschwindet wie es soll, aber kein Inhalt (der Debug Text wird auch
angezeigt) ...

Idee: "generelle Lösung" Wartezeiten subjektiv verkürzen in dem der aktuelle
Bearbeitungsstand angezeigt wird

Gegeben: Formular, Name: frmBitteWarten das die eigenen Events anzeigen soll

Es enthàlt nur ein Textfeld ungebunden, Name: txtLog

Code des Formulars

Option Compare Database
Option Explicit

Public WithEvents objLog As clsPauseEvent

Private Sub Form_Open(Cancel As Integer)
If Nz(Me.OpenArgs) = "" Then
MsgBox "Keine Openargs" & vbCrLf & "Aufruf nur mit Openargs um Probleme
zu vermeiden"
DoCmd.Close
End If
Set objLog = New clsPauseEvent
End Sub

Private Sub objLog_LogWri(xx As String)

Me!txtLog.Text = xx
Me!txtLog.Refresh
DoEvents
End Sub

= = = =
Eine Klasse namens clsPauseEvent, die das Event triggert


Option Compare Database
Option Explicit

Public Event LogWri(mText As String)

Function WriteLog_1(strText As String)

RaiseEvent LogWri(strText)
Debug.Print strText

End Function


Eine Wrapperklasse, die die Klasse zum Schreiben des Events aufruft, da
diese "mit Withevents" deklariert sein muss:

Option Compare Database
Option Explicit

Public WithEvents objLog As clsPauseEvent

Private Sub Class_Initialize()

Set objLog = New clsPauseEvent

End Sub

Function WriteLog(strText As String)

Call objLog.WriteLog_1(strText)

End Function

Private Sub Class_Terminate()
Set objLog = Nothing
End Sub


Eine Testfunktion in einem "normalen" Modul:

Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)

Function Test_ITest()

Dim clsPE As clsPauseEventWri
Dim i

DoCmd.OpenForm "frmBitteWarten", , , , , , "1234"
DoEvents

Set clsPE = New clsPauseEventWri

For i = 1 To 5
clsPE.WriteLog ("Hallo " & i)
Sleep 1000
Next i

DoCmd.Close acForm, "frmBitteWarten"

End Function


mit freundlichen Grüßen aus Nürnberg

Klaus Oberdalhoff KObd@gmx.de
Ich unterstütze PASS Deutschland e.V. (http://www.sqlpass.de) als RGV
(Franken)
Nàchstes Treffen in Nürnberg am 10.06.2008 mit Steffen Krause (MS)
 

Lesen sie die antworten

#1 Jörg Ackermann
27/05/2008 - 19:20 | Warnen spam
Hallo,

Klaus Oberdalhoff meinte:

Hi,

im Moment stehe ich auf dem Schlauch:

Wie erzeuge und zeige ich eigene Events aus einer "normalen" Funktion
heraus an?
Ich bekomme das nicht zum Laufen, das Formular wird angezeigt und
verschwindet wie es soll, aber kein Inhalt (der Debug Text wird auch
angezeigt) ...

Idee: "generelle Lösung" Wartezeiten subjektiv verkürzen in dem der
aktuelle Bearbeitungsstand angezeigt wird



Ich mache das ohne Klassen, aber wer's mag...


Du erstellst zwei Klasseninstanzen, die
voneinander ja nichts mitbekommen.


Versuche mal so:

clsPauseEvent wie bei Dir
clsPauseEventWri brauchst Du nicht


Modul1:
-
Option Compare Database
Option Explicit

Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)

Public m_objLog As clsPauseEvent

Function Test_ITest()

Dim i

Set m_objLog = New clsPauseEvent

DoCmd.OpenForm "frmBitteWarten", , , , , , "1234"
DoEvents

For i = 1 To 5
m_objLog.WriteLog_1 ("Hallo " & i)
Sleep 1000
Next i

DoCmd.Close acForm, "frmBitteWarten"

End Function


frmBitteWarten:
-
Option Compare Database
Option Explicit

Private WithEvents objLog As clsPauseEvent

Private Sub Form_Open(Cancel As Integer)
If Nz(Me.OpenArgs) = "" Then
MsgBox "Keine Openargs" & vbCrLf & "Aufruf nur mit Openargs um Probleme zu vermeiden"
DoCmd.Close
End If
Set objLog = m_objLog
End Sub

Private Sub objLog_LogWri(xx As String)

Me!txtLog.Text = xx
DoEvents
End Sub

Ähnliche fragen