Autor Beitrag
hRb
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 267
Erhaltene Danke: 12



BeitragVerfasst: Do 19.10.17 17:25 
Hallo Freunde,
möchte noch Kleinigkeiten verbessern und habe noch keine befriedigende Lösung bzw. komme mit einer Pascal-Syntax nicht zurecht.
Die Aufgabe ist eigentlich ganz einfach. Ich möchte den (manchmal) lästigen Piep-Ton (Beep) unterdrücken, bzw. ein- ausschalten. Dazu gebe ich normale Hinweis- oder Fehlermeldungen in meinem Programm in einer eigenen Fehlermeldezeile aus. Der Anwender kann unter Einstellungen festlegen, ob diese Fehlermeldungen zusätzlich mit Ton (Beep) zu hören sein sollen oder nicht (funktioniert).

Nun habe ich aber für Nutzer-Abfragen auch einige "MesssageDlg" -Meldungen und die geben standardmäßig ein Beep.
Frage: Wie kann ich diesen Ton auf "Anwenderebene" deaktivieren und wieder aktivieren. Wenn ich schreibe auf "Anwenderebene", dann soll dies keine Auswirkungen auf andere Programme haben.
Im Internet gibt es Artikel (Windows.Beep verkürzen, Lautsprecher aus, etc), die aber immer darauf hinaus laufen, dass der Beep systemweit abgeschaltet wird.
In der Delphi-Hilfe finde ich:
ausblenden Delphi-Quelltext
1:
property BeepOnError: Boolean;					

Wo und wie schreibe ich im Programm diese Zeile hin? Nach Unit, Uses, Procedure, etc. meckert der Compiler
und genügt es dann im Programm einfach zu schreiben BeepOnError:= false;
(Beep soll in System.SysUtils deklariert sein und die habe ich in Uses eingebunden. )
Danke und mfg hRb
PS: compiliere mit Delphi 10 Berlin
galagher
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 2510
Erhaltene Danke: 44

Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
BeitragVerfasst: Do 19.10.17 20:17 
user profile iconhRb hat folgendes geschrieben Zum zitierten Posting springen:
PS: compiliere mit Delphi 10 Berlin
Ich habe Delphi 10.1 Berlin, aber meines kennt BeepOnError gar nicht.

Die Delphi6-Hilfe sagt dazu:
Zitat:
CLX-Referenz
TCustomMaskEdit.BeepOnError

Die Eigenschaft steuert, ob das Eingabesteuerelement einen Signalton auslöst, wenn der Benutzer einen Text einzugeben versucht, der nicht zur Maske paßt.
property BeepOnError: Boolean;

Beschreibung
Wenn BeepOnError den Wert True hat (Voreinstellung), wird bei einer fehlerhaften Eingabe ein Signalton ausgegeben.

Ist also keine "allgemeine" Eigenschaft bzw. Anweisung...

Bei TEdit's kann man das meines Wissens nach so lösen (ungetestet):
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
begin
  //...
  Key := #0// no beep!
end;

_________________
gedunstig war's - und fahle wornen zerschellten karsig im gestrock. oh graus, es gloomt der jabberwock - und die graisligen gulpen nurmen!
Frühlingsrolle
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Fr 20.10.17 00:05 
- Nachträglich durch die Entwickler-Ecke gelöscht -
hRb Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 267
Erhaltene Danke: 12



BeitragVerfasst: Sa 21.10.17 00:07 
Hallo zusammen,
zunächst danke für die Rückantworten: Die Antworten sind für mich insofern schlecht, dass es offenbar keine lokale taskspezifische Tonabschaltung gibt. Es gibt aber auch eine gute Nachricht.
Galagher:
1. ok: BeepOnError gilt wohl nur für TCustomMaskEdit
2. KeyPress-Ereignis ist ungeeignet, da es überhaubt nicht ausgelöst wird. (Bei einer MessageDlg-Meldung kommt der Piep zusammen mit der Meldung.)

Frühlingsrolle:
Dein Hinweis trifft ins Schwarze. Hattest mal wieder das richtige Näschen mit der Funktion SystemParametersInfo
1. Eine eigene MessageDlg-Routine ohne Piep zu programmieren wird mir zu aufwending. Aber die gute Nachricht:
2. das mit "SystemParametersInfo()" funktioniert, sogar viel einfacher als gedacht. Ich habe nur die beiden Proceduren TurnOn und TurnOff in mein Programm kopiert. Selbst die Konstanten kennt Delphi10 und auch die Funktion
ausblenden Delphi-Quelltext
1:
2:
3:
function SystemParametersInfo(uiAction, uiParam: UInt;
  pvParam: Pointer; fWinIni: UInt): Boolean; stdcall;
  external 'User32.dll' name SYSTEM_PARAM_INFO;

muss nicht definiert werden.
Tatsächlich wirkt sich die Deaktivierung auch auf andere Programme aus. Allerdings werde ich jetzt TurnOn/Off nicht vom Activate-Ereignis ableiten. Wie ich schon geschrieben habe, ist im meinem Programm ein "Anwender-Schalter-ON/Off" (=vBell) schon vorhanden. Um systemweite Auswirkungzu zu vermeiden, setze ich die wenigen Message-Meldungen vor- bzw. danach wie folgt:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
var vBell:boolean;
procedure TForm1.ButtonOn1Click(Sender: TObject);
begin vBell:=true end//Beep On

procedure TForm1.ButtonOff1Click(Sender: TObject);
begin vBell:=false end//Beep Off

... //Befehlsfolge mit Meldung
if vBell=false then TurnOff;
if MessageDlg('Abfragetext?'', mtConfirmation, [mbYes, mbNo], 0)
   = idYes then exit;
TurnOn;
... //weitere Befehle

Nochmals vielen Dank für Eure Hinweise
Frühlingsrolle
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Sa 21.10.17 00:32 
- Nachträglich durch die Entwickler-Ecke gelöscht -
hRb Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 267
Erhaltene Danke: 12



BeitragVerfasst: Mo 23.10.17 22:40 
Guten Abend Frühlingsrolle,
hatte das Thema eigentlich schon abgeschlossen, aber ..
1. Ich habe die Befehle mit den Buttons nur geschrieben, damit erkennbar wird was vBell ist. Tatsächlich gibt es die beiden Buttons nicht, da in den Programmeinstellungen (Ini-Datei) festgelegt wird, ob Piep oder nicht (Aktivierung/Deaktivierung kann aber auch ohne Ini-Eintrag per Kommando erfolgen).
2. Das mit der Deklaration von "SystemParametersInfo" habe ich ehrlicherweise nicht verstanden. Da kamen bei mir Compilerfehler. Ich habe ohne Deklaration einfach den Befehlscode übernommen:
procedure TurnOn;
ausblenden Delphi-Quelltext
1:
2:
3:
begin
  SystemParametersInfo(SPI_SETBEEP, 1nil, SPIF_SENDWININICHANGE);
end;

(entsprechendes für TurnOff).
Der Aufruf TurnOn/Turnoff lies sich compilieren und funktioniert. Vermutlich ist die Funktion dem Compiler Berlin 10 bekannt.
MfG hRb :D
Frühlingsrolle
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Di 24.10.17 09:50 
- Nachträglich durch die Entwickler-Ecke gelöscht -