Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi wave nach Textausgabe abspielen, Reihenfolge stimmt nicht (https://www.delphipraxis.net/11319-wave-nach-textausgabe-abspielen-reihenfolge-stimmt-nicht.html)

youare2 4. Nov 2003 10:29


wave nach Textausgabe abspielen, Reihenfolge stimmt nicht
 
Hallo,

ich schreibe zur Zeit an einem kleinen Programm, um meiner Tochter das Alphabet spielerisch beizubringen.

Grundidee: Eine Taste wird gedrückt - der Buchstabe wird in einem Textfeld angezeigt - Buchstabe wird vorgelesen.

Mein Problem: die Reihenfolge der Ausgabe ist nicht richtig. Ich habe einen Button eingebaut, der die Buchstaben in dem Memo-Fenster anzeigen soll und anschließend die Wave abspielen soll. Nur leider werden erst alle Wave-Dateien abgespielt und dann das Memofenster aktualisiert. Hier ein Ausschnitt aus der Source:

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
begin
Memo1.Text:=Memo1.Text + 'A';
PlaySound(PChar('a.wav'), 0, SND_SYNC);
Memo1.Text:=Memo1.Text + 'B';
PlaySound(PChar('b.wav'), 0, SND_SYNC);
Memo1.Text:=Memo1.Text + 'C';
PlaySound(PChar('c.wav'), 0, SND_SYNC);
end;
Hat jemand einen Tip wie ich die Reihenfolge steuern kann? Wunsch: erst automatisch den Buchstaben ins Memofenster eintragen und anschließend die Wave abspielen.

[edit=Daniel B]Delphi-Tags eingefügt. Mfg, Daniel B[/edit]

Robert Marquardt 4. Nov 2003 10:36

Re: wave nach Textausgabe abspielen, Reihenfolge stimmt nich
 
Das Problem ist, das die Zuweisung an Memo1.Text das Neuzeichen bei naechster Gelegenheit anweist.
Die naechste Gelegenheit ist aber erst nach Ende von Button1Click wenn wieder Messages verarbeitet werden.
Also muss das Neuzeichnen erzwungen werden.
Ein Aufruf von Update nach jeder Memo-Zuweisung soltle das Problem loesen.

Schubi 4. Nov 2003 11:02

Re: wave nach Textausgabe abspielen, Reihenfolge stimmt nich
 
Probiers mal mit Application.ProcessMessages;

procedure TForm1.Button1Click(Sender: TObject);
begin
Memo1.Text:=Memo1.Text + 'A';
Application.ProcessMessages;

PlaySound(PChar('a.wav'), 0, SND_SYNC);
Memo1.Text:=Memo1.Text + 'B';
Application.ProcessMessages;

PlaySound(PChar('b.wav'), 0, SND_SYNC);
Memo1.Text:=Memo1.Text + 'C';
Application.ProcessMessages;

PlaySound(PChar('c.wav'), 0, SND_SYNC);
end;

youare2 4. Nov 2003 11:16

Re: wave nach Textausgabe abspielen, Reihenfolge stimmt nich
 
Danke.

Habe es direkt ausprobiert:

Memo1.Text:=Memo1.Text + 'A';
Update;
PlaySound(PChar('a.wav'), 0, SND_SYNC);

Funktioniert jetzt einwandfrei.

youare2 4. Nov 2003 11:19

Re: wave nach Textausgabe abspielen, Reihenfolge stimmt nich
 
Auch die Lösung mit : Application.ProcessMessages; funktioniert.

Gibt es einen Unterschied zwischen den Lösungen bzw. hat eine Lösung einen Vorteil? Speicherplatz oder ähnliches?

choose 4. Nov 2003 11:43

Re: wave nach Textausgabe abspielen, Reihenfolge stimmt nich
 
Während Update lediglich die visuelle Erscheinung eines Controls (und ggf. dessen untergeordneten Controls) auf dem Bildschirm aktualisiert, wird mit Application.Processmessages die Botschaften-Warteschlange des Programms abgearbeitet.

Durch Änderung des Inhalts des Memos war hier ua eine Botschaft zum Neuzeichnen des Memos enthalten, die letztlich den selben Effekt hat, wie der direkte Aufruf von Update.
Neben diesen Botschaften, werden auch andere, wie solche, zum Bewegen des Fensters, verarbeitet, so dass Dein Fenster nicht "wie abgestürzt" wirkt (das wäre bei Update der Fall, wenn Du probierst, das Fenster während der Tonwidergabe zu verschieben).

Trotzdem birgt der Ansatz, alle Botschaften zu verarbeiten, Gefahren: Wenn Du während der Durchführung der Methode Button1Click erneut auf den Button klickst, wird sie erneut in einer zweiten Version ausgeführt und erst anschließend nach Application.Processmessages der ersten Version fortgefahren. Andere Randerscheinungen können auftreten, wenn man zwischenzeitlich auf das "X" des Fensters klickt oder Controls (zB Edit-Felder) verändert, deren Werte für die Berechnung innerhalb einer Methode ausschlaggebend sind.

Schubi 4. Nov 2003 11:45

Re: wave nach Textausgabe abspielen, Reihenfolge stimmt nich
 
Die erste Variante zwingt nur das Memo zum Update. Die zweite (meine) Variantekann z.B. auch innerhalb von langen Schleifen aufgerufen werden und lässt die Anwendung ihre Nachrichten abarbeiten. Darunter befindet sich in dem Fall auch die Aufforderung zum aktualisieren des Memo.

Processmessages kann dann von Vorteil sein, wenn die Sounds lang sind und während dem abspielen z.B. Teile vom Fenster verdeckt waren und neu gezeichnet werden müssen.
Aber Processmessages macht eh nicht anderes als, unter anderem, Update aufzurufen.

Ansonsten würd ich sagen ist es egal. Processmessages wird sowieso mehrmals in der Sekunde von der Anwendung aufgerufen, solange sie im Leerlauf ist, aber sobald eine Prozedur abgearbeitet wird eben nicht mehr.

EDIT:
OK, choose hat die bessere Erklärung geliefert, ich zieh mich zurück :mrgreen: :mrgreen: :mrgreen:


Alle Zeitangaben in WEZ +1. Es ist jetzt 19:29 Uhr.

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