ListCtrl: Focus-Kontrolle und Enter-Events

Datenbanklösungen mit AOO/LO

Moderator: Moderatoren

MaddinR
***
Beiträge: 61
Registriert: So, 06.03.2011 11:15

ListCtrl: Focus-Kontrolle und Enter-Events

Beitrag von MaddinR »

Hallo Leute

Die "Merkwürdigkeit" in meinem FormView besteht immer noch.... weiterhin ungelöst und unerklärt.... :? ... zur Erinnerung, was das Problem war....:

Ich habe auf einem FormView zwei Controls: ein ListCtrl und ein GridCtrl. Das ListCtrl enhält aus einer Tabelle (in einer Abfrage zusammengebastelte) Kostenstellen, das GridCtrl enthält aus einer weiteren Tabelle, ebenfalls durch ein Query ermittelt, Umsatz-Datensätze mit fehlender Kostenstellen-Zuordnung. Die Absicht: Bei Doppel-Click oder Enter im List-Ctrl soll die ausgewählte Kostenstelle auf den aktuellen im Grid-Ctrl markieren Satz geschrieben werden und danach der Satzzeiger +1 erhöht werden. Also eine vollkommen triviale Anwendung.

Festzustellen ist, dass es bei Doppelclick fehlerfrei funktioniert. Merkwürdige Probleme gibt es nur bei der Enter-Taste. Ich habe hier als Anlage zum Posting 2 DB's angefügt, die sich nur durch ein kleines Detail unterscheiden. Ich habe auf dem eigentlichen FormView ein weiteres (drittes) Ctrl platziert, und zwar ein Edit-Control um Debugging- oder Trace-Infos anzuzeigen. Der Unterschied in den beiden DB's besteht darin, dass dieses Edit-Control einmal auf dem Formular "ListCtrl" eingerichtet ist, in der 2. Version auf dem Formular "GridCtrl". In Moment zählt es nur einen Zähler hoch, jeweils +1 bei Druck einer Taste und bei Loslassen einer Taste. Ich wollte darüber festestellen, ob und wann das Keyboard-Event ausgelöst wird.

Nun das Phänomen:
Wenn dieses zusätzliche Trace-Edit-Control entweder gar nicht vorhanden ist oder es sich auf dem GridCtrl-Formular befindet, skip't bei Enter im ListCtrl völlig unerwünscht das GridCtrl plus 2 Sätze.

Befindet sich das Trace-Edit-Control auf dem ListControl-Formular in der Tab-Order hinter dem List-Ctrl erhält es bei Enter einmal kurz den Focus und das wars. Das GridCtrl reagiert so wie es sein soll, nämlich gar nicht.

Ich könnte das Problem jetzt einfach dadurch lösen, in dem ich das Zählerfeld einfach als "Gewollt und Muss-so-sein" unter das ListCtrl positionieren würde. Aber das will ich eigentlich gar nicht. Bislang war ich gewohnt, die Maschine immer dazu zubringen, dass zu tun, was ich will und nicht mit Anpassungsreaktionen auf die Macken der Maschine zu reagieren, zumal mir die Macke weder plausibel noch logisch nachvollziehbar ist.

Wenn bei Enter der Focus genau wie bei Doppel-Click im List-Ctrl bleiben würde, wäre das Problem gelöst. Es heisst ja schließlich auch Tab-Order und nicht Enter-Order... 8) ... oder?

Hat vielleicht jemand mit viel mehr Erfahrung als ich sie habe eine Idee?

vg, Maddin
OOo-Forum1.odb
(22.61 KiB) 105-mal heruntergeladen
OOo-Forum2.odb
(22.62 KiB) 108-mal heruntergeladen
DPunch
*******
Beiträge: 1112
Registriert: Mo, 02.11.2009 16:16
Wohnort: Marburg

Re: ListCtrl: Focus-Kontrolle und Enter-Events

Beitrag von DPunch »

Aloha

So phänomenal ist das Ganze gar nicht.
In Formularen wird standardmässig per Enter das nächste Kontrollelement angesprungen - ist das Ende der Aktivierungsreihenfolge erreicht (sprich: geht die Reihe von vorne los), springt der Zeiger im Gridcontrol automatisch auf den nächsten Datensatz - mag Dich in diesem Fall stören, ist aber äusserst praktisch beim Eingeben von Datensätzen per Hand.
Was nun passiert bei Dir:
Du dückst das erste Mal Enter in der Listbox (TabIndex: 2) - die gewünschte Makro-Aktion wird ausgeführt und der Zeiger im Gridcontrol mit oForm.Next() einen Datensatz weiter gesetzt. Automatisch wird das nächste Element in der Aktivierungsreihenfolge gesucht - es gibt kein Element mit einem höheren TabIndex, also wird nach TabIndex 1 gesucht. Dein Gridcontrol wird zum ersten Mal mit TabIndex 1 angesprochen. Noch alles in Ordnung.
Ab dem zweiten Enter-Drücken wird dann aber jeweils durch oForm.Next() *und* durch die Tatsache, dass mit jedem erneuten ansprechen der Gridcontrol für diese ein neuer Zyklus beginnt, der Zeiger einen Datensatz nach vorne gerückt. Daher der doppelte Sprung.

Einfache Lösung: TabIndex der Gridcontrol auf 0 setzen.
Fertig.
MaddinR
***
Beiträge: 61
Registriert: So, 06.03.2011 11:15

Re: ListCtrl: Focus-Kontrolle und Enter-Events

Beitrag von MaddinR »

Aloha ʻauinalā

Danke! Das hat meine Probleme gelöst. Allerdings bin ich mir im Moment noch etwas unsicher, ob ich da auch von selber hätte drauf kommen können.... :? .... aber eigentlich bin ich sicher, dass ich das nicht alleine gelöst hätte ... zumindest nicht so (im nachhinein erkennbar) einfach und plausibel. Ich hatte da eine völlig andere Erwartungshaltung für die Lösung.... *hmmm*.... also noch mal: Danke!

vg, Maddin
DPunch hat geschrieben:Aloha
So phänomenal ist das Ganze gar nicht......
Antworten