Fragensteller
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
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
-
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 FunctionHast Du oder jemand sonst noch weitere Ideen?
Danke und Gruss
Thomas
Danke und Gruss Thomas
- Bearbeitet Alphawolfi Donnerstag, 17. April 2014 06:47
-
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- Bearbeitet Thomas Möller MVP Samstag, 19. April 2014 07:00