PDA

Vollständige Version anzeigen : Ereignisse in Formularen


NetMuggel
19.06.2012, 13:49
Hallo Forumsteilnehmer,

ich benutze Win7 und Access 2010 und arbeite gerade an einem Frontend zur Datenpflege von Referenztabellen auf einem SQL-Server. Für diese Pflege habe ich einige Formulare angelegt. Nun zu meinem Anliegen.
Das Handling der Formulare erfolgt über Klassenmodule. Das Abfangen der Ereignisse von z. B. CommandButtons klappt. Nun möchte ich noch das Ereignis Form_Open() im Klassenmodul abfangen. Welcher Parameter im Deklarationsbereich

Dim WithEvents Objekt as ??

muss ich dabei angeben.

Gruß Thomas

Atrus2711
19.06.2012, 14:33
Dim WithEvents Objekt as Form_Deinformname

Stefan Dase
19.06.2012, 14:45
Für Form_Open reicht sogar:

Dim WithEvents Objekt as Form

Das explizite Formular muss nur angegeben werden, wenn auf benutzerdefinierte Ereignisse reagiert werden soll.

Und bitte nicht vergessen, eine Event-Prozedur im Formular zu hinterlegen! Falls es keine gibt, kann diese nach der Instanzierung dynamisch eingefügt werden:


Set Objekt = New DeinForm
Objekt.OnOpen = "[Event Procedure]"


Grüße,
Stefan

NetMuggel
20.06.2012, 07:26
Hallo Forum,


ich habe nun folgendes implementiert:

Im Formular "DeinFormular" ist das Ereignis "Beim Laden" (Form_Load) mit [Ereignisprozedur] definiert
und ist mit dem Methodenrumpf

Private Sub Form_Load()

End Sub

gefüllt.

In meiner Klasse ist folgender Code hinterlegt:

' Deklaration
Option Compare Database
Option Explicit

' Objekte für das Formular
Dim WithEvents DeinFormular As Access.Form

...

Public Sub Unterlage()

On Error GoTo Err_Unterlage


' Instanzierung des Formulars
Set ObjFrmUnterlage = New Form_FrmUnterlage

...

ObjFrmUnterlage.OnOpen = "[Event Procedure]"

...

End Sub


Private Sub DeinFormular_Load()

...

End Sub

Leider wird die Methode DeinFormular_Load nicht beim Laden und auch nicht beim Instanzieren durchlaufen.
Wo steckt der Fehler bzw. wo hat mein Verständnis 'einen Knick"?

Gruß Thomas

Atrus2711
20.06.2012, 07:36
Leider wird die Methode DeinFormular_Load nicht beim Laden und auch nicht beim Instanzieren durchlaufen.
Warum sollte sie auch? DeinFormular_Load wird nirgends aufgerufen. M.E. hast du vergessen, diese Routine in der Ereignisroutine Form_Load zu starten....

Josef P.
20.06.2012, 08:05
Hallo!

Set DeinFormular = New Form_FrmUnterlage

Auf das Load-Ereignis wird man aus anderen Klassen nicht reagieren können, da die Referenz zum Formular erst vorhanden ist, wenn das Formular geladen ist.
(Load wird bereits aus ausgelöst, wenn new durchlaufen ist - also vor der Zuweisung der Referenz zur Variable DeinFormular.)

Was soll als Reaktion auf Load eigentlich ablaufen?
Im Prinzip könnte man diesen Code doch auch nur nach der Instanzierung aufrufen. An dieser Stelle weiß man auch, dass das Formular geladen ist. ;-)

Set DeinFormular = New Form_FrmUnterlage
Call ProzedurDieNachDemladenDesFormsLaufenSoll()

mfg
Josef

NetMuggel
20.06.2012, 08:17
Hallo Josef,

genau das ist der Fall. Die Methode wird durchlaufen bevor ich sozusagen das Ereignis in der Klasse bekannt gemacht habe; dies habe ich im Debug-Modus gesehen.
Warum ich das machen möchte? Ziemlich banal, wegen der Eleganz.
Da ich scheinbar nicht frühzeitig das Ereignis Form_Load nicht in meiner Klasse abfangen kann ist dein Vorschlag natürlich ein Weg aus dieser Patsche und werde ihn auch umsetzen.

Danke für eure Beiträge.

Gruß Thomas

Josef P.
20.06.2012, 08:45
Warum ich das machen möchte? Ziemlich banal, wegen der Eleganz.

Das macht mich neugierig.
Was führst du außerhalb der Form-Klasse als Reaktion auf Form.Load aus, damit es eleganter wird?

mfg
Josef

NetMuggel
20.06.2012, 09:49
Das Konzept ist einfach. Alle Formulare sollen keine Intelligenz habe. Mit anderen Worten es gibt kein Code-Behind-Form damit kein User durch öffnen von Formularen in den Ref-Tabs rumpfuscht. Alles soll kontrolliert gepflegt werden.

Gruß Thomas

Atrus2711
20.06.2012, 10:08
Wenn du damit einen 3-Schichten-Aufbau (MVC) meinst: dafür ist Access nur ebdingt geeignet. Die Objektorientierung, die dafür nötig wäre, ist in Access nur ansatzweise gegeben.

Es ist also möglich, aber du musst mit vielen Umwegen/Workarounds rechnen. In .net wäre das einfacher, das ist echte OOP.

Wenn wirklich nur das Aussperren von Usern und nicth das Zentralisieren von Code dahintersteckt, kannst du das doch auch mit MDE/ACCDEs halbwegs erreichen (und auch deine Klassensammlung ist ja nach wie vor zugänglich)...

NetMuggel
20.06.2012, 10:22
Ich gebe dir in allen Punkten recht. Zu beachten ist jedoch noch die Infrastruktur, Vorgaben, weitere Personen, die nicht so fit in OOP sind usw.

Das ist auch eine Diskussion die nicht unter diesem Thema geführt werden soll. Da gibt es bestimmt genug Foren in denen Konzepte kontrovers diskutiert werden.

Da aus meiner Sicht das Thema positiv abgeschlossen ist, werden ich es im Laufe des Tages schließen, außer es gibt noch Lösungen zum eigentlichen Problem.

Gruß

Thomas

Atrus2711
20.06.2012, 10:27
Vielleicht hilft dir diese Umsetzerklasse als universales Zwischenglied:
http://www.ms-office-forum.de/forum/showthread.php?t=240505