Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   spvoice ist zu langsam (https://www.delphipraxis.net/174056-spvoice-ist-zu-langsam.html)

blinder007 31. Mär 2013 16:59

spvoice ist zu langsam
 
Hallo Community, und schon wieder ein problem - oder ich bin zu dumm für diese programmiersprache :)
folgendes:

procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
Spvoice1.Volume:= 100;
if key = vk_right then begin
xk:=xk+1;
yk:=0;
end else if key = vk_left then begin
if xk > 0 then begin
xk:=xk-1;
yk:=0;
end;
end;
spvoice1.Speak(inttostr(xk)+'\'+inttostr(yk), 1);
end;

xk und yk sind globale Variablen

dabei tritt folgendes problem auf:
drücke ich pfeil rechts wird mir angesagt 1\0 drücke ich aber 3x schnell werden mir erst alle vorherigen Koordinaten angesagt. hat jemand eine Idee, wie dies zu lösen ist?
bei meiner suche mit google stieß ich auf "spvoice.skip('word', maxint)", das erzeugt aber nur einen fehler
grüße blinder007

Uwe Raabe 31. Mär 2013 17:27

AW: spvoice ist zu langsam
 
Jeder Tastendruck löst einen KeyEvent aus, der wiederum die Sprachausgabe ansteuert. Mehrere Tastendrücke speichert Windows in der Message-Queue und arbeitet sie nacheinander ab. Das Verhalten ist also durchaus nachvollziehbar.

Wenn es nicht das ist was du willst, dann sag doch mal, was du willst.

blinder007 31. Mär 2013 17:37

AW: spvoice ist zu langsam
 
hallo Uwe,
die idee ist, dass bei jedem Tastendruck die koordinate angesagt wird und bei ggf. schnellem tastendruck die Felder, die übersprungen wurden, nicht angesagt werden.

Uwe Raabe 31. Mär 2013 18:07

AW: spvoice ist zu langsam
 
Das würde ich mit einem Timer erledigen.

Das Timer-Intervall z.B. auf 500 (ms) setzen und den Timer im KeyEvent neu starten (Enabled einmal auf false und dann wieder auf true setzen).

Im Timer-Event selbst dann Enabled auf false (sonst quaselt er weiter). Die Voice-Ausgabe erfolgt dann ausschließlich im Timer-Event.

Etwa so (nur so eingetippt):

Delphi-Quellcode:
procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
begin
  Timer1.Enabled := false;
  if key = vk_right then begin
    xk:=xk+1; // Überprüfung auf Max-Wert fehlt!
    yk:=0;
  end
  else if key = vk_left then begin
    if xk > 0 then begin
      xk:=xk-1;
      yk:=0;
    end;
  end;
  Timer1.Enabled := true;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
  Timer1.Enabled := false;
  Spvoice1.Volume:= 100;
  spvoice1.Speak(inttostr(xk)+'\'+inttostr(yk), 1);
end;

blinder007 31. Mär 2013 18:22

AW: spvoice ist zu langsam
 
hallo Uwe,
danke für den hilfreichen tipp, es funktioniert super. zu beginn hatte ich auch die Idee mit einem Timer zu arbeiten, nur wesentlich komplizierter, über variablen usw.
danke für die Hilfe

Perlsau 31. Mär 2013 18:25

AW: spvoice ist zu langsam
 
Zitat:

Zitat von blinder007 (Beitrag 1209496)
... oder ich bin zu dumm für diese programmiersprache :)

Sicher nicht, aber du könntest darauf achten, den Code, den du postest, in den sog. Delphi-Tags zu positionieren. Dazu markierst du einfach deine Code-Zeilen im Foren-Editor und drückst dann den Button mit dem wohlbekannten Delphi-Helm. Und schon werden deine Code-Zeilen auch als solche erkennbar, wie du danach mit einem Klick auf den Vorschau-Button selbst sehen kannst.

Noch besser lesbar wäre dein Code, wenn du ein wenig auf Formatierung achten könntest, so daß zumindest Begin-End-Konstrukte leicht zu erkennen sind.


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:49 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