Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Mehrere Tasten in einer Procedure abfragen? (https://www.delphipraxis.net/167355-mehrere-tasten-einer-procedure-abfragen.html)

mat72 26. Mär 2012 09:38

Delphi-Version: 5

Mehrere Tasten in einer Procedure abfragen?
 
Hallo,
ich habe eine Form erstellt und will von einem Textfeld in das nächste wechseln mit Enter, Tab oder Mausklick.
Mit Enter das funktioniert super. Jetzt geht leider meine Tab-Taste nicht mehr.
Ist es möglich mit folgender Procedure mehrere Tasten abzufragen?

procedure TForm3.Edit13KeyPress(Sender: TObject; var Key: Char);
begin
if Key=#13 Key=#01 then
begin
try
mo2x:=StrToFloat(Edit13.Text);
Edit14.SetFocus;
mo2x:=mo2x;
except
ShowMessage('Please enter only Numbers!');
Edit13.Clear;
Edit13.SetFocus;
end;
end;
end;
end;
Vielen Dank für eure Hilfe. Bitte etwas Nachsicht, ich habe erst angefangen mit Delphi zu programmieren.
Gruss
Matthias

DeddyH 26. Mär 2012 09:41

AW: Mehrere Tasten in einer Procedure abfragen?
 
Z.B. mit case geht sowas ganz einfach:
Delphi-Quellcode:
case Key of
  #13,
  #27,
  #255:
    MachIrgendwas;
end;

himitsu 26. Mär 2012 09:45

AW: Mehrere Tasten in einer Procedure abfragen?
 
Boolesche Operatoren und Klammern verwenden?
Das sollte aber in jedem billigen Delphi-Tutorial genannt sein.

Delphi-Quellcode:
if (Key=#13) or (Key=#01) then

if Key in [#13, #01] then

if CharInSet(Key, [#13, #01]) then // Korrekte Behandlung für UnicodeDelphis

mat72 26. Mär 2012 10:07

AW: Mehrere Tasten in einer Procedure abfragen?
 
Hallo himitsu,
ich habe deinen Vorschlag mal ausprobiert.
Code:
procedure TForm3.Edit1KeyPress(Sender: TObject; var Key: Char);
begin
 if Key in [#13, #01, #09] then
    begin
     try
         ol:=StrToFloat(Edit1.Text);
         Edit2.SetFocus;
         ol:=ol;
     except
         ShowMessage('Please enter only Numbers!');
         Edit1.Clear;
         Edit1.SetFocus;
    end;
 end;
end;
Leider nimmt das Programm die Tab-Taste und die linke Maustaste nicht.
Mit Enter kann ich die Werte übernehmen. Habe ich noch einen Fehler in der Procedure?
Danke.

DeddyH 26. Mär 2012 10:12

AW: Mehrere Tasten in einer Procedure abfragen?
 
Verlagere die Prüfung einmal ins OnExit.

Mavarik 26. Mär 2012 10:16

AW: Mehrere Tasten in einer Procedure abfragen?
 
Hast Du Keypreview auf true gesetzt?

Mavarik

himitsu 26. Mär 2012 11:00

AW: Mehrere Tasten in einer Procedure abfragen?
 
Zitat:

Zitat von mat72 (Beitrag 1158562)
Leider nimmt das Programm die Tab-Taste und die linke Maustaste nicht.
Mit Enter kann ich die Werte übernehmen. Habe ich noch einen Fehler in der Procedure?
Danke.

Sicher daß #9 ein tabulator ist?

Haltepunkt auf
Delphi-Quellcode:
if Key in [#13, #01, #09] then
und nachsehn.

mat72 26. Mär 2012 11:37

AW: Mehrere Tasten in einer Procedure abfragen?
 
Hallo,
ich habe es gerade ausprobiert. Mit #09 und #01 kommt keine Antwort.
Die Codes habe ich von hier[Link]http://www.delphipraxis.net/6412-liste-der-virtuellen-tastencodes-vk_.html[/Link].
Gibt es eine andere Möglichkeit?
Vielen Dank.

Gollum 26. Mär 2012 11:45

AW: Mehrere Tasten in einer Procedure abfragen?
 
Hallo,

wenn Du mit virtuellen Tastencodes arbeitest, musst du die Ereignisse OnKeyDown und/oder OnKeyUp benutzen.

Diese Tastencodes funktionieren so nicht (richtig) im OnKeyPress-Event. Da bekommst Du z.B. nicht mit, ob mit der Maus ins Editfeld geklickt wurde.

Tab ist nicht #09 sondern nur #9.

mat72 26. Mär 2012 12:58

AW: Mehrere Tasten in einer Procedure abfragen?
 
Hallo,
auch mit OnKeyDown und/oder OnKeyUp, bekomme ich nicht das gewünschte Ergebnis.
Ich habe eine Matrix von 8 Textfeldern, über die ich Zahlen eingebe. Mit Enter oder Tab oder linke Maustaste soll in das nächste Feld gesprungen werden.
Wenn ich nur Enter nehme, funktioniert es. Mit
Key=VK_TAB
Key=#9
geht es nicht.
Hat noch jemand eine Idee?
Danke für eure Hilfe.
Gruss
Matthias

Bummi 26. Mär 2012 12:58

AW: Mehrere Tasten in einer Procedure abfragen?
 
für Tab ins OnShortCut des Forms hängen
Delphi-Quellcode:
procedure TForm2.FormShortCut(var Msg: TWMKey; var Handled: Boolean);
var
  KeyCode: TShortCut;
begin
  KeyCode := Menus.ShortCut(Msg.CharCode, KeyDataToShiftState(Msg.KeyData));
  case KeyCode of
    VK_TAB: ShowMessage ('tab');
  else
    Exit;
  end;

  Handled := True;

end;

FlatIron 26. Mär 2012 13:10

AW: Mehrere Tasten in einer Procedure abfragen?
 
Ne schnellere Lösung wäre diese (TApplicationEvent aus der Registerkarte "Zusätzlich"):

Delphi-Quellcode:
procedure TForm1.ApplicationEvents1Message(var Msg: tagMSG;
  var Handled: Boolean);
begin
  if msg.message = WM_KEYDOWN then
  begin
    if msg.wParam = 9 then
    begin
      ShowMessage('Tab wurde gedrückt!');
    end;
  end;
end;

DeddyH 26. Mär 2012 13:21

AW: Mehrere Tasten in einer Procedure abfragen?
 
Ich hätte eher an sowas gedacht (Events sind allen betroffenen Edits per OI zugewiesen):
Delphi-Quellcode:
procedure TfrmTest.Edit1Exit(Sender: TObject);
var
  Edit: TEdit;
  dummy: integer;
begin
  Edit := Sender as TEdit;
  if (Edit.Text <> '') then
    if not TryStrToInt(Edit.Text, dummy) then
      begin
        ShowMessage('Bitte nur Zahlen eintragen');
        Edit.SetFocus;
      end;
end;

procedure TfrmTest.Edit1KeyPress(Sender: TObject; var Key: Char);
begin
  if Key = #13 then
    Perform(WM_NEXTDLGCTL, 0, 0);
end;

rd3 26. Mär 2012 14:53

AW: Mehrere Tasten in einer Procedure abfragen?
 
OnKeyPress + KeyPreview = True
Delphi-Quellcode:
  if key = #13 then
  begin  //Enter key: TEdit, oder auch mehr...
    if (ActiveControl.ClassType = TEdit) then
    begin
      Key := #0;
      Perform(WM_NEXTDLGCTL, 0, 0);
    end;
  end;

mat72 27. Mär 2012 08:52

AW: Mehrere Tasten in einer Procedure abfragen?
 
Danke für eure Hilfe.
Ich habe das ganze jetzt so gelöst.
Delphi-Quellcode:
procedure TForm3.Edit1KeyPress(Sender: TObject; var Key: Char);
begin
 if (Key=#13)
    then
      Edit2.SetFocus;
end;

procedure TForm3.Edit1Exit(Sender: TObject);
begin
    try
       ol:=StrToFloat(Edit1.Text);
    except
          ShowMessage('Please enter only Numbers!');
          Edit1.Clear;
          Edit1.SetFocus;
    end;
end;
Gruß
Matthias

DeddyH 27. Mär 2012 08:53

AW: Mehrere Tasten in einer Procedure abfragen?
 
Du könntest auch gleich Delphi-Referenz durchsuchenTryStrToFloat verwenden.

himitsu 27. Mär 2012 09:22

AW: Mehrere Tasten in einer Procedure abfragen?
 
Dem Detlef stimme ich vollkommen zu.
Beim Debuggen breitet soein sinnloser Try-Except-Missbrauch richtig viel Freude. :wall:

Zitat:

Delphi-Quellcode:
Edit1.Clear;

Ich hab mich bei nur einem einzigen Zeichen vertippt, was man schnell ändern könnte,
aber nun darf ich alles neu eingeben, nur weil jemand so nett war alles zu löschen?

DeddyH 27. Mär 2012 09:24

AW: Mehrere Tasten in einer Procedure abfragen?
 
Sehe ich auch so, SelectAll statt Clear wäre evtl. benutzerfreundlicher.


Alle Zeitangaben in WEZ +1. Es ist jetzt 18:06 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