Delphi-PRAXiS
Seite 3 von 3     123   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Datei öffnen mit TOpenDialog (https://www.delphipraxis.net/100965-datei-oeffnen-mit-topendialog.html)

Die Muhkuh 6. Okt 2007 11:35

Re: Datei öffnen mit TOpenDialog
 
Und eine andere Sache: Wie sieht die Procedure PlayList aus?

Andy-h 6. Okt 2007 11:40

Re: Datei öffnen mit TOpenDialog
 
Ja Item ist markiert.

hier mal der ganze code:

Delphi-Quellcode:
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.
Ist zum größten teil zusammengesucht und sieht deswegen unordentlich aus.

DeddyH 6. Okt 2007 11:51

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.

Andy-h 6. Okt 2007 12:31

Re: Datei öffnen mit TOpenDialog
 
Wie müsste das dan aussehen?

DeddyH 6. Okt 2007 12:37

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;

Andy-h 6. Okt 2007 13:14

Re: Datei öffnen mit TOpenDialog
 
Danke für die Hilfe
Es geht jetzt

Andy-h 6. Okt 2007 15:52

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?

DeddyH 6. Okt 2007 15:59

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;

Andy-h 6. Okt 2007 16:22

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;

DeddyH 6. Okt 2007 16:26

Re: Datei öffnen mit TOpenDialog
 
Die Zeilen
Delphi-Quellcode:
if currentSong < Playlist.Count then { alles passt, songindex im rahmen}
else mediaplayer1.next;
finde ich persönlich unschön (obwohl syntaktisch richtig), aber das ist Geschmackssache.


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:12 Uhr.
Seite 3 von 3     123   

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