Set Form

23/04/2009 - 19:42 von Josef Morlo | Report spam
Hallo,
Sorry, bin nicht mehr ganz im Bilde mit Access, aber bevor ich mich mit
einer AX-DLL behelfe, wollte ich nachgefragt haben:

Habe ein Klassenmodul, das über ein Formular einige Nutzereingaben
aufnehmen soll, diese dann bearbeitet und zurückgibt. Beides ist eine
funktionelle Einheit und insofern hàtte ich sie gerne in *einem* Modul
gekapselt. Ich habs so probiert:

im Klassenmodul:

Private WithEvents mfrm As Form_InputForm
Private mstrStringVal As String

Private Sub Class_Initialize()
Set mfrm = New Form_InputForm
mfrm.Modal = True
mfrm.Visible = True
End Sub

Private Sub Class_Terminate()
Set mfrm = Nothing
End Sub

Private Sub mfrm_Closing(strVal As String)
mstrStringVal = strVal
End Sub

Public Property Get StringVal() As String
StringVal = mstrStringVal
End Property

'alternativ
Private Sub mfrm_Updating(strVal As String)
mstrStringVal = strVal
End Sub



Im Eingabeform mit Textbox und Schließen-Button:

Public Event Closing(strVal As String)
Public Event Updating(strVal As String)

Private Sub cmdClose_Click()
RaiseEvent Closing(Me!txtValue)
End Sub

'alternativ
Private Sub txtValue_AfterUpdate()
RaiseEvent Updating(Me!txtValue)
End Sub



In der der aufrufenden Prozedur:

Dim objInput As clsInput

Sub GetString()
Set objInput = New clsInput
With objInput
MsgBox .StringVal 'bleibt leer
End With
Set objInput = Nothing
End Sub

Wenn ich eine dialogische Forminstanz über das DoCmd-Objekt erstelle, ist
das Event nicht erreichbar, erstelle ich die Instanz über New
Form_InputForm, galoppiert der Code weiter, ohne sich um die Eingaben zu
kümmern.

Gabs da mal eine Lösung jenseits von Timer oder globalen Variablen?
 

Lesen sie die antworten

#1 Josef Poetzl
23/04/2009 - 20:09 | Warnen spam
Hallo!

Josef Morlo schrieb:
Habe ein Klassenmodul, das über ein Formular einige Nutzereingaben
aufnehmen soll, diese dann bearbeitet und zurückgibt. Beides ist eine
funktionelle Einheit und insofern hàtte ich sie gerne in *einem* Modul
gekapselt. Ich habs so probiert:

im Klassenmodul:

Private WithEvents mfrm As Form_InputForm
Private mstrStringVal As String

Private Sub Class_Initialize()
Set mfrm = New Form_InputForm
mfrm.Modal = True
mfrm.Visible = True
End Sub


[...]
In der der aufrufenden Prozedur:

Dim objInput As clsInput

Sub GetString()
Set objInput = New clsInput
With objInput
MsgBox .StringVal 'bleibt leer
End With
Set objInput = Nothing
End Sub

Wenn ich eine dialogische Forminstanz über das DoCmd-Objekt erstelle, ist
das Event nicht erreichbar, erstelle ich die Instanz über New
Form_InputForm, galoppiert der Code weiter, ohne sich um die Eingaben zu
kümmern.



Das ist das Problem von Modal. Dieser Parameter ist nicht identisch
mit acDialog von Docmd.OpenForm.
Wenn du den Code im Einzelschrittmodus verfolgst, wird er nach
mfrm.Visible nicht stehen bleiben, sondern bis zur Msgbox
weiterlaufen.


Gabs da mal eine Lösung jenseits von Timer oder globalen Variablen?



Mir ist bisher nichts besseres als die Verwendung einer globalen
Variable eingefallen.
Allerdings nutze ich diese nicht zur Weitergabe der Formulareingaben,
sondern zu Weitergabe der Klassenreferenz.

Prinzip:
Private WithEvents m_InputForm As Form_InputForm

'Übergabe der Form-Referenz von außen:
Public Property Set InputForm(ByRef ref As Form)
Set m_InputForm = ref
End Property

'Event handler:
private sub m_InputForm_EreignisXYZ()
...
end sub

Aufruf des Forms aus der Klasse:
Set g_TempRef = Me
DoCmd.OpenForm ..., acDialog
Set g_TempRef = nothing


Im Formular làuft dann:
Private Sub Form_Load()
If Not (g_TempRef Is Nothing) Then
Set g_TempRef.LoginForm = Me
End If
end sub

Ab dann steht ein Formular im Dialogmodus zur Verfügung, auf dessen
Ereignis aber aus der aufrufenden Klasse reagiert werden kann.

Vorteil dieser Variante: ich kann mehrere Ereignisse nutzen.
Eine brauchbare Alternative ohne die globale "g_TempRef"-Variable fand
ich bisher noch nicht.


Eine Variante wàre vielleicht ein zweites Hilfsformular zu verwenden.
Das halte ich aber für zu umstàndlich, um eine globales Variable zu
umgehen. So schlimm sind die auch wieder nicht. ;-)


mfg
Josef

EPT: (Access Error Prevention Table) http://access.joposol.com/
FAQ: (Access-FAQ von Karl Donaubauer) http://www.donkarl.com/

Ähnliche fragen