![]() |
Dann muss man einfach für jede Edit-Komponente die Ereignisbehandlungsroutine (EventHandler ist viel kürzer) auf dieselbe Methode setzen und nicht mehr über das FormKeyDown-Ereignis alle abfangen.
Oder man prüft mit Hilfe der Eigenschaft ActiveControl von TForm, welche Komponente gerade den Focus hat. Z.B.:
Code:
if (ActiveControl <> nil) and not (ActiveControl is TMemo) then
begin { hier den vorherigen Code einfügen } end; |
Hallo toms,
dafür könnte man den ender benutzen:
Code:
if Not (Sender is TMemo) then
begin case Key of VK_RETURN, VK_TAB: begin // ENTER oder TAB-Taste erkannt Key := 0; Perform(WM_NextDlgCtl, ord(Shift = [ssShift]), 0); PeekMessage(Mgs, 0, WM_CHAR, WM_CHAR, PM_REMOVE); // Beep-Ton ausschalten end; end // für CASE Key OF end; |
Moin Zusammen,
da VK_TAB nicht an die KeyDown, KeyUp und KeyPress weitergeleitet wird, könnte man die Abfrage darauf auch weglassen. |
Während ich meine zweite Idee eingearbeitet habe, hat MrSpock gepostet.
Der Parameter Sender ist im TForm1.FormKeyDown immer Form1, außer du rufst die Methode selbst mit anderem Parameter auf, oder du weist einer anderen Komponente diese Methode als OnKeyDown-Ereignis zu. Meine Lösung mit ActiveControl habe ich sowie deine mit Sender überprüft. Meine funktioniert, bei deiner ändert sich nichts. Obwohl es mit persönlich auch mit Sender besser gefallen hätte. |
Also Leute ok...ihr habt gewonen... :D
ich zeige hier die ganze Prozedur (so wie ich die wirklich benutze) , die meine Meinung nach keine Wünsche offen lässt... :mrgreen: Gruß Paul Jr. [code:1:1bd18cbf32] (* Diese Prozedur sollte man in dem OnKeyDown Ereignis des Formulars aufrufen. ______________________________ |
Hi,
Warum ist dein Code so seltsam formatiert?
Code:
procedure EnterTab(Sender: TObject; var Key: Word; Shift: TShiftState;
ClassAus: array of TClass; ObjectAus: array of TObject; bESC_Close: Boolean = True); var Mgs: TMsg; //_____________________________KAPSELUNG function ClassObjectAusschliessen: Boolean; var Index: Integer; begin Result := False; with Sender as TForm do begin for Index := Low(ClassAus) to High(ClassAus) do if ActiveControl is ClassAus[Index] then // Diese Classe ausschliessen begin Result := True; Exit; end; for Index := Low(ObjectAus) to High(ObjectAus) do if ActiveControl = ObjectAus[Index] then // Dieses Object ausschliessen begin Result := True; Break; end; end; end; //_______________________________HAUPTPROGRAMM begin if Sender is TForm then with Sender as TForm do begin if (Shift = [ssShift]) then case Key of VK_RETURN: if not ClassObjectAusschliessen then begin // Shift + ENTER-Taste erkannt Key := 0; Perform(WM_NextDlgCtl, 1, 0); PeekMessage(Mgs, 0, WM_CHAR, WM_CHAR, PM_REMOVE); // Beep-Ton ausschalten end; VK_TAB: if ClassObjectAusschliessen then begin // ENTER-Taste erkannt Key := 0; Perform(WM_NextDlgCtl, 1, 0); PeekMessage(Mgs, 0, WM_CHAR, WM_CHAR, PM_REMOVE); // Beep-Ton ausschalten end; end // für CASE Key OF else case Key of VK_RETURN: if not ClassObjectAusschliessen then begin // ENTER-Taste erkannt Key := 0; Perform(WM_NextDlgCtl, 0, 0); PeekMessage(Mgs, 0, WM_CHAR, WM_CHAR, PM_REMOVE); // Beep-Ton ausschalten end; VK_TAB: if ClassObjectAusschliessen then begin // ENTER-Taste erkannt Key := 0; Perform(WM_NextDlgCtl, 0, 0); PeekMessage(Mgs, 0, WM_CHAR, WM_CHAR, PM_REMOVE); // Beep-Ton ausschalten end; VK_ESCAPE: if bESC_Close then begin Key := 0; Close; PeekMessage(Mgs, 0, WM_CHAR, WM_CHAR, PM_REMOVE); // Beep-Ton ausschalten end; end // für CASE Key OF end; // für WITH Sender As TForm DO end; |
Also Toms...für solche Fragen habe ich wirklich keine Zeit...sei mir nicht böse :D
Ich zeige jetzt hier, meine Meinung nach, eine sehr starke Prozedur und einziges was Dir dazu einfällt ist die Frage nach Formatierung... :mrgreen: __________________________________________________ _________ Nachtrag: Programmierung Beispiele. Um sich wirklich Bewusst zu werden wie Leistungsfähig so ein Konstrukt ist mache ich hier einpaar Einsatz- Beispiele mit verschiedenen Varianten. Dazu erstellt man bitte ein neues Projekt und legt drauf z.B. drei TMemo (Memo1, Memo2, Memo3) und drei TEdit (Edit1, Edit2, Edit3) Komponenten. Bitte die Eigenschaft des Formulars KeyPriview auf TRUE setzen und natürlich die Prozedur EnterTab in das Projekt aufnehmen (bei mir liegt diese natürlich in einer allgemeiner UNIT) __________________________________________________ ________________ 1.) Die Umwandlung ENTER --> TAB sollte in aller Komponenten wirksam werden Darüber Hinaus bei ESC wird das Formular geschlossen [code:1:14985e6b65] PROCEDURE TForm1.FormKeyDown(Sender: TObject; var Key: Word; |
Ich optimiere den Code noch einmal :)
Code:
Sag mal Paul Jr. was hast du für eine Delphi-Version, oder schreibst du jedesmal das procedure der EventHandler in PROCEDURE um?
procedure EnterTab(Sender: TObject; var Key: Word; Shift: TShiftState;
ClassAus: array of TClass; ObjectAus: array of TObject; bESC_Close: Boolean = True); var Mgs: TMsg; //_____________________________KAPSELUNG 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; //_______________________________HAUPTPROGRAMM 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; |
Ok jbg :evil:
einverstanden...öffne Bitte ein neues Thema z.B.:: Code-Fromatierung und erkläre mir DORT bitte was ich falsch mache (ich benutze Delphi5 und Delphi6 abwechslend (Enterprise) Aber bitte NICHT hier... Gruß Paul Jr. |
HALT!
toms und jbg haben nur ganz simple Fragen gestellt. Bitte nicht persönlich angegriffen fühlen. OK? |
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:59 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