AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Code-Bibliothek Library: VCL / WinForms / Controls Delphi EnterTab (mit Enter ODER Tab in nächstes Feld
Thema durchsuchen
Ansicht
Themen-Optionen

EnterTab (mit Enter ODER Tab in nächstes Feld

Ein Thema von Hansa · begonnen am 16. Mär 2004 · letzter Beitrag vom 16. Mär 2004
Antwort Antwort
Hansa

Registriert seit: 9. Jun 2002
Ort: Saarland
7.554 Beiträge
 
Delphi 8 Professional
 
#1

EnterTab (mit Enter ODER Tab in nächstes Feld

  Alt 16. Mär 2004, 11:04
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:
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;
Das ganze muß ins OnkeyDown-Ereignis jeder Form, die sich so verhalten soll:

Delphi-Quellcode:
procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
   EnterTab(Sender,Key,Shift,[],[],true);
end;
Das KeyPreview der Form muß noch auf true gesetzt werden. Entweder direkt im OI oder zur Laufzeit mit:

Form1.KeyPreview := true; 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.
Delphi-Quellcode:
procedure TForm1.StringGrid1Enter(Sender: TObject);
begin
  KeyPreview := false;
end;
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.
Gruß
Hansa
  Mit Zitat antworten Zitat
seifman
(Gast)

n/a Beiträge
 
#2

Re: EnterTab (mit Enter ODER Tab in nächstes Feld

  Alt 16. Mär 2004, 12:16
Ich habe folgendes einfach im Keypress der Form eingtragen
if Key = #13 then Self.Perform(WM_NEXTDLGCTL,0,0);
  Mit Zitat antworten Zitat
Antwort Antwort

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:07 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