Delphi-PRAXiS
Seite 1 von 3  1 23      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Beepen bei OnKeyDown global unterdrücken (https://www.delphipraxis.net/63241-beepen-bei-onkeydown-global-unterdruecken.html)

CG2003 15. Feb 2006 21:10


Beepen bei OnKeyDown global unterdrücken
 
Hallo liebe DP-Gemeinde,

ich habe hier in der Code-Library folgenden Code zum unterdrücken des typischen Windows-Beep beim OnKeyDown Event gefunden:

Delphi-Quellcode:
procedure TForm1.Edit1KeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
var
  mgsTemp: TMsg;
begin
  if Key = VK_RETURN then
  begin
    PeekMessage(mgsTemp, 0, WM_CHAR, WM_CHAR, PM_REMOVE);
  end;
end;
Meine Frage wäre nun, wie ich das vielleicht global setzen kann? Ich habe derzeit eine Anwendung mit hunderten von TEdits, und würde gerne den o.g. Code für alle TEdit setzen.

Ist das möglich? Wenn ja: wie genau?

Vielen Dank schonmal für Eure Hilfe.

Khabarakh 15. Feb 2006 21:15

Re: Beepen bei OnKeyDown global unterdrücken
 
Du könntest beim Programmstart durch Components der Forms iterieren und jedem Edit den Eventhandler zuweisen, wenn es nicht direkter funktioniert.

CG2003 15. Feb 2006 21:17

Re: Beepen bei OnKeyDown global unterdrücken
 
Zitat:

Zitat von Khabarakh
Du könntest beim Programmstart durch Components der Forms iterieren und jedem Edit den Eventhandler zuweisen, wenn es nicht direkter funktioniert.

Entschuldige bitte die "Blöde" Frage, aber was meinst Du damit genau? Also wie funktioniert das?

Matze 15. Feb 2006 21:23

Re: Beepen bei OnKeyDown global unterdrücken
 
Moin

das könnte so in der Art aussehen:

Delphi-Quellcode:
    procedure EditKeyDown(Sender: TObject; var Key: Word;
      Shift: TShiftState);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.EditKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
var
  mgsTemp: TMsg;
begin
  if Key = VK_RETURN then
  begin
    PeekMessage(mgsTemp, 0, WM_CHAR, WM_CHAR, PM_REMOVE);
  end;
end;

// ...

var
  i: Integer;
begin
  for i := 0 to ComponentCount - 1 do
  begin
    if Components[i] is TEdit then
      (Components[i] as TEdit).OnKeyDown := EditKeyDown;
  end;

CG2003 15. Feb 2006 21:26

Re: Beepen bei OnKeyDown global unterdrücken
 
Zitat:

Zitat von Matze
Moin

das könnte so in der Art aussehen:

Delphi-Quellcode:
    procedure EditKeyDown(Sender: TObject; var Key: Word;
      Shift: TShiftState);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.EditKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
var
  mgsTemp: TMsg;
begin
  if Key = VK_RETURN then
  begin
    PeekMessage(mgsTemp, 0, WM_CHAR, WM_CHAR, PM_REMOVE);
  end;
end;

// ...

var
  i: Integer;
begin
  for i := 0 to ComponentCount - 1 do
  begin
    if Components[i] is TEdit then
      (Components[i] as TEdit).OnKeyDown := EditKeyDown;
  end;

Hallo,

Danke, das sieht gut aus, nur ich denke mal das wird nicht ganz funktionieren, da ich für einige meiner TEdits im OnKeyDown-Event eigene Anweisungen stehen habe und die würden doch dann nicht ausgeführt werden, oder?

Matze 15. Feb 2006 21:27

Re: Beepen bei OnKeyDown global unterdrücken
 
Zitat:

Zitat von CG2003
Danke, das sieht gut aus, nur ich denke mal das wird nicht ganz funktionieren, da ich für einige meiner TEdits im OnKeyDown-Event eigene Anweisungen stehen habe und die würden doch dann nicht ausgeführt werden, oder?

Das weist allen Edits das obig definierte OnKeyDown zu. Die bestehenden werden dann natürlich nicht ausgeführt. Wie man das aber zusammenfasst, also da bin ich gerade überfragt, sorry.

Khabarakh 15. Feb 2006 21:39

Re: Beepen bei OnKeyDown global unterdrücken
 
Steig auf .Net um und nimm Delegates.
Scherz :wink:
Entweder baust du eine Klasse, die den alten Eventhandler aufnimmt und diesen zusammen mit dem neuen aufruft, oder(ohne Klasse) du leitest die WindowProc der Edits um. Code kann ich heute aus Zeitgründen leider nicht mehr bieten :wink: .

CG2003 15. Feb 2006 21:43

Re: Beepen bei OnKeyDown global unterdrücken
 
Zitat:

Zitat von Khabarakh
Steig auf .Net um und nimm Delegates.
Scherz :wink:
Entweder baust du eine Klasse, die den alten Eventhandler aufnimmt und diesen zusammen mit dem neuen aufruft, oder(ohne Klasse) du leitest die WindowProc der Edits um. Code kann ich heute aus Zeitgründen leider nicht mehr bieten :wink: .

Hmm, nun versteh' ich nur noch Bahnhof...

jfheins 15. Feb 2006 22:23

Re: Beepen bei OnKeyDown global unterdrücken
 
Du musst entweder in den paar edits, die schon ein onkeydown haben, einen eventhandler definieren, der die anderen aufruft, oder ... dazu kommen wir später :mrgreen:

Wenn du wirklich die WndProc überschreiben willst, dann schau such mal nach Hier im Forum suchenProgressWndProc (Ich habs schonmal erklärt und immer Copy&pastet) ;)

turboPASCAL 16. Feb 2006 01:35

Re: Beepen bei OnKeyDown global unterdrücken
 
1.)
Zitat:

Zitat von turboPASCAL
Das Signal soll eigentlich anzeigen, das kein Zeilenumbruch erlaubt ist. (Einzeiliges Edit Feld)

Akustisches Signal bei Edit - Feld ausschalten:
Delphi-Quellcode:
procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
begin
  if Key=#13 then // #13 = Enter
    Key:=#0;      //  #0 = nix
end;

http://www.delphipraxis.net/internal...=398085#398085

2.)
Weise jedem Editfeld die selbe OnKeyDown zu. Das geht mit der Shifttaste und der Maus oder über Matze's Code-Beispiel.
Wenn du unterschiedliche Sachen im OnKeyDown-Ereignis abfangen musst, kanst du über die Tags und einer Case-Abfrage darauf reagieren.

// die edits sind zu dieser stunde normal ;)


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:20 Uhr.
Seite 1 von 3  1 23      

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 by Thomas Breitkreuz