Autor Beitrag
Paparazzzi_koeter
Hält's aus hier
Beiträge: 2



BeitragVerfasst: So 15.06.08 19:58 
Hallo
Das ist mein Quelltext: (ich habe alles im Tutorial befolgt)

ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
99:
100:
101:
102:
103:
104:
105:
106:
107:
108:
109:
110:
111:
112:
unit Unit2;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, MPlayer, ShellApi;

type
  TForm1 = class(TForm)
    MediaPlayer1: TMediaPlayer;
    Button1: TButton;
    ListBox1: TListBox;
    procedure Button1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure ListBox1Click(Sender: TObject);
    Procedure WMDropFiles (Var aMsg: tMessage);  message WM_DROPFILES;
    procedure MediaPlayer1Notify(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
    Procedure AddToPlayList(s:string);
    procedure PlayFile(s:string);
  end;

var
  Form1: TForm1;
  playList: TStringList; // globale Variable
  CurrentSong: integer = -1;  // neue globale variable um uns das aktuelle lied zu merken

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
   DragAcceptFiles (Handle, True);   // drag und drop akzeptieren
   playList := TStringList.Create;
end;


procedure TForm1.FormDestroy(Sender: TObject);
begin
  playList.Free; // objekt freigeben
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  mediaplayer1.FileName := 'C:\Dokumente und Einstellungen\Roderich Römhild\Eigene Dateien\Mein Spiel\VA-Fetenhits_(Fussball)-2CD-DE-2008-VOiCE\Live is life.mp3';
  mediaplayer1.Open;
  mediaplayer1.play;
end;

Procedure TForm1.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));
    StrDispose (Filename);
  End;
  DragFinish (aMsg.WParam);
End;

Procedure TForm1.AddToPlayList(s:string);
begin
   playList.Add(s);
   ListBox1.Items.Add(extractfilename(s));
end;

procedure TForm1.PlayFile(s:string);
begin
   mediaplayer1.Close;
   mediaplayer1.FileName := s;
   mediaplayer1.Open;
   mediaplayer1.play;
end;

procedure TForm1.ListBox1Click(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. }

  if fileexists(Playlist.Strings[i]) then PlayFile(Playlist.Strings[i]);
end;

procedure TForm1.MediaPlayer1Notify(Sender: TObject); // Wann ist ein Lied zuende? Nächstes abspielen.
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.


Doch wenn ich das Programm starten will,zeigt er mir diese Fehlermeldung:

Zitat:
[Fehler] Unit2.pas(107): Inkompatible Typen: 'String' und 'Integer'


Bitte helft mir sobald wie möglich.

vielen Dank
mfg
Paparazzi_koeter


Moderiert von user profile iconTino: Topic aus Delphi Tutorials verschoben am So 15.06.2008 um 19:59
Moderiert von user profile iconTino: Delphi- und Quote-Tags hinzugefügt.
Yogu
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2598
Erhaltene Danke: 156

Ubuntu 13.04, Win 7
C# (VS 2013)
BeitragVerfasst: So 15.06.08 20:17 
user profile iconPaparazzzi_koeter hat folgendes geschrieben:
ich habe alles im Tutorial befolgt

Bist du dir da sicher? Ist die Zeile 107 auch die gleiche wie im Tutorial? PlayFile erwartet nämlich einen String, der Parameter, den du in Zeile 107 übergibst - CurrentSong - ist aber ein Integer. Daher die Fehlermeldung.

Ich gehe mal davon aus (ohne den gesamten Code gelesen zu haben), dass die ListBox die Dateinamen enthält. Und ich denke aucn, dass CurrentSong der Index dieser Liste ist. Dann kannst du ganz einfach den CurrentSong'ten Eintrag aus der List als Parameter verwenden:

ausblenden Delphi-Quelltext
1:
PlayFile(ListBox1.Items[CurrentSong]);					

Grüße,
Youg
Paparazzzi_koeter Threadstarter
Hält's aus hier
Beiträge: 2



BeitragVerfasst: So 15.06.08 22:07 
Titel: Media PLayer
Vielen Dank,
jetzt klappt es einigermaßen. :D Ich kann das Projekt starten, aber es springt nachdem das eine Lied fertig ist, nicht direkt zum nächsten Lied weiter, wie es eigentlich sollte. :? Kannst du mir vielleicht auch dort weiterhelfen?
mfg
Paparazzi_koeter
Yogu
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2598
Erhaltene Danke: 156

Ubuntu 13.04, Win 7
C# (VS 2013)
BeitragVerfasst: Mo 16.06.08 16:51 
Titel: Re: Media PLayer
user profile iconPaparazzzi_koeter hat folgendes geschrieben:
Es springt nachdem das eine Lied fertig ist, nicht direkt zum nächsten Lied weiter, wie es eigentlich sollte.

Ich finde jetzt im Quelltext keinen direkten Fehler. Vielleicht habe ich etwas übersehen, weil der Code etwas kompliziert geschrieben ist.

Probiere mal folgenden Code (inhaltlich der gleiche, aber sprachlich geändert). Ersetze einfach die Prozedur MediaPlayer1Notify

ausblenden Delphi-Quelltext
 
99:
100:
101:
102:
103:
104:
105:
106:
107:
108:
109:
110:
111:
112:
113:
114:
115:
116:
117:
{ ... }
// Wann ist ein Lied zu Ende? Nächstes abspielen.
procedure TForm1.MediaPlayer1Notify(Sender: TObject); 
begin
  // Position = Gesamtlänge bedeutet, dass das Lied beendet wurde
  if MediaPlayer1.Position >= MediaPlayer1.Length then
  begin
    // Aktuellen Song um einen erhöhen; falls zu groß, ersten Song auwählen
    if CurrentSong < PlayList.Count-1 then
      inc(CurrentSong)
    else
      CurrentSong := 0;

    // Song abspielen
    PlayFile(CurrentSong);

    // Das aktuelle Lied selektieren
    ListBox1.ItemIndex := CurrentSong;
   end;
end;

Falles es immer noch nicht funktioniert, solltest du debuggen. Setze mithilfe der F5-Taste einen Haltepunkt auf die erste Zeile, und beobachte die Variable CurrentSong per Strg+F5. Vielleicht entdeckst du dann den Fehler.

Grüße,
Yogu