Benutzer mit den meisten Antworten
Ereignisprozedur anstelle von EventProcedure

Frage
-
Hallo zusammen
Ich hoffe, Ihr könnt mir weiterhelfen.
Ich habe in einer DB eine Klasse erstellt, in welcher ich für einige Aktionen des Formulares Ereignisprozeduren erstellen möchte. Da mein Office 2010 auf Deutsch ist, muss ich bei
With prpCurrentForm .OnActivate = "[Ereignisprozedur]" ... End With
einstellen, anstelle des Englischen "EventProcedure". Wenn ich die DB dann irgendwo anders laufen lasse, funktioniert sie unter umständen dann nicht mehr. Habt ihr eine Idee, wie ich die Einstellung machen kann, damit ich 'EventProcedure' benutzen kann, damit die DB auch auf einem entlischen oder multilangual-System läuft?
Danke und Gruss Thomas
Antworten
-
Hallo,
Alphawolfi:
Ich habe in einer DB eine Klasse erstellt, in welcher ich für einige Aktionen des Formulares Ereignisprozeduren erstellen möchte. Da mein Office 2010 auf Deutsch ist, muss ich bei
With prpCurrentForm .OnActivate = "[Ereignisprozedur]" ... End With
einstellen, anstelle des Englischen "EventProcedure".
Nahe am Thema gefragt ;-)
Bist Du sicher, dass Du das überhaupt auf Deutsch einstellen musst? Für
Access 2003 (deutsch) zumindest, funktionieren Klassenmodule mit
Ereigniszugriff auch mit dem dem englischen "[Event Procedure]". Würde mich
wündern, wenn das für 2010 nicht zuträfe.Wenn ich die DB dann irgendwo anders laufen lasse, funktioniert sie unter umständen dann nicht mehr. Habt ihr eine Idee, wie ich die Einstellung machen kann, damit ich 'EventProcedure' benutzen kann, damit die DB auch auf einem entlischen oder multilangual-System läuft?
Dann sollte sich auch die Notwendigkeit einer Übersetzung von
‚Ereignisprozedur’ in diverse Sprachen entfallen (s.u.).Gruß
Josef MorloTrivialbeispiel:
'Form mit zwei Textboxen
Private mText1 As clsTextBox
Private mText2 As clsTextBoxPrivate Sub Form_Load()
Set mText1 = New clsTextBox
Set mText1.ColoredTextbox = Me!txtText1
Set mText2 = New clsTextBox
Set mText2.ColoredTextbox = Me!txtText2
End Sub'Modul clsTextbox
Private WithEvents mColoredTextBox As Access.TextBox
Private mlngSaveBackColor As LongPublic Property Set ColoredTextbox(Txt As Access.TextBox)
Set mColoredTextBox = Txt
mColoredTextBox.OnEnter = "[Event Procedure]"
mColoredTextBox.OnExit = "[Event Procedure]"
End PropertyPrivate Sub mColoredTextBox_Enter()
mlngSaveBackColor = mColoredTextBox.BackColor
mColoredTextBox.BackColor = 8454143 'gelb
End SubPrivate Sub mColoredTextBox_Exit(Cancel As Integer)
mColoredTextBox.BackColor = mlngSaveBackColor
End Sub- Als Antwort markiert Alphawolfi Sonntag, 17. Juli 2011 11:30
Alle Antworten
-
Hallo Alphawolfi
Alphawolfi wrote:
Ich hoffe, Ihr könnt mir weiterhelfen.
Ich habe in einer DB eine Klasse erstellt, in welcher ich für einige
Aktionen des Formulares Ereignisprozeduren erstellen möchte. Da mein Office 2010 auf Deutsch ist, muss ich bei
With prpCurrentForm .OnActivate = "[Ereignisprozedur]" ... End With
Vergiss' das rumgefummel in den Form Properties. Verwende statt dessen die dafür vorgesehene Funktion CreateEventProc, mit der Du die Ereignisprozedur für ein Objekt in einem Klassenmodul erstellen kannst. Das macht dann die korrekten Einträge in die Properties (die dann im Hintergrund eben sprachunabhängig sind).
Details siehe VBA OH zum Thema CreateEVentProc.
Gruss
Henry -
Hallo Henry
Erstmal Danke für Deine Antwort.
Hm, mit dieser Methode habe ich mich bisher nicht auseinander gesetzt. Nach dem Studium der Hilfe und Internetbeiträgen meine ich verstanden zu haben, dass 'CreateEVentProc' einen Coderumpf erstellt.
Ich habe eine Testklasse erstellt:
'=====Start=======
Dim frm As Access.Form Dim WithEvents ctl As Access.CommandButton Public Sub start(frmFormular As Form) Dim frm As Form, ctl As Control, mdl As Module Dim lngReturn As Long Set frm = frmFormular With frm Set mdl = frm.Module Set ctl = frm.cmd0 lngReturn = mdl.CreateEventProc("Click", ctl.Name) End With End Sub
'=====End=======Wenn ich diese beim Load-Ereignis des Formulares mit
'=====Start=======
Dim cls As Klasse1 Private Sub Form_Load() Set cls = New Klasse1 cls.start Me End Sub
'=====End=======
starte, dann macht er mir bei jedem öffnen ein neues'=====Start=======
Private Sub cmd0_Click()
End Sub
'=====End=======
in mein Formular. Das ist ja nicht gerade, was ich will. Erstens möchte ich nicht jedes Mal ein neuer Coderumpf, Zweitens nicht in meinem Formular (sonder in der Klasse) und Drittens möchte ich nicht mit 'mdl.InsertLines ' die ganze Abhandlung der Codezeilen einfügen. Mein Ziel (und bisher ging das ganz gut) ist, in der Klasse die Ereignisse zu programmieren:
'=====Start=======
Private Sub frm_Activate() '(oder ctl_Click oder was auch immer) ... End Sub
'=====End=======Ich weiss ich sehe das falsch, aber momentan brauche ich Erleuchtung. Könntest Du (oder jemand) mir weitehelfen? Vielen Dank.
Edit: Zur Präzision: Ich mache nicht eine Formular-Klasse, sondern eine von Formularen unabhängiges Ding, welches aber einige Einstellungen im Formular vornehmen muss, damit sie funktioniert.
Danke und Gruss Thomas
-
Hallo,
Alphawolfi:
Ich habe in einer DB eine Klasse erstellt, in welcher ich für einige Aktionen des Formulares Ereignisprozeduren erstellen möchte. Da mein Office 2010 auf Deutsch ist, muss ich bei
With prpCurrentForm .OnActivate = "[Ereignisprozedur]" ... End With
einstellen, anstelle des Englischen "EventProcedure".
Nahe am Thema gefragt ;-)
Bist Du sicher, dass Du das überhaupt auf Deutsch einstellen musst? Für
Access 2003 (deutsch) zumindest, funktionieren Klassenmodule mit
Ereigniszugriff auch mit dem dem englischen "[Event Procedure]". Würde mich
wündern, wenn das für 2010 nicht zuträfe.Wenn ich die DB dann irgendwo anders laufen lasse, funktioniert sie unter umständen dann nicht mehr. Habt ihr eine Idee, wie ich die Einstellung machen kann, damit ich 'EventProcedure' benutzen kann, damit die DB auch auf einem entlischen oder multilangual-System läuft?
Dann sollte sich auch die Notwendigkeit einer Übersetzung von
‚Ereignisprozedur’ in diverse Sprachen entfallen (s.u.).Gruß
Josef MorloTrivialbeispiel:
'Form mit zwei Textboxen
Private mText1 As clsTextBox
Private mText2 As clsTextBoxPrivate Sub Form_Load()
Set mText1 = New clsTextBox
Set mText1.ColoredTextbox = Me!txtText1
Set mText2 = New clsTextBox
Set mText2.ColoredTextbox = Me!txtText2
End Sub'Modul clsTextbox
Private WithEvents mColoredTextBox As Access.TextBox
Private mlngSaveBackColor As LongPublic Property Set ColoredTextbox(Txt As Access.TextBox)
Set mColoredTextBox = Txt
mColoredTextBox.OnEnter = "[Event Procedure]"
mColoredTextBox.OnExit = "[Event Procedure]"
End PropertyPrivate Sub mColoredTextBox_Enter()
mlngSaveBackColor = mColoredTextBox.BackColor
mColoredTextBox.BackColor = 8454143 'gelb
End SubPrivate Sub mColoredTextBox_Exit(Cancel As Integer)
mColoredTextBox.BackColor = mlngSaveBackColor
End Sub- Als Antwort markiert Alphawolfi Sonntag, 17. Juli 2011 11:30
-
Hallo Joey
Danke für Deine Antwort
Ich getraue es mir nicht , es zu sagen. Ich habe eigentlich alles richtig gemacht, aber den Leerschlag bei [Event Procedure] vergessen. Ich entschuldige mich für die unnötige Belästigung.
Wünsche allen eine schöne Woche.
Danke und Gruss Thomas -
Nun gut, da hat sich das ja erledigt.
Dennoch würde es mich interessieren, was wieso Du zur Laufzeit die Ereignisprozedur hinzufügen willst? Funktioniert das noch, wenn Du eine MDE aus Deiner Anwendung machst?
Und wieso fügst Du da eine Ereignisprozedur hinzu und legst diese nicht in eine public Function in einem Standard Modul und hängst diese rein? Das könntest Du auch über das Property machen, indem Du dieses auf "=DeineGlobaleFunktion()" setzt.
Gruss
Henry
-
hallo Henry,
ich verwende es auch, da sonst das Ereignis für WithEvents nicht ausgelöst wird.
Klassenmodul clsTestEvent:
Option Compare Database Option Explicit Private WithEvents m_Form As Access.Form Public Property Set Form(AValue As Access.Form) On Local Error Resume Next Set m_Form = AValue If m_Form.OnResize = vbNullString Then m_Form.OnResize = "[Event Procedure]" End If End Property Private Sub m_Form_Resize() On Local Error Resume Next MsgBox "Resize Event fired." End Sub
Formularmodul:
Option Compare Database Option Explicit Private m_TestEvent As clsTestEvent Private Sub Form_Load() Set m_TestEvent = New clsTestEvent Set m_TestEvent.Form = Me.Form End Sub
Microsoft MVP Office Access
https://mvp.support.microsoft.com/profile/Stefan.Hoffmann