![]() |
Re: Datei öffnen mit TOpenDialog
Und eine andere Sache: Wie sieht die Procedure PlayList aus?
|
Re: Datei öffnen mit TOpenDialog
Ja Item ist markiert.
hier mal der ganze code:
Delphi-Quellcode:
Ist zum größten teil zusammengesucht und sieht deswegen unordentlich aus.
unit Unit4;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, MPlayer, ShellApi, mmsystem, Math, ExtCtrls; type TForm4 = class(TForm) MediaPlayer1: TMediaPlayer; Button1: TButton; ListBox1: TListBox; Button2: TButton; Label1: TLabel; Label2: TLabel; Button3: TButton; Button4: TButton; Button5: TButton; OpenDialog1: TOpenDialog; Timer1: TTimer; Label3: TLabel; procedure Button1Click(Sender: TObject); procedure FormCreate(Sender: TObject); procedure FormDestroy(Sender: TObject); procedure ListBox1DblClick(Sender: TObject); procedure MediaPlayer1Notify(Sender: TObject); procedure Button2Click(Sender: TObject); procedure Button3Click(Sender: TObject); procedure Button4Click(Sender: TObject); procedure Button5Click(Sender: TObject); procedure Timer1Timer(Sender: TObject); private { Private-Deklarationen } public { Public-Deklarationen } Procedure AddToPlayList(s:string); procedure PlayFile(songNumber: integer); Procedure WMDropFiles (Var aMsg: tMessage); message WM_DROPFILES; //Drag und drop end; var Form4: TForm4; var PlayList: TStringList; CurrentSong: integer = -1; // neue globale variable um uns das aktuelle lied zu merken Lautstaerke: integer = -1; implementation {$R *.dfm} //Sound procedure GetVolume(var volL, volR: Word); var hWO: HWAVEOUT; waveF: TWAVEFORMATEX; vol: DWORD; begin volL:= 0; volR:= 0; // init TWAVEFORMATEX FillChar(waveF, SizeOf(waveF), 0); // open WaveMapper = std output of playsound waveOutOpen(@hWO, WAVE_MAPPER, @waveF, 0, 0, 0); // get volume waveOutGetVolume(hWO, @vol); volL:= vol and $FFFF; volR:= vol shr 16; waveOutClose(hWO); end; procedure SetVolume(const volL, volR: Word); var hWO: HWAVEOUT; waveF: TWAVEFORMATEX; vol: DWORD; begin // init TWAVEFORMATEX FillChar(waveF, SizeOf(waveF), 0); // open WaveMapper = std output of playsound waveOutOpen(@hWO, WAVE_MAPPER, @waveF, 0, 0, 0); vol:= volL + volR shl 16; // set volume waveOutSetVolume(hWO, vol); waveOutClose(hWO); end; //Sound Procedure TForm4.WMDropFiles (Var aMsg: tMessage); Var Idx, Size, FileCount: Integer; Filename: pChar; Begin Inherited; FileCount := DragQueryFile (aMsg.WParam, $FFFFFFFF, nil, 255); For Idx := 0 To FileCount -1 Do Begin Size := DragQueryFile (aMsg.WParam, Idx, nil, 0) + 1; Filename := StrAlloc (Size); If DragQueryFile (aMsg.WParam, Idx, Filename, Size) = 1 Then { nothing } else AddToPlayList (pChar (Filename)); // hier wird das jeweilige file unserer Prozedur AddToPlaylist überwiesen. StrDispose (Filename); End; DragFinish (aMsg.WParam); End; Procedure TForm4.AddToPlayList(s:string); begin playList.Add(s); ListBox1.Items.Add(extractfilename(s)); end; procedure TForm4.Button1Click(Sender: TObject); begin PlayFile(ListBox1.ItemIndex); end; //sound auslesen procedure TForm4.Button2Click(Sender: TObject); var X,TonLi, TonRe, VolLi, VolRe: Word; begin GetVolume(VolLi,VolRe); TonLi:= Floor(VolLi / 65535 * 100); TonRe:= Floor(VolRe / 65535 * 100); Label1.Caption:=IntToStr(TonLi); Label2.Caption:=IntToStr(TonRe); end; procedure TForm4.Button3Click(Sender: TObject); begin mediaplayer1.next; end; procedure TForm4.Button4Click(Sender: TObject); begin mediaplayer1.back; end; procedure TForm4.Button5Click(Sender: TObject); var SAlterPfad,SNeuerPfad :string; begin if OpenDialog1.Execute then begin SAlterPfad := Opendialog1.files[0]; SNeuerPfad := ExtractFilePath(ParamStr(0))+('Musik\'+ ExtractFileName(OpenDialog1.FileName)); if not FileExists(SNeuerPfad) then begin CopyFile(PChar(SAlterPfad), PChar(SNeuerPfad), true); ListBox1.Items.Add(ExtractFileName(OpenDialog1.FileName)); end else MessageDlgPos('Datei ist bereits in der Liste',mtInformation,[mbOk],0,280,170); end; end; //Sound auslesen procedure TForm4.FormCreate(Sender: TObject); begin DragAcceptFiles (Handle, True); // drag und drop akzeptieren playList := TStringList.Create; end; procedure TForm4.FormDestroy(Sender: TObject); begin playList.Free; end; procedure TForm4.PlayFile(songNumber: integer); // deklaration von playfile ändern, hier das 2. mal begin if fileexists(Playlist.Strings[songNumber]) then begin CurrentSong := songNumber; mediaplayer1.Close; mediaplayer1.FileName := Playlist.Strings[songNumber]; mediaplayer1.Open; mediaplayer1.play; end; end; procedure TForm4.Timer1Timer(Sender: TObject); var hilf, hilfbuchstabe: string; begin hilf := Label3.Caption; //einlesen der gesamten caption hilfbuchstabe := hilf[1]; //merken des ersten zeichens der caption delete(hilf, 1, 1); //erstes zeichen löschen hilf := hilf + hilfbuchstabe;//caption + gemerktes zeichen Label3.Caption := hilf; //das ganze ausgeben application.ProcessMessages; //um sicher zu gehen, dass das ganze angezeigt wird //timer intervall auf ca. 200ms stellen end; procedure TForm4.ListBox1DblClick(Sender: TObject); var i : integer; begin for i := 0 to listbox1.Count - 1 do if listbox1.Selected[i] then break; { nun haben wir in i die nummer der selektierten Zeile da Listbox und Playlist eine identische Reihe der Einträge und gleiche Sortierung vorweisen, können wir mit dem erhaltenen index den richtigen Eintrag der Playlist auslesen. } PlayFile(i); end; procedure TForm4.MediaPlayer1Notify(Sender: TObject); begin if mediaplayer1.Position = mediaplayer1.Length then begin // position = gesamtlänge, bedeutet dass das lied beendet wurde Listbox1.Selected[currentSong] := false; // das gerade gespielte lied de-selektieren inc(currentSong); // aktuellen song um eines erhöhen if currentSong < Playlist.Count then { alles passt, songindex im rahmen} else currentsong := 0; {ende der liste erreicht, setze aktuelles lied auf anfang} PlayFile(CurrentSong); Listbox1.Selected[currentSong] := true; // das aktuelle lied selektieren end; end; end. |
Re: Datei öffnen mit TOpenDialog
Wieso benutzt Du denn 2 Stringlisten? PlayList ist IMHO überflüssig, da könntest Du doch direkt auf ListBox1.Items zugreifen.
|
Re: Datei öffnen mit TOpenDialog
Wie müsste das dan aussehen?
|
Re: Datei öffnen mit TOpenDialog
Ich denke, so (ungetestet):
Delphi-Quellcode:
//Version ohne den Parameter Songnumber
procedure TForm4.PlayFile; // deklaration von playfile ändern, hier das 2. mal begin if ListBox1.ItemIndex < 0 then exit; if fileexists(ListBox1.Items[ListBox1.ItemIndex]) then begin CurrentSong := ListBox1.ItemIndex; mediaplayer1.Close; mediaplayer1.FileName := ListBox1.Items[ListBox1.ItemIndex]; mediaplayer1.Open; mediaplayer1.play; end; end; |
Re: Datei öffnen mit TOpenDialog
Danke für die Hilfe
Es geht jetzt |
Re: Datei öffnen mit TOpenDialog
Mir ist doch noch was aufgefallen:
mit dem alten code ist er immer ins nächste Lied gesprungen und hat es abgespielt jetzt bleibt er einfach am ende des liedes stehen was muss ich machen? |
Re: Datei öffnen mit TOpenDialog
Delphi-Quellcode:
procedure TForm4.MediaPlayer1Notify(Sender: TObject);
begin if mediaplayer1.Position = mediaplayer1.Length then begin // position = gesamtlänge, bedeutet dass das lied beendet wurde Listbox1.Selected[currentSong] := false; // das gerade gespielte lied de-selektieren inc(currentSong); // aktuellen song um eines erhöhen if currentSong >= Playlist.Count then currentsong := 0; {ende der liste erreicht, setze aktuelles lied auf anfang} Listbox1.Selected[currentSong] := true; // das aktuelle lied selektieren PlayFile; //und abspielen ;) end; end; |
Re: Datei öffnen mit TOpenDialog
Hatte den fehler garnich an der stelle vermutet
habe selber noch was geändert so läufts:
Delphi-Quellcode:
procedure TForm4.MediaPlayer1Notify(Sender: TObject);
begin if mediaplayer1.Position = mediaplayer1.Length then begin // position = gesamtlänge, bedeutet dass das lied beendet wurde Listbox1.Selected[currentSong] := false; // das gerade gespielte lied de-selektieren inc(currentSong); // aktuellen song um eines erhöhen if currentSong < Playlist.Count then { alles passt, songindex im rahmen} else mediaplayer1.next; PlayFile(CurrentSong); Listbox1.Selected[currentSong] := true; // das aktuelle lied selektieren PlayFile(ListBox1.ItemIndex); end; end; |
Re: Datei öffnen mit TOpenDialog
Die Zeilen
Delphi-Quellcode:
finde ich persönlich unschön (obwohl syntaktisch richtig), aber das ist Geschmackssache.
if currentSong < Playlist.Count then { alles passt, songindex im rahmen}
else mediaplayer1.next; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:25 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