![]() |
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:
Hat jemand einen Tip wie ich die Reihenfolge steuern kann? Wunsch: erst automatisch den Buchstaben ins Memofenster eintragen und anschließend die Wave abspielen.
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; [edit=Daniel B]Delphi-Tags eingefügt. Mfg, Daniel B[/edit] |
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. |
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; |
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. |
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? |
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. |
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 08:30 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-2025 by Thomas Breitkreuz