![]() |
EnterTab (mit Enter ODER Tab in nächstes Feld
Hi,
Hier geht es ausschließlich um die Tastatur. Manchmal besteht der Wunsch, statt der Tab-Taste Enter dazu zu benutzen, um ins nächste Eingabefeld zu gelangen. Z.B. bei Eingabe von langen Zahlenlisten ist die Entertaste rechts beim Numerikblock schon wesentlich bequemer. Auch ESC wird vielfach gerne verwendet, um eine Form zu schließen. Wer merkt sich schon ALT-F4? Desweiteren kann dieses Verhalten auf verschiedene Klassen eingegrenzt werden. Es geht vielleicht auch einfacher, aber von Windows wird standardmäßig ein SysUtils.Beep ausgelöst, sofern man ein Feld ohne Tab verläßt. Das passiert hiermit nicht. Das ganze entstammt noch einem Thread aus dem alten Delphi-Forum und ist wohl überwiegend von PaulJr und Christian Seehase.
Delphi-Quellcode:
Das ganze muß ins OnkeyDown-Ereignis jeder Form, die sich so verhalten soll:
procedure EnterTab(Sender: TObject; var Key: Word; Shift: TShiftState;
ClassAus: array of TClass; ObjectAus: array of TObject; bESC_Close: Boolean = True); var Mgs: TMsg; function ClassObjectAusschliessen: Boolean; var Index: Integer; begin Result := True; with Sender as TForm do begin for Index := Low(ClassAus) to High(ClassAus) do if ActiveControl is ClassAus[Index] then // Diese Classe ausschliessen Exit; for Index := Low(ObjectAus) to High(ObjectAus) do if ActiveControl = ObjectAus[Index] then // Dieses Object ausschliessen Exit; end; Result := False; end; begin if Sender is TForm then with Sender as TForm do begin case Key of VK_RETURN, VK_TAB: if not ClassObjectAusschliessen then begin Key := 0; Perform(WM_NextDlgCtl, ord(Shift = [ssShift]), 0); PeekMessage(Mgs, 0, WM_CHAR, WM_CHAR, PM_REMOVE); // Beep-Ton ausschalten end; VK_ESCAPE: if bESC_Close and (Shift <> [ssShift]) then begin Key := 0; Close; PeekMessage(Mgs, 0, WM_CHAR, WM_CHAR, PM_REMOVE); // Beep-Ton ausschalten end; end // case end; // für WITH Sender As TForm DO end;
Delphi-Quellcode:
Das KeyPreview der Form muß noch auf true gesetzt werden. Entweder direkt im OI oder zur Laufzeit mit:
procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState); begin EnterTab(Sender,Key,Shift,[],[],true); end;
Delphi-Quellcode:
Eines muß noch gesagt werden: nicht bei allen Controls erzielt man die erhoffte Wirkung. Bei einem Stringgrid schaltet man damit nämlich seltsamerweise ab, mit Enter in die nächste Zelle zu gelangen. Also wahrscheinlich genau das Gegenteil von dem gewollten. Deshalb muß in einem solchen Fall, das KeyPreview wieder auf false gesetzt werden, am besten im OnEnter des Stringgrids.
Form1.KeyPreview := true;
Delphi-Quellcode:
Desweiteren sollte man wie meist, besser objektorientiert vorgehen und in diesem Fall das Repository (Objektablage) nutzen. Also ein Formular mit den gewünschten Eigenschaften entwerfen und dann weitervererben.
procedure TForm1.StringGrid1Enter(Sender: TObject);
begin KeyPreview := false; end; |
Re: EnterTab (mit Enter ODER Tab in nächstes Feld
Ich habe folgendes einfach im Keypress der Form eingtragen
Delphi-Quellcode:
if Key = #13 then Self.Perform(WM_NEXTDLGCTL,0,0);
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:46 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