Delphi-PRAXiS
Seite 2 von 6     12 34     Letzte »    

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi lästiges beepen abstellen ?? (https://www.delphipraxis.net/110-laestiges-beepen-abstellen.html)

jbg 12. Jun 2002 09:27

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;

MrSpock 12. Jun 2002 09:29

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;

Christian Seehase 12. Jun 2002 09:33

Moin Zusammen,

da VK_TAB nicht an die KeyDown, KeyUp und KeyPress weitergeleitet wird, könnte man die Abfrage darauf auch weglassen.

jbg 12. Jun 2002 09:35

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.

Gast 12. Jun 2002 10:40

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.
______________________________

toms 12. Jun 2002 11:06

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;

Gast 12. Jun 2002 11:24

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;

jbg 12. Jun 2002 11:54

Ich optimiere den Code noch einmal :)
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 := 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;
Sag mal Paul Jr. was hast du für eine Delphi-Version, oder schreibst du jedesmal das procedure der EventHandler in PROCEDURE um?

Gast 12. Jun 2002 12:14

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.

Luckie 12. Jun 2002 12:41

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 02:30 Uhr.
Seite 2 von 6     12 34     Letzte »    

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz