Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Radiogroup: Tastatur und Mauseingabe unterscheiden (https://www.delphipraxis.net/151622-radiogroup-tastatur-und-mauseingabe-unterscheiden.html)

idefix2 25. Mai 2010 20:20


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?

Luckie 25. Mai 2010 20:40

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.

idefix2 25. Mai 2010 21:04

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.

Luckie 25. Mai 2010 21:25

Re: Radiogroup: Tastatur und Mauseingabe unterscheiden
 
Äh, reden wir von einer Radiogroup oder Listbox? Deine Beschreibung klingt eher nach einer Listbox.

idefix2 25. Mai 2010 21:58

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.

Lannes 25. Mai 2010 22:43

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.

sx2008 26. Mai 2010 01:44

Re: Radiogroup: Tastatur und Mauseingabe unterscheiden
 
Zitat:

Zitat von idefix2
und in dem Fall will ich den Eingabefocus mittels editx.setfocus direkt auf das passende Editfeld setzen

Davon kann ich Dir nur abraten.
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).

idefix2 26. Mai 2010 09:37

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.

Sherlock 26. Mai 2010 09:52

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

idefix2 26. Mai 2010 10:04

Re: Radiogroup: Tastatur und Mauseingabe unterscheiden
 
Zitat:

Ist alles schon richtig so wie man sich das gedacht hat.
Genau, und Bill Gates ist unser Prophet

Sherlock 26. Mai 2010 11:27

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

Glühwürmchen 26. Mai 2010 11:44

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?

idefix2 26. Mai 2010 11:50

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.

Glühwürmchen 26. Mai 2010 12:32

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....

idefix2 26. Mai 2010 16:09

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 03:31 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz