![]() |
Radiogroup: Tastatur und Mauseingabe unterscheiden
In einer Radiogroup kann die Elementauswahl über einen Klick mit der Maus oder über die Tastatur mittels Pfeiltasten erfolgen.
Um auf eine Änderung zu reagieren, hab ich aber nur das Ereignis onclick gefunden, das wird bei einem Mausklick auf ein Element der Radiogroup ebenso ausgelöst wie wenn durch Drücken einer Pfeiltaste das gewählte Element geändert wird. Gibt es irgend eine Möglichkeit für das Programm, festzustellen, ob das Ereignis durch Mausklick oder durch Tastatureingabe ausgelöst wurde? |
Re: Radiogroup: Tastatur und Mauseingabe unterscheiden
Warum willst du dies unterscheiden? Der Benutzer wird sehr verwirrt sein, wenn er mit der Maus etwas anderes auslöst, als mit der Tastatur.
|
Re: Radiogroup: Tastatur und Mauseingabe unterscheiden
Finde ich nicht.
Wenn er mit der Maus ein Element auswählt, hat er seine Auswahl gemacht. Bei manchen Elementen ist nun die Eingabe eines Zusatztextes nötig, und in dem Fall will ich den Eingabefocus mittels editx.setfocus direkt auf das passende Editfeld setzen, damit erspart er sich ein extra-Tab bzw. einen Mausklick. Wenn er mit der Tastatur in der Radiogroup hinauf oder hinuntergeht, heisst das nicht, dass er schon dort ist, wo er hinwill, in dem Fall muss der Focus in der Radiogroup bleiben, bis der User sie mit der tab Taste oder mit der Maus verlässt. |
Re: Radiogroup: Tastatur und Mauseingabe unterscheiden
Äh, reden wir von einer Radiogroup oder Listbox? Deine Beschreibung klingt eher nach einer Listbox.
|
Re: Radiogroup: Tastatur und Mauseingabe unterscheiden
Nein, eine Radiogroup.
In der Radiogroup gibt es mehrere Möglichkeiten zum ankreuzen: Klavier verkauft Pianino verkauft Klavier vermietet Pianino vermietet sonstiges Im Fall von Verkauf taucht eine zusätzliche Editbox mit dem Titel Kaufpreis auf. Im Fall von Sonstiges taucht ein zusätzliches Memofeld mit dem Titel info auf. Beim Klick auf Verkauf wird das Feld Kaufpreis visible und der Focus wandert sofort in das Feld Kaufpreis Beim Klick auf Sonstiges wird das Memofeld visible und der Focus wandert sofort in das Memofeld Beim Bewegen mit der Tastatur soll nur das Eingabefeld sichtbar werden, das dem aktuell angewählten Radiogroupitem entspricht, der Focus muss aber in der Radiogroup bleiben, weil ich nicht weiss, ob der user mit den Pfeiltasten weitergehen will oder schon beim gewünschten Element gelandet ist. |
Re: Radiogroup: Tastatur und Mauseingabe unterscheiden
Hallo,
Workaround: Die Elementen(Controls) der RadioGroup besitzen auch Ereignisse denen man Event-Handler zuweisen kann. MyKeyUp und MyMouseUp sind nicht den Ereignissen der Form zugewiesen. Das Ereignis OnClick der RadioGroup benötigt man dann nicht mehr, hier die komplette Demo-Unit:
Delphi-Quellcode:
unit Unit1;
interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls; type TForm1 = class(TForm) RadioGroup1: TRadioGroup; procedure FormCreate(Sender: TObject); private { Private-Deklarationen } public { Public-Deklarationen } procedure MyMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); procedure MyKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState); end; var Form1: TForm1; implementation {$R *.DFM} procedure TForm1.FormCreate(Sender: TObject); var z: Integer; begin for z := 0 to Pred(RadioGroup1.ControlCount) do with TRadioButton(RadioGroup1.Controls[z]) do begin OnMouseUp := MyMouseUp; OnKeyUp := MyKeyUp; end; end; procedure TForm1.MyKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState); begin showmessage('Mit einer Taste: '+IntToStr(RadioGroup1.ItemIndex)); end; procedure TForm1.MyMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin showmessage('Mit der Maus: '+IntToStr(RadioGroup1.ItemIndex)); end; end. |
Re: Radiogroup: Tastatur und Mauseingabe unterscheiden
Zitat:
Programme, die eigenmächtig den Focus verändern verhalten sich anderst als der Windowsbenutzer es gewohnt ist. Je mehr Logik im Programm dafür aufgewendet wird umso unvorhersagbarer wird sich das Programm verhalten. Also ich kenne kein etabliertes Programm dass den Focus verändert. Ich würde nur eine Situation zulassen, bei dem der Focus vom Programm verändert werden darf: Wenn der Benutzer "OK" klickt werden alle Eingaben auf Vollständigkeit/Korrektheit überprüft. Sollte etwas fehlen, darf das Programm den Fokus auf das Feld mit den fehlenden/falschen Daten setzen und dann eine Exception auslösen (z.B. Kaufpreis fehlt). |
Re: Radiogroup: Tastatur und Mauseingabe unterscheiden
@ sx2008
Dass der Focus in einer Radiogroup bleibt, nachdem der User mit der Maus den gewünschten Knopf angeklickt hat, ist völlig sinnlos. In dem Bereich will er sicher nichts machen, vor allem nicht mit der Tastatur, für die der Focus ja relevant ist. Wenn als nächstes ein Tastatureingabefeld kommt, ist es sehr hilfreich, den Focus gleich dorthin zu versetzen, es erspart dem Anwender eine völlig unnötige Aktion (Tab Taste oder Mausklick auf das nächste Feld). Über eine Menge Programme, die dem User absolut unnötige Eingaben nicht abnehmen, ärgere ich mich immer wieder. @ Lannes Danke, das werde ich einbauen. |
Re: Radiogroup: Tastatur und Mauseingabe unterscheiden
Idefix: Es ist nach Deiner Logik auch unsinnig, daß eine ComboBox nach dem Auswählen des gewünschten Eintrags noch den Focus hat...ist aber dennoch richtig. Mach doch nicht solche Klimmzüge. Ist alles schon richtig so wie man sich das gedacht hat. Du kannst Dir sicher sein, daß 99% Deiner Nutzer (es sei denn, Du bist der einzige) mit der Maus nochmals das Editfeld anklicken werden, nachdem sie den entsprechenden Radiobutton angeklickt haben, egal ob es schon den Focus hat, oder nicht. Aber, wenn du noch so viel Energie in eher ungewöhnliche Features investieren kannst, muss der Rest des Programms ja der Hammer sein, und so Kleinigkeiten lassen sich verschmerzen ;)
Sherlock |
Re: Radiogroup: Tastatur und Mauseingabe unterscheiden
Zitat:
|
Re: Radiogroup: Tastatur und Mauseingabe unterscheiden
Ich bin der letzte, der das behauptet. Aber jede Literatur zur Usability wird Dir genau das sagen "Fokus setzt der Anwender, und sonst keiner". Nur wie schon erwähnt: Investier Deine Zeit halt in so Spielereien, so lange der Rest Deines Produktes gut ist, wird sich keiner daran stören.
Sherlock |
Re: Radiogroup: Tastatur und Mauseingabe unterscheiden
Was ich hier nicht verstehe, ist, wo der Unterschied zwischen der Maus-Bedienung und der Tastatur-Bedienung liegt!
Wenn Du in einer Radiogroup einen Radiobutton anklickst, erhält der den Fokus und ist anschließend selektiert. Wenn Du in einer Radiogroup einen Radiobutton mit der Tastatur ansteuerst, wechselt der Fokus zum jeweils nächsten Radiobutton der Tab-Order-Reihenfolge. Selektieren musst Du ihn aber mit der Leertaste! Erst nach dem Selektieren hast Du den gleichen Zustand wie nach einem Mausklick. Wo ist jetzt das Problem? |
Re: Radiogroup: Tastatur und Mauseingabe unterscheiden
Nein, er wird automatisch durch die Ansteuerung mit der Tastatur selektiert. Mmöglicherweise gibt es eine Eigenschaft, die man setzen kann, damit die Komponente sich anders benimmt, aber beim Standardverhalten braucht man keine Leertaste.
|
Re: Radiogroup: Tastatur und Mauseingabe unterscheiden
:oops:
sorry, hast recht. Du könntest immer, wenn der Fokus auf in einer Radiogroup liegt, auf die Steuercodes der Cursor-Tasten abfragen. Oder alternativ, auf die Eingabe von #13 (Return) warten. Im Falle eines Mausklicks erhältst Du Mauskoordinaten. ------------------ Übrigens finde ich diese Art der User-Führung auch schön. Sie gestaltet sich aber sehr zeitaufwändig, wenn man versucht, das Ganze absolut wasserdicht zumachen, also so, dass die Benutzerführung immer logisch ist und alle Eventualitäten abgefangen werden. Darunter zählen auch die Situationen, in die ein User kommt, wenn er gewohnheitsmäßig die Maus zur Steuerung verwendet und damit in ein Feld wechselt, dass er zum gegewärtigen Zeitpunkt (nach Deiner Logik) noch nicht anfassen sollte.... |
Re: Radiogroup: Tastatur und Mauseingabe unterscheiden
Das Problem ist, dass der selbe Event ausgelöst wird, wenn man Tastatur oder wenn man die Maus verwendet, und dass ich in diesem Event anscheinend nicht leicht feststellen kann, was es war. Aber mit dem von Lannes geposteten Code sollte das funktionieren - ist halt wirklich im Verhältnis recht aufwändig. Aber wie Du richtig schreibst, ein wirklich durchdachtes Userinterface ist aufwändig.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:03 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz