[Access2007] Dialogformular objektorientiert?

Hallo zusammen,

gibt es eine Möglichkeit, ein Dialogformular auf „objektorientierte Weise“ zu öffnen? Damit meine ich, nicht

DoCmd.OpenForm „frmFormular“, , , , , acDialog

zu verwenden, sondern etwa diesen Code:

Set Me.frmFormular = New Form_frmFormular
Me.frmFormular.Visible = True

Das Problem beim zweiten Fall ist, dass der nachfolgende Code nicht „wartet“, bis der Dialog geschlossen ist.

Der Grund, warum ich die zweite Variante benötige ist, dass ich zur Initialisierung eine Prozedur auf dem Dialogformular aufrufen will (ich weiß, dass es die „openArgs“ gibt, aber damit komme ich nicht zurecht).

Gibt es eine Möglichkeit, die Dialog-Eigenschaft zu setzen, oder irgendwie das Schließen des zweiten Formulars im ersten abzufangen?

Besten Dank und viele Grüße

Matthias

Salü, warum verwendest Du nicht im mit docmd geöffneten Formular das Ereignis beim öffnen oder beim Anzeigen und holst Dir dann die ggf benötigtenWerte aus dem aufrufenden Formular heraus?

Sei gegrüsst

Hallo,

beschäftigen wir uns liebe mit diesem:

dass ich zur Initialisierung eine Prozedur auf dem Dialogformular aufrufen will

hängt der Aufruf von irgendwelchen Bedingungen ab und woher kommen die? Wie lautet der Code der Prozedur und wo steht die?

(ich weiß, dass es die „openArgs“ gibt, aber damit komme ich nicht zurecht).

WOMIT kommst Du nicht zurecht?

Viele Grüße vom Bodensee
Franz, DF6GL

Hallo Franz,

vielen Dank für deine rasche Antwort.

beschäftigen wir uns liebe mit diesem:

dass ich zur Initialisierung eine Prozedur auf dem Dialogformular aufrufen will

hängt der Aufruf von irgendwelchen Bedingungen ab und woher
kommen die? Wie lautet der Code der Prozedur und wo steht die?

Der Code der Prozedur lautet

Public Sub initialize(nummer As String)

Me.nummer = nummer
DoCmd.SetWarnings False

End Sub

Es gibt ansonsten keine Bedingungen.

Die Sache ist die, dass ich halt aus der objektorientierten Welt komme und gerne eine Referenz auf das Formular-Objekt hätte. Die bekomme ich mit der DoCmd.OpenForm-Methode doch nicht, oder?

(ich weiß, dass es die „openArgs“ gibt, aber damit komme ich nicht zurecht).

WOMIT kommst Du nicht zurecht?

… dass es auf diese Weise manchmal funktioniert und manchmal nicht und ich nicht weiß, woran das liegt. Teilweise werden die „OpenArgs“ einfach nicht übernommen (sind dann Null) oder es kommt der Fehler „The OpenForm action was canceled“. Zumindest bei letzterem habe ich durch meine „andere“ Methode festgestellt, dass es wohl daran liegt, dass das Dialogformular im Design View geöffnet ist.

Viele Grüße

Matthias

Hallo,

danke für die extrem schnelle Antwort.

Salü, warum verwendest Du nicht im mit docmd geöffneten
Formular das Ereignis beim öffnen oder beim Anzeigen und holst
Dir dann die ggf benötigtenWerte aus dem aufrufenden Formular
heraus?

Ich möchte nicht, dass das Dialogformular vom aufrufenden Formular abhängig ist, da ich das Dialogformular aus verschiedenen Formularen heraus aufrufen will.

Leider ist mir auch keine generische Methode bekannt, mit der man das aufrufende Formular ansprechen kann.

Viele Grüße

Matthias

Hallo

Der Code der Prozedur lautet

Public Sub initialize(nummer As String)

Me.nummer = nummer
DoCmd.SetWarnings False

End Sub

Es gibt ansonsten keine Bedingungen.

Vermutlich hast Du hier ein Standard-Klassenmodul und kein Form-Klassenmodul als Hintergrund.

Die Sache ist die, dass ich halt aus der objektorientierten
Welt komme und gerne eine Referenz auf das Formular-Objekt
hätte. Die bekomme ich mit der DoCmd.OpenForm-Methode doch
nicht, oder?

Vermutlich siehst Du die Verhältnisse nicht richtig…

Ein Formular ist ein Objekt und hat u. U. ein Form-Klassenmodul.

Weiterhin treten in einem Formular und auch bei dessen Steuerelement-Objekten bei bestimmten Vorgängen Ereignisse auf, die einen Aufruf einer sogenannten Ereignisprozedur (falls durch einen Eintrag „[Ereignisprouedur]“ (deutsches Access) in der entspr. Eigenschaft dieser Vorgang definiert ist) zu Folge haben.

in allen diese Prozeduren, die im Form-Klassenmodul stehen, kann mit dem Schlüsselwort „Me“ auf das aktuelle Formular(objekt) referenziert werden. Weiter Möglichkeiten, auf ein Formular-Objekt zu referenezieren, sind die

  1. Angabe des Formularnamens in der Forms-Auflistung des Application-Objektes: Forms!frmMeinFormular1 (Kurzform durch Verwendung von „!“)

  2. Angabe des Form-Klassennamens: Form_frmMeinFormular1

Insofern ist eine Referenz auf ein Objekt im Formular ( z. B. ein Textfeld) so zu gestalten:

Forms!frmMeinFormular1!txtMeinTextfeld
Form_frmMeinFormular1!txtMeinTextfeld

Anstelle von „ME“ kann natürlich auch die ausführliche Schreibweise benutzt werden, hat halt dann den Nachteil der Unübersichtlichkeit und der Fehlerträchtigkeit z. B. beim Einsatz eines Forms als Unterformular

(ich weiß, dass es die „openArgs“ gibt, aber damit komme ich nicht zurecht).

WOMIT kommst Du nicht zurecht?

… dass es auf diese Weise manchmal funktioniert und manchmal
nicht und ich nicht weiß, woran das liegt.

Das muss man halt Fall für Fall untersuchen. Jedenfalls gibt es da keine Bugs in VBA (soweit mir bekannt ist).

Teilweise werden die „OpenArgs“ einfach nicht übernommen (sind dann Null)

Naja, die Openargs-Eigenschaft im aufgerufenen Form ist halt NULL, wenn im Aufruf mit Docmd.Openform… gar kein Openargs-Parameter angegeben ist, bzw. dort eine Variant-Variable selber den „Wert“ NULL hat.

oder
es kommt der Fehler „The OpenForm action was canceled“.

Dieser Hinweis kann mehrere Gründe haben. Auch das ist fallabhängig zu untersuchen.

Zumindest bei letzterem habe ich durch meine „andere“ Methode
festgestellt, dass es wohl daran liegt, dass das
Dialogformular im Design View geöffnet ist.

Naja, solche Zustände sind halt zu vermeiden. Mit Standard-Aufruf eines Forms (Docmd.Openform) ist nur eine Instanz eines Form möglich.

Beispiel für den Aufruf eines anderen modalen Forms mit Übergabe eines Openargs-Wertes aus einer Ereignisprozedur („Beim Klicken“ einer Schaltfläche („btnOF2“) und ohne Filterung von Datensätzen ):

Im „frmMeinFormular1“:

Sub btnOF2\_Click()
Dim strNummer as String
strNummer =nz(Me!txtNummer,"abc123456")
On Error Resume Next
Docmd.Openform "frmMeinFormular2",,,,acDialog,strNummer
End Sub

Im „frmMeinFormular2“

Sub Form\_Open(Cancel as Integer)
If IsNull(Me.Openargs) Then 
Cancel =true
Else
Me!txtMeinTextfeld1 = Me.Openargs
End If
End Sub
 
 
 
'evtl, je nach "Datenverhältnissen" das Load-Ereignis benutzen:
 
 
Sub Form\_Load()
If not IsNull(Me.Openargs) Then Me!txtMeinTextfeld1 = Me.Openargs
End Sub

Viele Grüße vom Bodensee
Franz, DF6GL

Hallo

Ich möchte nicht, dass das Dialogformular vom aufrufenden
Formular abhängig ist, da ich das Dialogformular aus
verschiedenen Formularen heraus aufrufen will.

Genau dafür ist „Openargs“ zu gebrauchen…

Leider ist mir auch keine generische Methode bekannt, mit der
man das aufrufende Formular ansprechen kann.

Ausser irgendwelchen fehlerträchtigen und damit nutzlosen Krücken gibt es auch nichts. Allenfalls könnte man mit einer Public-Variablen, in die man den Namen des aufrufenden Forms schreibt, den Openargs-Parameter immitieren.

'-----------------

'In einem Standardmodul:

Public pFrmName As String

'Im aufrufenden Form:

Sub btnOF1_Click()
pFrmName = Me.Name
Docmd.Openform „frmForm2“,acDialog
End Sub

'im aufgerufenen Form:

Sub Form_Open(Cancel as Integer)
If pFrmName „“ then Me!txtMeinTextfeld2 = Forms(pFrmName)!txtMeinTextfeld1
End Sub

'und wieder „resetten“

Sub Form_Close()
pFrmName=""
End Sub

Viele Grüße vom Bodensee
Franz, DF6GL