Autor |
Beitrag |
MeierZwoo
      
Beiträge: 94
Erhaltene Danke: 11
Win 7, DOS5
Delphi 2007 Architect, BP7/TP5, LISP, PS
|
Verfasst: Di 30.07.13 23:19
Hi,
ich habe zwecks Eingabebestätigung die Leertaste (ASCII 32dec) eingesetzt, weil sie schon groß ist und sie mit der linken Hand gut antatschbar ist, während die rechte auf der Maus bleibt. Um mich dann zu wundern, daß ständig irgendwelche Checkboxen schalteten, wenn cih die Leertaste für meine gewünschte Funktion betätigte - bis ich feststellte, daß die Leertaste auf ein Steuerelement mit Focus als OnClick wirkt.
Um das zu verhindern, habe ich allen aktuell vorhandenen Steuerelementen auf der aktuellen Form den Focus per
Delphi-Quelltext 1: 2: 3: 4: 5:
| procedure xxxForm.OnClickyyy (Sender: TObject); begin ... xxxForm.ActiveControl:=Nil; end; |
in jedem OnClick entzogen.
Gibt es eine einfachere, zentralere Methode, die Taste #32 nur als Tasteneingabe zur Verfügung zu haben, also das OnClick Auslösen per #32 zu unterbinden?
MfG
|
|
FinnO
      
Beiträge: 1331
Erhaltene Danke: 123
Mac OSX, Arch
TypeScript (Webstorm), Kotlin, Clojure (IDEA), Golang (VSCode)
|
Verfasst: Di 30.07.13 23:54
MeierZwoo hat folgendes geschrieben : | ich habe zwecks Eingabebestätigung die Leertaste (ASCII 32dec) eingesetzt [...] |
Ohne dir zu nahe treten zu wollen... Zur Eingabebestätigung gibt es eine Eingabetaste (aka Enter). Die heißt nicht zum Spaß so. Ferner: Du musst die Hand auch nicht von der Maus nehmen, wenn du mit der linken Hand die Eingabetaste drückst. Groß ist sie auch - was will man mehr?
Gruß
|
|
MeierZwoo 
      
Beiträge: 94
Erhaltene Danke: 11
Win 7, DOS5
Delphi 2007 Architect, BP7/TP5, LISP, PS
|
Verfasst: Mi 31.07.13 00:14
FinnO hat folgendes geschrieben : | Zur Eingabebestätigung gibt es eine Eingabetaste (aka Enter). |
Ohne dir nahe treten zu wollen: das hilft nun ungemein weiter.
Außerdem gibt es auf normalen Tastauren zwei Enter-Tasten, nicht eine.
|
|
FinnO
      
Beiträge: 1331
Erhaltene Danke: 123
Mac OSX, Arch
TypeScript (Webstorm), Kotlin, Clojure (IDEA), Golang (VSCode)
|
Verfasst: Mi 31.07.13 00:48
Siehe auch: Microsoft Dev Center: Keyboard
Zitat: | Spacebar, Enter, and Esc keys. The spacebar activates the control with input focus, whereas the Enter key activates the default button. Pressing the Esc key cancels or closes the window. |
Du begehst sozusagen ein Rebellion mit deinem Vorhaben. Daher: Warum Dinge nicht so machen, wie sie gedacht sind?
|
|
MeierZwoo 
      
Beiträge: 94
Erhaltene Danke: 11
Win 7, DOS5
Delphi 2007 Architect, BP7/TP5, LISP, PS
|
Verfasst: Mi 31.07.13 05:44
Die Rebellion ist wohl ehr, eine Buchstabentaste (Space) mit Steuerfunktion zu belegen wie eine Steuertaste. Zumal diese Funktion ja bei jedem Editierfeld unterdrückt werden muß.
Ich habe bis gestern nicht gewußt, daß Space solche Wirkung hat - und ich wette, die wenigsten Benutzer wissen dies, da die wenigsten wohl Windows mit der Tastatur steuern können und dieses Wissen meist bei TAB endet.
Die einzige Funktion, die ich der Leertaste zugestehen würde, ist "..any key".
FinnO, außerdem widerspricht deine zweite Aussage deiner ersten, in der Du die Entertaste vorschlägst - denn die würde ja auf einen aktivierten Button wirken, in meiner Situation einem Reset-Button. Schon aus diesem Grund habe ich die Entertaste nie in Erwägung gezogen.
Es gibt Situationen, in denen der (kaum bekannte und wohl nie benutzte) Standard eben nicht ausreicht oder störend ist. In meiner angesprochenen Bediensituation benötige ich zu einer kontiunierlichen Mausbewegung eine ständige Bestätigung von Punkten auf der Mausspur. Wobei die meist zittrige Mausbewegung auch mit feineren Tastatur-Steuerbewegungen ergänzt wird/werden kann.
Der Benutzer hat (als Rechtshänder) also die rechte Hand an der Maus, die linke Hand auf dem klassischen Cursorkreuz S-D-E-X oder sonstwo und die Leertaste bietet sich zum markieren an - keine andere Taste ist so schnell, einfach und (treff)sicher erreichbar und hat ja auch snsonsten keine andere Funktion (dachte ich bis gestern). Alles andere führt zu ungewöhnlichen Verrenkungen.
Und da es genug Programme gibt, die den Focus innerhalb der eigenen Form gänzlich unterbinden, dachte ich an eine solche Lösung - bzw. allen Steuerelementen per Eigenschaft keinen Focus zuzuweisen.
|
|
Perlsau
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Mi 31.07.13 07:31
MeierZwoo hat folgendes geschrieben : | Der Benutzer hat (als Rechtshänder) also die rechte Hand an der Maus, die linke Hand auf dem klassischen Cursorkreuz S-D-E-X oder sonstwo und die Leertaste bietet sich zum markieren an - keine andere Taste ist so schnell, einfach und (treff)sicher erreichbar und hat ja auch snsonsten keine andere Funktion (dachte ich bis gestern). Alles andere führt zu ungewöhnlichen Verrenkungen. |
Also wenn ich meine linke Hand über den Cursortasten habe, dann bin ich damit schneller auf Enter als auf Space.
|
|
MeierZwoo 
      
Beiträge: 94
Erhaltene Danke: 11
Win 7, DOS5
Delphi 2007 Architect, BP7/TP5, LISP, PS
|
Verfasst: Mi 31.07.13 08:11
Perlsau hat folgendes geschrieben : | Also wenn ich meine linke Hand über den Cursortasten habe, dann bin ich damit schneller auf Enter als auf Space. |
Das klassische Cursorkreuz S-D-E-X liegt aber recht weit von Enter entfernt, nämlich genau entgegen gesetzt weit links.
Logo könnten die Cursortasten auch per Voreinstellung auf die normalen Cursortasten nach rechts verlegt werden (z.B. auch für Linkshänder), nur ändert das nichts an der Grundproblematik, daß die Entertaste auch nicht zu gebrauchen ist, da sie auch auf Focus-Steuerelemente wirkt, also dieselbe Problematik mit dem Focus besteht wie bei der Leertaste.
|
|
Mathematiker
      
Beiträge: 2622
Erhaltene Danke: 1448
Win 7, 8.1, 10
Delphi 5, 7, 10.1
|
Verfasst: Mi 31.07.13 08:32
Hallo,
um zur eigentlichen Frage zurückzukommen:
Eine einfache, wenn auch nicht professionelle, Idee ist es, wenn Du einem Menüpunkt die Space-Taste als Hotkey zuweist. Dieser Menüpunkt erhält gleichzeitig Deine geplante Space-Methode und wenn man ihn nicht sehen soll, erhält er noch visible=false.
Danach schaltet die Space-Taste fokusierte Objekte nicht mehr.
Wie gesagt, nicht professionell, aber wirksam.
Beste Grüße
Mathematiker
_________________ Töten im Krieg ist nach meiner Auffassung um nichts besser als gewöhnlicher Mord. Albert Einstein
|
|
MeierZwoo 
      
Beiträge: 94
Erhaltene Danke: 11
Win 7, DOS5
Delphi 2007 Architect, BP7/TP5, LISP, PS
|
Verfasst: Mi 31.07.13 09:43
Mathematiker, danke, aber eine "Buchstabentaste" als HotKey zu binden, würde auch bedeuten, diese Bindung nach Ende des Programmteils wieder unbedingt aufheben zu müssen, weil #32 sonst im Restprogrammm in Schreibfeldern fehlt. Im Hinblick auf die Programmpflege zu kritisch (man darf es ja auch in fünf oder zehn Jahren nicht übersehen). Außerdem würde ein Teil eines Steuerelementes blockiert, was im Hinblick auf die Programmpflege genau so kritsisch ist.
Da ist meine eben rein lokale Lösung mit einem fetten Kommentar an der Tastenabfrage noch die praktikabelste und zukunftsträchtigste Lösung: eine Zeile pro Steuerelement-OnClick und nur lokal und nur in diesem einen Programmteil. Wenn auch wenig elegant, vorallem weil man zur Laufzeit sieht, wie der Focus entzogen wird, wenn das Steuerelement benutzt wird.
|
|
jaenicke
      
Beiträge: 19314
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Mi 31.07.13 11:27
Du müsstest die Taste als Dialogtaste abfangen können indem du bei WM_GETDLGCODE sagst, dass du die Behandlung übernimmst...
msdn.microsoft.com/e...645425(v=vs.85).aspx
(speziell DLGC_RADIOBUTTON usw.)
Für diesen Beitrag haben gedankt: MeierZwoo
|
|
MeierZwoo 
      
Beiträge: 94
Erhaltene Danke: 11
Win 7, DOS5
Delphi 2007 Architect, BP7/TP5, LISP, PS
|
Verfasst: Mi 31.07.13 12:46
jaenicke hat folgendes geschrieben : | Du müsstest die Taste als Dialogtaste abfangen können indem du bei WM_GETDLGCODE sagst, dass du die Behandlung übernimmst... |
Ja, das funktioniert, habe es für ein Element angetestet.
Aber der Aufwand ist erheblich, weil es für jedes Kontrollelement implementiert werden muß - und davon habe ich in diesem Programmteil einen Button, zwei CheckBoxen und acht RadioButtons. Also belibe ich bei meiner uneleganten, brutalen Lösung, auch wenn dann kein Focus mer vorhanden ist und kein Anwender sich mit TAB durch die Elemente wühlen kann (was wohl eh niemand vorhat).
Danke für die Antworten, Thema damit erledigt 
|
|
jaenicke
      
Beiträge: 19314
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Mi 31.07.13 13:36
Du musst doch eigentlich nur die WndProc deines Formulars überschreiben hätte ich gedacht?
|
|
MeierZwoo 
      
Beiträge: 94
Erhaltene Danke: 11
Win 7, DOS5
Delphi 2007 Architect, BP7/TP5, LISP, PS
|
Verfasst: Mi 31.07.13 14:10
jaenicke hat folgendes geschrieben : | Du musst doch eigentlich nur die WndProc deines Formulars überschreiben hätte ich gedacht? |
Auf einzelne, aktuelle Steuerelemente bezogen, habe ich es ja noch einigermaßen testweise grob hinbekommen, wenn auch nicht ganz begriffen.
WndProc der Form zu ändern ist mir, so wie ich es bisher nachgelesen, habe etwas zu hoch. Und jeder Fehler, jede Unsauberkeit wirkt sich dann auf das gesamte Programm aus nicht nur auf den lokalen kleinen Programmteil- mit endlosen Fehlersuchen.
Allerdings hast Du in der Weise recht, daß meine Eingangsfrage darauf abzielte, es "zentral" zu regeln.
Ich hätte vor 20 Jahren mit OOP anfangen sollen, als alle noch übten - nun erst ist nach 40 Jahren Zwangssteuerung etwas zu spät, das alles in den Kopf zu bekommen *g
Danke 
|
|
Martok
      
Beiträge: 3661
Erhaltene Danke: 604
Win 8.1, Win 10 x64
Pascal: Lazarus Snapshot, Delphi 7,2007; PHP, JS: WebStorm
|
Verfasst: Mi 31.07.13 18:36
Mathematiker hat folgendes geschrieben : | Eine einfache, wenn auch nicht professionelle, Idee ist es, wenn Du einem Menüpunkt die Space-Taste als Hotkey zuweist. Dieser Menüpunkt erhält gleichzeitig Deine geplante Space-Methode und wenn man ihn nicht sehen soll, erhält er noch visible=false. |
Menü ist nicht ganz so einfach, mit einer Action geht das wesentlich besser. Die mischen sich nämlich wirklich überall ein (was manchmal auch nervt, hier aber wunderbar passt) und man wird sie einfach wieder los
MeierZwoo hat folgendes geschrieben : | Mathematiker, danke, aber eine "Buchstabentaste" als HotKey zu binden, würde auch bedeuten, diese Bindung nach Ende des Programmteils wieder unbedingt aufheben zu müssen, weil #32 sonst im Restprogrammm in Schreibfeldern fehlt. |
Eine Zeile, worst case. Sowas sollte man eh dokumentieren.
Für Messplätze ("jetzt mal bitte einen Wert einlesen") mach ich das meistens so, wie im Anhang.
Einloggen, um Attachments anzusehen!
_________________ "The phoenix's price isn't inevitable. It's not part of some deep balance built into the universe. It's just the parts of the game where you haven't figured out yet how to cheat."
|
|
Gerd Kayser
      
Beiträge: 632
Erhaltene Danke: 121
Win 7 32-bit
Delphi 2006/XE
|
Verfasst: Mi 31.07.13 19:37
MeierZwoo hat folgendes geschrieben : | Aber der Aufwand ist erheblich, weil es für jedes Kontrollelement implementiert werden muß - und davon habe ich in diesem Programmteil einen Button, zwei CheckBoxen und acht RadioButtons. |
Ersetze doch einfach den Button, die Checkboxen und RadioButtons durch SpeedButtons. Die können nicht den Focus erhalten.
|
|
MeierZwoo 
      
Beiträge: 94
Erhaltene Danke: 11
Win 7, DOS5
Delphi 2007 Architect, BP7/TP5, LISP, PS
|
Verfasst: Mi 31.07.13 22:18
Martok, danke für die Mühe, es hat auch funktioniert. Nur dann ist das aufgetreten, was ich befürchtet habe:
Beim Start (Form.Created) den ShortCut eingerichtet und disabled,
beim Start des Programmteiles enabled,
am Ende des Programmteiles wieder disabled ...
danach lies es sich nicht wieder enablen
Das liegt bestimmt an mir und der Komplexität des Programmes und der mittlerweile teils chaotischen Struktur.
Da gefällt mir Gerds Vorschlag wesentlich besser, weil der vom Chaos unabhängig ist auch wenn er anfänglich mehr Arbeit macht zumal ich noch nie einen SpeedButton benutzt habe und die Abhängigkeiten untereinander bzw. Unabhängigkeiten noch nicht kenne. Aber diese Lösung hat auch den Vorteil, daß sie häppchenweise implementiert werden kann.
Danke 
|
|
Gerd Kayser
      
Beiträge: 632
Erhaltene Danke: 121
Win 7 32-bit
Delphi 2006/XE
|
Verfasst: Mi 31.07.13 22:52
MeierZwoo hat folgendes geschrieben : | zumal ich noch nie einen SpeedButton benutzt habe und die Abhängigkeiten untereinander bzw. Unabhängigkeiten noch nicht kenne. |
Die wichtigste Eigenschaft bei den SpeedButtons dürfte im Hinblick auf den Ersatz für die Checkboxen bzw. RadioButtons der GroupIndex sein. Damit kannst Du die SpeedButtons gruppieren und somit bestimmen, ob z. B. mehrere SpeedButtons gleichzeitig gedrückt sein dürfen.
Erstelle einfach mal ein kleines Testobjekt mit einigen SpeedButtons und spiele mal mit dem GroupIndex herum.
Ich persönlich verwende am liebsten die TLMDSpeedButtons von www.lmdinnovative.com/. Damit kann man noch einige Dinge mehr machen. Schau Dir mal das Programm hier an www.entwickler-ecke....;highlight=etiketten. Dort verwende ich diese TLMDSpeedButtons.
|
|
MeierZwoo 
      
Beiträge: 94
Erhaltene Danke: 11
Win 7, DOS5
Delphi 2007 Architect, BP7/TP5, LISP, PS
|
Verfasst: Do 01.08.13 12:00
Zu Martoks Hotkey-Version möchte ich abschließend nur noch sagen, daß diese Methode bestimmt korrekt funktioniert, wenn man nicht wie ich (aus Versehen) eine quasi Kreuzreferenz zwischen enablen und disablen einbaut.
Zu Gerds SpeedButton-Vorschlag (hier) abschließend: Ich werde mir die SpeedButton in Ruhe ansehen, eben hat der sachliche Teil Vorrang und eine weitere Diskussion in diesem Thread würde das Prinzip "Eine Frage, ein Thread" sprengen.
|
|
MeierZwoo 
      
Beiträge: 94
Erhaltene Danke: 11
Win 7, DOS5
Delphi 2007 Architect, BP7/TP5, LISP, PS
|
Verfasst: Fr 09.08.13 16:44
@Gerd Kayser
Das mit den SpeedButtons als Ersatz für RadioButtons und CHeckBoxen klappt nicht. Ich kann den ersetzten SpeedButtons und RadioButtons einfach nicht das "Eindrücken" abgewöhnen, weder mit den SpeedButtons aus Delphi selber noch bei den TLMDSpeedButtons.
Ich habe keine Eigenschaft gefunden, die diese "Eindrücken" beim Anklicken unterbindet 
|
|
Gerd Kayser
      
Beiträge: 632
Erhaltene Danke: 121
Win 7 32-bit
Delphi 2006/XE
|
Verfasst: Fr 09.08.13 17:03
MeierZwoo hat folgendes geschrieben : | Ich habe keine Eigenschaft gefunden, die diese "Eindrücken" beim Anklicken unterbindet  |
Meinst Du mit "Eindrücken" das Einrasten bei den SpeedButtons?
Schau Dir mal GroupIndex und AllowAllUp bei den SpeedButtons an. Ansonsten schicke mir mal per private Mail die Exe und eine genaue Beschreibung des Fehlverhaltens zu.
|
|
|