none
Control wird nicht referenziert.

    Frage

  • Hallo

    Ich habe vor einiger Zeit eigenständiges Suchformular kreiert. Das ist inzwischen gewachsen und ich wollte die Funktionialität überarbeiten. Das handling des Formulars passiert vollständig auf einer Klasse.

    Beim ersten öffnen des Suchformulares werden via die Klasse alle nötigen Parameter, Event-Prozeduren etc. gesetzt. Beim Auswählen eines Buttons, der im Suchformular vorhanden ist, wird im aufrufenden Formular die Datenherkunft angepasst und das Suchformular ausgeblendet, damit es schnell wieder zur Verfügung steht. Beim nächsten Klick auf den Suchen-Buttton im aufrufenden Formular wird das Suchformular einfach wieder eingeblendet. Soweit funktioniert alles gut

    Jetzt habe ich ein Phänomen, welches ich nicht erklären kann. Ich möchte im Suchformular sowohl mit einem Mausklick als auch mit der Enter-Taste das Gleiche machen, nämlich suchen. Also habe ich in der Klasse einfach folgendes gemacht.

    Private Sub cmdOK_Click()
        UpdateCriteriaAndOrderBy
        SearchForm.Visible = False
    End Sub
    

    und

    Private Sub SearchForm_KeyDown(KeyCode As Integer, Shift As Integer)
        Select Case KeyCode
        Case vbKeyReturn    'Enter
            Call cmdOK_Click
        Case vbKeyEscape    'Escape
            Call cmdCancel_Click
        End Select
    End Sub

    Damit wird die Funktion ausgeführt:

    Private Function UpdateCriteriaAndOrderBy()
        Dim i As Long
        Dim ctl As control
    
        On Error GoTo UpdateCriteriaAndOrderBy_Error
        With SearchCriteria
            .ClearCriteria
            .ClearOrderBy
             If SearchForm!opgFilter = 1 Then
                For i = 1 To 6
                    If Not IsNull(SearchForm("Suchfeld" & CStr(i))) Then
    
                        If SearchForm("Suchkriterium" & CStr(i)).Visible Then
                            Set ctl = SearchForm("Suchkriterium" & CStr(i))
                        ElseIf SearchForm("cboSuchkriterium" & CStr(i)).Visible Then
    10                    Set ctl = SearchForm("cboSuchkriterium" & CStr(i))
                        End If
    
    20                If Not IsNull(ctl) Then
    

    Es geht dabei um die Zeile 10 und 20.

    Wenn ich per Mausklick im Suchformular die Suche starte, dann funktinoiert alles bestens. Wenn ich via Enter -Taste suche, dann gibt mir Zeile 10 bei jedem ungeraden Mal (die erste Suche, die Dritte, die Fünfte ect.) Null as Wert von ctl aus. Jedes gerade Mal funktioniert sie.

    Wie kann denn das sein? Ich verwende ja für vbReturn und den Klick immer die gleiche Prozedur?

    Danke schon im Voraus und Gruss

    Thomas


    Danke und Gruss Thomas

    Mittwoch, 16. April 2014 12:33

Alle Antworten

  • Hallo, Thomas!

    Findet das Tastendrücken in einem Steuerelement statt, das mit Return den Fokus weitergibt? Dann stört das vielleicht deine Abläufe und solltest du den Tastendruck verschlucken, indem du den KeyCode auf 0 setzt:

    Select Case KeyCode
       
    Case vbKeyReturn    'Enter
          KeyCode = 0
          Call cmdOK_Click


    cu
    Karl
    ****
    Catalog for the professional Access application
    http://www.donkarl.com/en/catalog

    • Bearbeitet Karl DonaubauerMVP Mittwoch, 16. April 2014 14:07 wie meistens die Formatierung
    Mittwoch, 16. April 2014 14:05
  • Hallo Karl

    Erstmal Danke für Deine Antwort.

    Wenn ich das richtig verstehen bewirkt KeyCode = 0 nur, dass die 'normale' Return-Funktinon nicht ausgeführt wirde, oder?
    Es sind in diesem Formular resp. dem Code keine weiter KeyDown, -up oder -Press Funktionen vorhanden.

    Mein Problem ist aber nicht das. cmdOk_Click wird ausgeführt, so auch UpdateCriteriaAndOrderBy. Nur dass dort in Zeile 10 das ctl jedes ungerade Mal nicht referenziert wird (resp. den Wert NULL ausgibt). Und das komische daran ist, dass dies nur beim Ausführen mit der Tastatur geschieht. Der Code ist ja bei beiden der Gleiche...

    Hier noch der Code, wie ich die Formularfunktionien initialisiere:

    Private Function Init() DoCmd.Hourglass True With SearchForm .OnKeyDown = "[Event Procedure]" .KeyPreview = True ' Dieses Feld ist immer aktiv und sichtbar.
    !Sortierung1.SetFocus 'Steuerelemente initialisieren Set cmdCancel = !cmdCancel cmdCancel.OnClick = "[Event Procedure]" Set cmdOK = !cmdOK cmdOK.OnClick = "[Event Procedure]" <weitere Supercode> End Function

    Hast Du oder jemand sonst noch weitere Ideen?

    Danke und Gruss

    Thomas


    Danke und Gruss Thomas


    • Bearbeitet Alphawolfi Donnerstag, 17. April 2014 06:47
    Donnerstag, 17. April 2014 06:42
  • Hallo Thomas,

    eine kleine Alternative zu Deinem Vorgehen. Du kannst Du OK-Schaltfläche als Standardschaltfläche definieren. Dann wird die zugehörige Prozedur immer ausgeführt, wenn Du die Return-Taste betätigst. Weiteren Code brauch es dafür nicht.

    HTH


    Thomas@Team-Moeller.de
    Blog: Blog.Team-Moeller.de
    Homepage: www.Team-Moeller.de


    Samstag, 19. April 2014 06:59