Delphi-PRAXiS
Seite 1 von 2  1 2   

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


Alle Zeitangaben in WEZ +1. Es ist jetzt 05:41 Uhr.
Seite 1 von 2  1 2   

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