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.