none
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
    Donnerstag, 14. Juli 2011 19:39

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 Morlo

    Trivialbeispiel:
    'Form mit zwei Textboxen
    Private mText1 As clsTextBox
    Private mText2 As clsTextBox

    Private 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 Long

    Public Property Set ColoredTextbox(Txt As Access.TextBox)
        Set mColoredTextBox = Txt
        mColoredTextBox.OnEnter = "[Event Procedure]"
        mColoredTextBox.OnExit = "[Event Procedure]"
    End Property

    Private Sub mColoredTextBox_Enter()
        mlngSaveBackColor = mColoredTextBox.BackColor
        mColoredTextBox.BackColor = 8454143 'gelb
    End Sub

    Private Sub mColoredTextBox_Exit(Cancel As Integer)
        mColoredTextBox.BackColor = mlngSaveBackColor
    End Sub

    • Als Antwort markiert Alphawolfi Sonntag, 17. Juli 2011 11:30
    Samstag, 16. Juli 2011 15:34

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

    Freitag, 15. Juli 2011 02:23
  •  

    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



    Freitag, 15. Juli 2011 20:37
  • 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 Morlo

    Trivialbeispiel:
    'Form mit zwei Textboxen
    Private mText1 As clsTextBox
    Private mText2 As clsTextBox

    Private 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 Long

    Public Property Set ColoredTextbox(Txt As Access.TextBox)
        Set mColoredTextBox = Txt
        mColoredTextBox.OnEnter = "[Event Procedure]"
        mColoredTextBox.OnExit = "[Event Procedure]"
    End Property

    Private Sub mColoredTextBox_Enter()
        mlngSaveBackColor = mColoredTextBox.BackColor
        mColoredTextBox.BackColor = 8454143 'gelb
    End Sub

    Private Sub mColoredTextBox_Exit(Cancel As Integer)
        mColoredTextBox.BackColor = mlngSaveBackColor
    End Sub

    • Als Antwort markiert Alphawolfi Sonntag, 17. Juli 2011 11:30
    Samstag, 16. Juli 2011 15:34
  • 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
    Sonntag, 17. Juli 2011 11:33
  • 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

    Montag, 18. Juli 2011 03:14
  • 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
    Montag, 18. Juli 2011 07:52
    Moderator