Delphi-PRAXiS

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 ;)

Hansa 16. Feb 2006 02:11

Re: Beepen bei OnKeyDown global unterdrücken
 
Zitat:

Zitat von CG2003
Ich habe derzeit eine Anwendung mit hunderten von TEdits, und würde gerne den o.g. Code für alle TEdit setzen.

Wieviele Forms betrifft das denn ? Du kannst das OnKeyDown auch pro Form definieren ! Desweiteren kann man das von Form zu Form weitervererben -> ObjektAblage, also -> OOP. Es werden ja wohl nicht Hunderte Edits auf einer einzigen Form liegen ? :shock: ComponentCount nützt auch nur was bei kleinen Sachen, also Edit1..Edit10. Bei mehr Edits spielt die Nomenklatur eine große Rolle und wird dir wohl die Edits um die Ohren hauen. :lol: Versuche mal Edit1 und edKontoNr mit ComponentCount auf die Reihe zu kriegen. Und das wohl noch Form-übergreifend.

TStringlist 16. Feb 2006 05:14

Re: Beepen bei OnKeyDown global unterdrücken
 
Moin,

mit einem TApplicationEvents-Objekt und dessen OnMessage-Property sollte das möglich sein. Hinter einer solchen Property steht nämlich so etwas wie ein lokaler Hook, dh.: Du kannst in dem entsprechenden OnMessage-Eventhandler dann so ziemlich alle Messages abfangen, die vom System an die Controls deiner Application abgeschickt wurden. Also auch alle WM_Char-Messages an alle TEdits deiner Anwendung:

Delphi-Quellcode:
procedure TForm1.ApplicationEvents1Message(var Msg: tagMSG;
  var Handled: Boolean);
var ATWinControl : TWinControl;
begin
  if Msg.message = WM_Char then
    if Msg.wParam = vk_Return then begin
      ATWinControl := FindControl(Msg.hwnd);
      if (ATWinControl <> Nil)
      and (ATWinControl is TEdit) then Handled := true;
    end;
end;

phXql 16. Feb 2006 07:15

Re: Beepen bei OnKeyDown global unterdrücken
 
Zitat:

Zitat von Hansa
Zitat:

Zitat von CG2003
Ich habe derzeit eine Anwendung mit hunderten von TEdits, und würde gerne den o.g. Code für alle TEdit setzen.

Wieviele Forms betrifft das denn ? Du kannst das OnKeyDown auch pro Form definieren ! Desweiteren kann man das von Form zu Form weitervererben -> ObjektAblage, also -> OOP. Es werden ja wohl nicht Hunderte Edits auf einer einzigen Form liegen ? :shock: ComponentCount nützt auch nur was bei kleinen Sachen, also Edit1..Edit10. Bei mehr Edits spielt die Nomenklatur eine große Rolle und wird dir wohl die Edits um die Ohren hauen. :lol: Versuche mal Edit1 und edKontoNr mit ComponentCount auf die Reihe zu kriegen. Und das wohl noch Form-übergreifend.

Es is doch egal, wie die Edits heissen. Ich kann doch mit ComponentCount drüber iterieren und dann mit
Delphi-Quellcode:
Components[n] is TEdit
abfragen ob es ein Edit ist, und dann das Event zuweisen...

Sharky 16. Feb 2006 07:22

Re: Beepen bei OnKeyDown global unterdrücken
 
Hai ihr,

warum denn nicht den einfachsten Weg nehmen und sich ein eigene Komponente von TEdit ableiten und in dieser dann die gewünschte Funktionalität einbauen?

EDIT:
Das ganze könnte dann zum Beispiel so aussehen:
Delphi-Quellcode:
unit ShEdit;

interface

uses
  Classes, StdCtrls, Controls, Messages, Windows;

type
  TShEdit = class(TEdit)
  protected
    FEnterAsTab: Boolean;
    procedure KeyDown(var Key: Word; Shift: TShiftState); override;
  public
    constructor Create(AOwner: TComponent); override;
    destructor Destroy; override;
  published
    property EnterAsTab: Boolean Read FEnterAsTab Write FEnterAsTab default True;
  end;

procedure Register;

implementation

constructor TShEdit.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);
  FEnterAsTab := True;
end;

destructor TShEdit.Destroy;
begin
  inherited Destroy;
end;

procedure TShEdit.KeyDown(var Key: Word; Shift: TShiftState);
var
  mgsTemp : TMsg;
begin
  if (Key = VK_RETURN) then
  begin
    if (FEnterAsTab) then
    begin
      Parent.Perform(WM_NEXTDLGCTL, 0, 0);
    end;
    PeekMessage(mgsTemp, 0, WM_CHAR, WM_CHAR, PM_REMOVE);
  end;
  inherited KeyDown(Key, Shift);
end;

procedure Register;
begin
  RegisterComponents('Sharky', [TShEdit]);
end;

end.
Einfach die Unit in ein Package laden, compilieren, installieren und verwenden.

phXql 16. Feb 2006 17:35

Re: Beepen bei OnKeyDown global unterdrücken
 
Er hat doch schon hunderte von Edits in seinem projekt. Dann müsste er all diese Edits durch sein neues Edit austauschen...

teebee 16. Feb 2006 18:13

Re: Beepen bei OnKeyDown global unterdrücken
 
Das könnte er z.B. durch Search/Replace in den entsprechenden .dfm-Dateien machen. (Vorher Sicherungskopien machen...)

Gruß, teebee

ichbins 16. Feb 2006 19:05

Re: Beepen bei OnKeyDown global unterdrücken
 
du kannst ja eine Klasse schreiben, die die Methode enthält, die du mit ComponentCount zuweist, und einen Verweis auf die alte Methode. Dann machst du ein dynamisches Array dieser Klasse und durchläufst alle edits des forms mit componentcount, und immer, wenn du einen Edit findest, erzeugst du ein neues Element des Arrays und setzt die alte Methode. Die führst du in der neuen Prozedur aus.

Khabarakh 16. Feb 2006 19:13

Re: Beepen bei OnKeyDown global unterdrücken
 
Mit dieser Idee kommst du exakt 10 Posts zu spät :wink: . Aber du willst wirklich für eine variable Länge dynamische Arrays einsetzen?

CG2003 16. Feb 2006 19:38

Re: Beepen bei OnKeyDown global unterdrücken
 
Zitat:

Zitat von phXql
Er hat doch schon hunderte von Edits in seinem projekt. Dann müsste er all diese Edits durch sein neues Edit austauschen...

Eben... Also gibt es keine (einfache) Möglichkeit dies zu realisieren, oder?

Khabarakh 16. Feb 2006 19:46

Re: Beepen bei OnKeyDown global unterdrücken
 
Zitat:

Zitat von CG2003
Zitat:

Zitat von phXql
Er hat doch schon hunderte von Edits in seinem projekt. Dann müsste er all diese Edits durch sein neues Edit austauschen...

Eben... Also gibt es keine (einfache) Möglichkeit dies zu realisieren, oder?

:gruebel: TStringLists Code besteht aus 11 Zeilen, das sollte doch einfach genug sein.

Sharky 17. Feb 2006 07:29

Re: Beepen bei OnKeyDown global unterdrücken
 
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:

Zitat von CG2003
... Also gibt es keine (einfache) Möglichkeit dies zu realisieren, oder?

Doch ;-)

Installiere dir die selbst erstellte Komponente mit den gewünschten Eigenschaften.
Installiere dir die GExperts. Mit dieser schönen Erweiterung kannst Du unteranderem eine Komponenten auf den Forms durch eine andere ersetzen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:58 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 by Thomas Breitkreuz