Hallo, wie kann ich mit Visual Basic eine .wav- Datei abspielen? Ich spiele bis jetzt immer mit: My.Computer.Audio.Play(Path, AudioPlayMode.Background) ab, wobei "Path" eben den Dateipfad enthält. Klappt auch, nur nachdem die Datei abgespielt wurde, hängt sich das Programm auf (es kommt im Debugger keine Fehlermeldung, der Programmablauf wird einfach gestoppt). Gibt es irgendeine andere Möglichkeit eine .wav- Datei (einfach!) abzuspielen, oder weiß jemand das Problem bei meiner Abspielvariante? Erstellt wird das ganze mit Visual Basic 2008 Express Edition. Vielen Dank schon einmal im Voraus. Gruß, Steffen
Entweder per WinAPI => sndPlaySound() oder einfach das erste Google-Ergebnis anklicken http://www.google.de/search?q=.net+wav+abspielen
Ok, danke für eure Hilfe, ich hab jetzt den eigentlichen Fehler entdeckt. Die -wav- Datei wird mit My.Computer.Audio.Play(Path, AudioPlayMode.Background) abgespielt, aber danach lösche ich den Inhalt einer Textbox mit TextBox1.Clear(), und da hängt er sich auf. Kann man den Inhalt der Textbox auch anders löschen, oder weiß jemand wo der Fehler bei meiner Methode liegt? Gruß, Steffen
hmmm, das klappt auch nich. Warscheinlich liegts an der Playerfunktion. Muss man die irgendwie noch beenden, oder so? Weil das Programm hängt sich immer nach dem .wav- Player auf, egal was danach kommt. Gruß, Steffen
My.Computer.Audio.Play("sound\sprache.wav") wenn du hiermit aufrufst, hängt er sich auch auf??
Genau, danach hängt sich das Programm auf, keine Ahnung wieso. Der Debugger zeigt nichts an, aber der Programmablauf wird einfach gestoppt, und im Taskmanager wird das Programm sogar als "nicht reagierend" angezeigt. Woran liegt das nur? Benötigst du eventuell auch mal den ganzen Programmcode? Gruß, Steffen
@Steffen O. (derelektroniker) Public Class Form1 Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click My.Computer.Audio.Play("c:\sound\sprache.wav") End Sub End Class Versuche das einfache erst einmal. Richtigen Pfad der datei ("c:\sound\sprache.wav") Mit dem Button starten und wiederholen. Gruß
Public Class Form1 Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click ' My.Computer.Audio.Play("c:\sound\sprache.wav", AudioPlayMode.Background) ' My.Computer.Audio.Play("c:\sound\sprache.wav", AudioPlayMode.BackgroundLoop) My.Computer.Audio.Play("c:\sound\sprache.wav", AudioPlayMode.WaitToComplete) End Sub End Class Klappt alles ,hängt sich nicht auf
Jo, das ist das komische, als ich das Programm noch nicht so weit hatte, hat alles noch ohne Probleme funktioniert, aber seit ich es dann weiterentwickelt habe, funktioniert es nicht mehr..... Ich poste hier nun einfach mal meinen Code, vielleicht weiß dann jemadn, worans liegt: ------------------------------------------------------------------------ -- Public Class Form1 Dim Path As String Private Sub TextBox1_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TextBox1.TextChanged Dim wahl As String Dim clip1 As String = TextBox9.Text Dim clip2 As String = TextBox10.Text Dim clip3 As String = TextBox2.Text Dim clip4 As String = TextBox3.Text Dim clip5 As String = TextBox4.Text Dim clip6 As String = TextBox5.Text Dim clip7 As String = TextBox6.Text Dim clip8 As String = TextBox7.Text Dim clip9 As String = TextBox8.Text Dim zahl As Byte = 1 Do wahl = TextBox1.Text Select Case wahl Case 1 Path &= clip1 Path &= ".wav" My.Computer.Audio.Play(Path, AudioPlayMode.Background) TextBox1.Clear() Case 2 Path += clip2 Path += ".wav" My.Computer.Audio.Play(Path, AudioPlayMode.Background) TextBox1.Clear() Case 3 Path += clip3 Path += ".wav" My.Computer.Audio.Play(Path, AudioPlayMode.Background) TextBox1.Clear() Case 4 Path += clip4 Path += ".wav" My.Computer.Audio.Play(Path, AudioPlayMode.Background) TextBox1.Clear() Case 5 Path += clip5 Path += ".wav" My.Computer.Audio.Play(Path, AudioPlayMode.Background) TextBox1.Clear() Case 6 Path += clip6 Path += ".wav" My.Computer.Audio.Play(Path, AudioPlayMode.Background) TextBox1.Clear() Case 7 Path += clip7 Path += ".wav" My.Computer.Audio.Play(Path, AudioPlayMode.Background) TextBox1.Clear() Case 8 Path += clip8 Path += ".wav" My.Computer.Audio.Play(Path, AudioPlayMode.Background) TextBox1.Clear() Case 9 Path += clip9 Path += ".wav" My.Computer.Audio.Play(Path, AudioPlayMode.Background) TextBox1.Clear() Case 0 End End Select Loop While zahl = 1 End Sub Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim objfile As New FolderBrowserDialog objfile.ShowNewFolderButton = True If objfile.ShowDialog() <> DialogResult.Cancel Then Path = objfile.SelectedPath() End If Path += "\" End Sub End Class ------------------------------------------------------------------------ --- Das Programm soll, sobald in TextBox1 etwas eingegeben werden, die .wav-Datei abspielen, die eben mit der jeweiligen Nummer versehen ist. In die TextBoxen 2-10 gibt man ein, wie die .wav- Datei heißt, und über die Ordnerwahl, stellt man ein, in welchem Ordner sich diese Dateien befinden. Man stellt praktisch erst den Ordner ein, dann weißt man den Zahlen 1-9 jeweils eine .wav- Datei zu, und dann gibt man in TextBox1 immer die jeweilige Zahl von der .wav-Datei ein, die man abgespielt haben möchte. Und nach jeder Eingabe soll eben die TextBox wieder gelöscht werden. Das Programm hängt sich jedesmal nach dem Abspielen der Datei auf, ich hab keine Ahnung, wieso.... Vielen Dank schon einmal im Voraus. Gruß, Steffen
@Steffen O. (derelektroniker) TextBox1.Clear() nach dem löschen wird wieder aufgerufen, mit einen Inhalt ""? (keine Fehlerabfangung) Versuche mit TextBox1.text=0 Dir ist bekannt das dein Cod etwas eigenwillig ist? P.S. bin auf einen VB freien Gast PC ,kann nicht testen. Mein Enkel haut mir einen auf die Nuss Gruß
du hast ja eine Endlosschleife programmiert. sobald du was in die textbox eingibst, kommst du in das onchange event. Aber nie wieder raus!!! deine "zahl" ist immer 1. da du nichtmal ein doevents in der schleife hast, wird dein rechner auf 100% Systemlast gehen. Deine Do/Loop Schleife kannst du doch weglassen, oder?
Hallo, thomas wrote: > du hast ja eine Endlosschleife programmiert. Ja, das war eigentlich gewollt, aber nicht so..... > sobald du was in die textbox eingibst, kommst du in das onchange event. > Aber nie wieder raus!!! deine "zahl" ist immer 1. > da du nichtmal ein doevents in der schleife hast, wird dein rechner auf > 100% Systemlast gehen. Deine Do/Loop Schleife kannst du doch weglassen, > oder? Jetzt wo ich darüber nachdenke, hast du Recht, die Endlosschleife ist völlig unsinnig!! Ich dachte eben, dass er immer wieder die TextBox1 einbfragen soll, und dann eben die jeweilige Datei abspielen soll, aber dann hätte ich die Schleife ja vor dem TextBox onchange event machen müssen.... Ich hab die Schleife nun rausgenommen, und dann klappt es auch das erste Mal mit dem Löschen der TextBox, aber wenn ich dan das zweite Mal etwas in die TextBox eingebe, dann kommt eine Fehlermeldung, das die FileNotFoundExeption nicht behandelt wurde. Wieso klappt das beim ersten Mal, und beim zweiten Mal nicht? Gruß, Steffen
So, inzwischen hab ich das Programm vollständig hinbekommen. Nun klappt alles mit dem Abspielen. Nun noch eine Frage: Wie kann ich, wenn ich in die ganzen TextBoxen die jeweiligen .wav- Dateien hineingeschrieben habe, die beim Druck der jeweiligen Taste abgespielt werden sollen, den Inhalt dieser TextBoxen irgendwie in Variablen speichern, sodass die Inhalte auch noch nach dem Beenden des Programms, oder sogar des Computers auf der Festplatte gespeichert sind, und ich sie beim nächsten Start wieder laden kann? Muss ich da irgendein .txt- File anlegen, in dem die ganzen Sachen gespeichert sind, oder wie geht das? Ach ja, es sollte möglichst einfach sein, oder gut kommentiert, da ich Anfänger bin, und mich noch nicht so gut auskenne. Vielen Dank schon einmal im Voraus. Gruß, Steffen
Ok, vielen Dank!! Könnte ich das dann so lösen: If SaveFileDialog1.ShowDialog() = DialogResult.OK Then Dim oFStream As New FileStream("C:\test.txt", FileMode.OpenOrCreate) Dim oSWriter As New StreamWriter(oFStream) oSWriter.WriteLine(TextBox1.Text) oSWriter.WriteLine(TextBox2.Text) oSWriter.WriteLine(TextBox3.Text) oSWriter.WriteLine(TextBox4.Text) oSWriter.WriteLine(TextBox5.Text) usw, bis eben alle Textboxen angespeichert sind.... oSWriter.Close() End If Muss ich immer eine neue Zeile machen, bevor ich den nächsten TextBoxen- Inhalt abspeichere? Wie mach ich das? Und: Wie füge ich System.IO. als library ein? Noch was :-): Dann muss ich das ganze ja auch wieder laden können, gibts dafür einfache Varianten? (Hab nun schon einige Zeit im web gesucht, aber immer nur Lösungen gefunden, die sich über eine ganze Seite Code oder mehr erstrecken....) Vielen Dank schon einmal im Voraus. Gruß, Steffen
vieleicht hilft das auch kann aber nicht testen 'Dieser Tipp demonstriert den Zugriff auf Textdateien in VB.Net. Praktisch das, was in VB 6 mit den Dateizugriffsbefehlen Open...For...As... durchgeführt wird: Wie man eine neue Textdatei anlegt, Text hineinschreibt, Text anfügt und die Textdatei in eine Listbox ausliest. 'Dazu ist zunächst der Namensraum System.IO über den Imports-Befehl einzubinden. Über die Objekte FileStream, TextReader und TextWriter und deren Methoden kann eine Textdatei dann über einen Stream gelesen und auch geschrieben werden. Imports System.IO Public Class Form1 Inherits System.Windows.Forms.Form 'Vom Windows Form Designer generierter Code 'Datei neu anlegen und Text hineinschreiben Private Sub Button1_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles Button1.Click Dim FiStr As FileStream = _ New FileStream(TextBox1.Text, FileMode.Create) Dim StrWr As StreamWriter = New StreamWriter(FiStr) StrWr.WriteLine(TextBox2.Text) StrWr.Close() End Sub 'Text anfügen an bestehende Datei ' oder die Datei neu anlegen, wenn sie nicht existiert ' und Text hineinschreiben Private Sub Button2_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles Button2.Click Dim FiStr As FileStream = _ New FileStream(TextBox1.Text, FileMode.Append) Dim StrWr As StreamWriter = New StreamWriter(FiStr) StrWr.WriteLine(TextBox2.Text) StrWr.Close() End Sub 'Datei lesen Private Sub Button3_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles Button3.Click Try Dim FiStr As FileStream = _ New FileStream(TextBox1.Text, FileMode.Open) Dim StrRe As StreamReader = New StreamReader(FiStr) Dim i As Integer ListBox1.Items.Clear() Do Until StrRe.Peek() = -1 ListBox1.Items.Add(StrRe.ReadLine) i += 1 Loop StrRe.Close() Catch except As Exception MsgBox(except.Message & vbNewLine & _ "Erstellen Sie zunächst mit <Anfügen> oder " & _ "<Überschreiben> die Datei", _ MsgBoxStyle.Exclamation) End Try End Sub Private Sub Form1_Load(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles MyBase.Load TextBox1.Text = Environment.CurrentDirectory & "\Test.dat" TextBox2.Text = "Hallo" End Sub Private Sub Button4_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles Button4.Click Me.Close() End Sub End Class
juppi wrote: > > Imports System.IO Ok, dass man da IMports schreiben muss, wusste ich auch noch nicht, danke! >'Text anfügen an bestehende Datei > ' oder die Datei neu anlegen, wenn sie nicht existiert > ' und Text hineinschreiben > Private Sub Button2_Click(ByVal sender As System.Object, _ > ByVal e As System.EventArgs) Handles Button2.Click > Dim FiStr As FileStream = _ > New FileStream(TextBox1.Text, FileMode.Append) > Dim StrWr As StreamWriter = New StreamWriter(FiStr) > StrWr.WriteLine(TextBox2.Text) > StrWr.Close() > End Sub Ok, ich muss doch in die Variable FiStr meinen Pfadnamen schreiben, oder? Wie muss ich das formulieren? So, oder wie: Dim FiStr As FileStream = C:\test.txt 1: > 'Datei lesen > Private Sub Button3_Click(ByVal sender As System.Object, _ > ByVal e As System.EventArgs) Handles Button3.Click > Try > Dim FiStr As FileStream = _ > New FileStream(TextBox1.Text, FileMode.Open) > Dim StrRe As StreamReader = New StreamReader(FiStr) > Dim i As Integer > ListBox1.Items.Clear() > Do Until StrRe.Peek() = -1 > ListBox1.Items.Add(StrRe.ReadLine) > i += 1 > Loop > StrRe.Close() > Catch except As Exception > MsgBox(except.Message & vbNewLine & _ > "Erstellen Sie zunächst mit <Anfügen> oder " & _ > "<Überschreiben> die Datei", _ > MsgBoxStyle.Exclamation) > End Try > End Sub 2: > Private Sub Form1_Load(ByVal sender As System.Object, _ > ByVal e As System.EventArgs) Handles MyBase.Load > TextBox1.Text = Environment.CurrentDirectory & "\Test.dat" > TextBox2.Text = "Hallo" > End Sub 3: > Private Sub Button4_Click(ByVal sender As System.Object, _ > ByVal e As System.EventArgs) Handles Button4.Click > Me.Close() > End Sub Gehört das alles zum Lesen von Dateien? Oder reicht das mit 1: markierte? Weißt du, wie ich in einer solchen Textdatei die Zeile wechseln kann? Dass ich in die erste Zeile z.B. den Inhalt der einen TextBox schreibe, in die zweite Zeile den Inhalt der zweite, usw. Dann wäre auch das auslesen einiges leichter.... Vielen Dank schonmal für deine Bemühungen!!!! Gruß, Steffen
@Steffen O. (derelektroniker) Als Versuch vieleicht brauchbar schreiben der textboxen in die datei (pro zeile) lesen der Zeilen in die Textboxen und Listbox. Imports System.IO Public Class Form1 Inherits System.Windows.Forms.Form 'Vom Windows Form Designer generierter Code 'Datei neu anlegen und Text hineinschreiben Private Sub dateiAnlegen() Dim FiStr As FileStream = _ New FileStream(TextBox1.Text, FileMode.Create) Dim StrWr As StreamWriter = New StreamWriter(FiStr) StrWr.WriteLine(TextBox2.Text) StrWr.WriteLine(TextBox3.Text) StrWr.WriteLine(TextBox4.Text) StrWr.WriteLine(TextBox5.Text) StrWr.Close() End Sub 'Text anfügen an bestehende Datei ' oder die Datei neu anlegen, wenn sie nicht existiert ' und Text hineinschreiben Private Sub textboxenNachDatei() Dim FiStr As FileStream = _ New FileStream(TextBox1.Text, FileMode.Append) Dim StrWr As StreamWriter = New StreamWriter(FiStr) StrWr.WriteLine(TextBox2.Text) StrWr.WriteLine(TextBox3.Text) StrWr.WriteLine(TextBox4.Text) StrWr.WriteLine(TextBox5.Text) StrWr.Close() End Sub 'Datei lesen Private Sub dateiLesenNachListbox() Try Dim FiStr As FileStream = _ New FileStream(TextBox1.Text, FileMode.Open) Dim StrRe As StreamReader = New StreamReader(FiStr) Dim i As Integer ListBox1.Items.Clear() Do Until StrRe.Peek() = -1 ListBox1.Items.Add(StrRe.ReadLine) i += 1 Loop StrRe.Close() Catch except As Exception MsgBox(except.Message & vbNewLine & _ "Erstellen Sie zunächst mit <Anfügen> oder " & _ "<Überschreiben> die Datei", _ MsgBoxStyle.Exclamation) End Try End Sub Private Sub dateiLesenNachtextboxen() Try Dim FiStr As FileStream = _ New FileStream(TextBox1.Text, FileMode.Open) Dim StrRe As StreamReader = New StreamReader(FiStr) TextBox2.Text = StrRe.ReadLine TextBox3.Text = StrRe.ReadLine TextBox4.Text = StrRe.ReadLine TextBox5.Text = StrRe.ReadLine 'nicht optimal besser Zeilen in einer schleife abfragen bis dateiende StrRe.Close() Catch except As Exception MsgBox(except.Message & vbNewLine & _ "Erstellen Sie zunächst mit <Anfügen> oder " & _ "<Überschreiben> die Datei", _ MsgBoxStyle.Exclamation) End Try End Sub Private Sub Form1_Load(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles MyBase.Load TextBox1.Text = Environment.CurrentDirectory & "\Test.dat" TextBox2.Text = "Hallo2" TextBox3.Text = "Hallo3" TextBox4.Text = "Hallo4" TextBox5.Text = "Hallo5" End Sub Private Sub dateiClose() Me.Close() End Sub Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click textboxenNachDatei() End Sub Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click dateiLesenNachListbox() End Sub Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click dateiAnlegen() End Sub Private Sub Button4_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button4.Click dateiLesenNachtextboxen() End Sub End Class Aber jetzt mal ran Der weg ist das ziel Gruß
Hallo, @ juppi: Vielen Dank, ich hab es nun hinbekommen - ich kann nun speichern, und laden!! Ich habe dein Codebeispiel als Vorlage genommen, und dann mit Hilfe zig verschiedener Tutorials an meine Bedürfnisse angepasst. Wenn jemand den Code haben möchte, soll er mich anschreiben, dann poste ich ihn. Gruß, Steffen
@Steffen O. (derelektroniker) hallo Na dann "gut Holz" und weitere Erfolge. Du wirst bald erkennen das es hunderte Wege gibt. Wie ich immer sage "Der Weg ist das Ziel" Gruß
Hallo juppi, wie kann ich mit VB einen interruptgesteuerten Datenempfang über RS232 machen? Also praktisch, dass das Programm immer erst etwas macht, wenn ein Zeichen, oder String über RS232 gekommen ist. Das Initialisieren habe ich hinbekommen. Vielen Dank schon einmal im Voraus. Gruß, Steffen
Im Designer Private Sub SerialPort1_DataReceived(ByVal sender As Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles SerialPort1.DataReceived 'z.B. byteeinlesen() End Sub
Ok, danke!! Habe ich nun hinbekommen, nun muss ich es nur noch testen! Gruß, Steffen
Ok, nun klappt fast alles, ich kann mit einer Universalfernbedienung, nun meine .wav- Dateien abspielen! Nur eines ist etwas komisch, und ich komme nicht dahinter, wieso: Ich habe eine TextBox11, an einer Stelle kann ich dieser ganz einfach einen Wert zuweißen, mit TextBox11.Text = "Test", an anderer Stelle, kommt bei genau dieser Zuweißung folgender Fehler: InvalidOperationException Ungültiger threadübergreifender Vorgang: Der Zugriff auf das Steuerelement TextBox11 erfolgte von einem anderen Thread als dem Thread, für den es erstellt wurde. Woher kommt dieser Fehler? Ich weiße der Textbox nur einen String, wie z.B. Test, oder Hallo zu, nichteinmal eine Variable! Die Textbox ist aber so eingerichtet, dass sie normalerweiße nicht sichtbar ist, und erst durch aktivieren einer Checkbox sichtbar wird, kann es daran liegen? Vielen Dank schon einmal im Voraus. Gruß, Steffen
Hallo Ich kenne ähnliche Probleme. Kann dir aber so und jetzt nicht helfen. Kannst du das wichtigste vom Cod mal Posten. Andere werden dann bestimmt auch antworten können. Gruß
Ok, ich poste dann mal einen Teil, der Code ist inzwischen schon recht gtoß, den hier komplett zu posten, würde den Rahmen sprengen. Also, ich habe eine TextBox11, mit dieser gebe ich allerlei Statusmeldungen aus. Die Textbox ist normalerweiße unsichtbar, und wird mit dieser Funktion sichtbar gemacht: Private Sub CheckBox1_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles CheckBox1.CheckedChanged If CheckBox1.Checked Then TextBox11.Visible = True Else TextBox11.Visible = False End If End Sub Wenn ich dann in einer Funktion mit TextBox11.Text = "RS232 connected" die Textbox beschreibe, klappt alles, beschreibe ich sie jedoch in einer anderen Funktion mit genau dem gleichen Text, kommt die besagte Fehlermeldung.... Ach ja: Die Textbox ist als NurLesen konfiguriert, da sie wie gesagt, nur zu Ausgeben von Statusmeldungen ist. Ich hoffe ihr könnt mir helfen. Gruß, Steffen
Ok, ich hab mich nun durch die Microsofthilfe, und einige Tutorials durchgearbeitet, herausgekommen ist folgende (funktionierende!) Funktion zum threadübergreifenden Beschreiben der TextBox11: Delegate Sub SetTextCallback(ByVal [text] As String) .... Private Sub SetText(ByVal [text] As String) If Me.TextBox1.InvokeRequired Then Dim d As New SetTextCallback(AddressOf SetText) Me.Invoke(d, New Object() {[text]}) Else Me.TextBox11.Text = [text] End If End Sub Also man ruft mit SetText("Hier ist der zu schreibende Text") die Funktion auf. Klappt nun alles wunderbar! Gruß, Steffen
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.