Einzelnen Beitrag anzeigen

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, 12: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