AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

lästiges beepen abstellen ??

Ein Thema von erniepb · begonnen am 11. Jun 2002 · letzter Beitrag vom 18. Jun 2019
Antwort Antwort
Seite 1 von 6  1 23     Letzte » 
erniepb

Registriert seit: 8. Jun 2002
Ort: Berlin
96 Beiträge
 
Delphi 7 Enterprise
 
#1

lästiges beepen abstellen ??

  Alt 11. Jun 2002, 22:04
über die Eigenschaft keypreview fange ich mit meinem Form eingaben ab .. ist die gedrückt taste enter .. soll ne procedure ausgeführt werden .. so weit kein Problem .. aber beim ausführen dann tut s immer kurz beepen .. wie bei ner fehleingabe .. wie krieg ich das weg ??

Danke schon im voraus!!
  Mit Zitat antworten Zitat
Benutzerbild von toms
toms
(CodeLib-Manager)

Registriert seit: 10. Jun 2002
4.648 Beiträge
 
Delphi XE Professional
 
#2
  Alt 11. Jun 2002, 22:11
Hi,

Das geht so:

procedure TForm1.FormKeyPress(Sender: TObject; var Key: Char);
begin
if Key = Char(VK_RETURN) then
begin
Key := #0;
// Bewirkt, dass die Taste nicht weitergeleitet wird
// und somit wird das Beep unterdrückt.
end;
end;
Thomas
  Mit Zitat antworten Zitat
Gast
(Gast)

n/a Beiträge
 
#3
  Alt 11. Jun 2002, 22:17
Hallo Erni,


Code:
procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
VAR
      Mgs: TMsg;
BEGIN

  IF (Shift = [ssShift]) THEN
    CASE Key OF
      VK_RETURN : 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 :  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 :  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 :     BEGIN                   // ENTER-Taste erkannt
                      Key := 0;
                      Perform(WM_NextDlgCtl, 0, 0);
                      PeekMessage(Mgs, 0, WM_CHAR, WM_CHAR, PM_REMOVE); // Beep-Ton ausschalten
                    END;
    END // für CASE Key OF
END;
Gruß

Paul Jr.
  Mit Zitat antworten Zitat
erniepb

Registriert seit: 8. Jun 2002
Ort: Berlin
96 Beiträge
 
Delphi 7 Enterprise
 
#4
  Alt 11. Jun 2002, 22:40
danke tom .. aber es hat leider nich funktioniert ..

ahm Paul .. deins hat .. allerdings ist mir nicht ganz klar was folgende befehle im einzelnen bedeuten:

Code:
Perform(WM_NextDlgCtl, 0, 0);
Also die procedure Perform erzeugt ne WindowsMessage .. aber woher weiß ich an wen .. also was bedeuten die Parameter??

Code:
PeekMessage(Mgs, 0, WM_CHAR, WM_CHAR, PM_REMOVE);
Was bedeuten die einzelnen Parameter ?? Msg mal ausgenommen ..

Danke !!
  Mit Zitat antworten Zitat
Benutzerbild von toms
toms
(CodeLib-Manager)

Registriert seit: 10. Jun 2002
4.648 Beiträge
 
Delphi XE Professional
 
#5
  Alt 11. Jun 2002, 22:44
Zitat:
aber es hat leider nich funktioniert ..
Bei mir funktioniert's. Musst den Code ins OnKeyPress Ereignis deiner
Form schreiben.
Thomas
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.262 Beiträge
 
Delphi 2006 Professional
 
#6
  Alt 11. Jun 2002, 23:33
Moin Ernie,

ich hoffe Paul hat nichts dagegen, dass ich ihm da vorgreife.

Also das Perform bezieht sich auf Form1, da es in einem Methodenaufruf von TForm1 augerufen wird, ohne angabe eines anderen Controls.
Man könnte hier also auch schreiben Form1.Perform...
Ersatzweise ginge auch SendMessage(self.Handle...), wobei sich das Self wiederum aus dem TForm1 ableitet.

WM_NEXTDLGCTL entspricht dem Druck auf TAB. Das nächste/vorige Control in der Tabulatorreihenfolge erhält den Tastaturfokus.
Die folgende erste null (null entspricht false) sagt aus, dass das nächste Control genommen werden soll, würde dort ein Wert ungleich 0 stehen (entspricht in C true, und die API ist ja in C geschrieben) würde das vorige Control den Fokus erhalten (entspricht also Shift-Tab).
Die zweite null sagt aus, dass wParam (also die erste null) angibt, ob das nächste oder das vorige Control in der Tabulatorreihenfolge gemeint ist. Würde hier ein Wert ungleich null stehen, würde das Betriebssystem wParam als Handle auf das Control verstehen, das als nächstes den Fokus erhält. (präziser es ist hier das niederwertige Datenwort, also die unteren 16 Bit gemeint, die über die Funktion von wParam entscheiden).
Damit hätten wir den Perform.

Kleiner Tip am Rande:
Sollte Perform mal nicht das gewünschte Ergebnis bringen, einfach mal mit SendMessage probieren. Manchmal hilft das. Perform scheint ab und zu nicht wie erwartet zu funktionieren.

So und jetzt das PeekMessage:
Damit werden Messages aus der MessageQueue des Threads ausgelesen.
In diesem Falle wird es nur dazu benutzt unerwünschte Werte aus der Queue zu entfernen.
Der erste Parameter ist hier eigentlich nur ein Dummy, aber die Funktion braucht hier nun einmal eine Variable (eigentlich werden hier die Daten der ausgelesenen Message gespeichert).
Die null an zweiter Stelle besagt, dass die Messagequeue aller Fensters des aktuellen Threads beachtet werden sollen.
Mit den beiden nun folgenden WM_CHAR wird angegeben, dass nur die Messages von WM_CHAR bis WM_CHAR ausgelesen werden sollen, da es hier darum geht genau dieses zu entfernen. Meist wird man hier wohl WM_KEYFIRST, WM_KEYLAST bzw. WM_MOUSEFIRST, WM_MOUSELAST vorfinden, um alle Tastatur- bzw. Mausmessages abzufangen.
PM_REMOVE besagt schliesslich, dass die Message nicht nur ausgelesen, sondern sogar aus der Queue entfernt werden soll. Dadurch wird der Beep unterdrückt.
PeekMessage ist noch umfangreicher, aber das liest Du wohl am besten im PSDK oder auf MSDN nach. Das würde hier zu weit führen.

Ich hoffe Du kommst mit meinen Ausführungen klar.
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
erniepb

Registriert seit: 8. Jun 2002
Ort: Berlin
96 Beiträge
 
Delphi 7 Enterprise
 
#7
  Alt 11. Jun 2002, 23:41
doch war nicht schlecht .. also eigentlich gut .. weil hab s doch verstanden.. DANKE!!
  Mit Zitat antworten Zitat
Gast
(Gast)

n/a Beiträge
 
#8
  Alt 12. Jun 2002, 07:26
Hallo Christian

gut erklärt

Gruß

Paul Jr.
  Mit Zitat antworten Zitat
jbg

Registriert seit: 12. Jun 2002
3.459 Beiträge
 
Delphi 10.1 Berlin Professional
 
#9
  Alt 12. Jun 2002, 08:31
Ich möchte mich ja nicht einmischen, aber den Code von PaulJr kann man noch ein wenig vereinfachen (gleiches zusammenfassen).
Code:
procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
var Mgs: TMsg;
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;
  Mit Zitat antworten Zitat
Benutzerbild von toms
toms
(CodeLib-Manager)

Registriert seit: 10. Jun 2002
4.648 Beiträge
 
Delphi XE Professional
 
#10
  Alt 12. Jun 2002, 09:22
Da gibt's aber noch ein Problem:
Jetzt kann man in einem Memo mit der Enter-Taste keinen Zeilenumbruch
machen.
Thomas
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:18 Uhr.
Powered by vBulletin® Copyright ©2000 - 2019, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2019 by Daniel R. Wolf