14. maj 2004 - 14:37Der er
14 kommentarer og 2 løsninger
ID3 tags
hvordan for man id3 tags i en listbox så det også er muligt at afspille sangene?
jeg bruger en ID3 komponent til at ændre alle stierne i min listbox til artist og sang titlen, men nu kommer mit problem jeg kan ikke afspille sangene fordi min play funktion afpiller listbox1.item.itemindex og den indeholder ikke stien mere så den kan ikke finde stien til sangen. hvad skal jeg gøre? er der en måde jeg kan fixe dette på??
Støv, fibre og metalliske partikler kan påvirke både uptime, levetid og driftssikkerhed. Derfor arbejder flere datacentre systematisk med contamination control.
procedure TForm1.Button2Click(Sender: TObject); var i : integer; Path : TPath; begin ListBox1.Clear; for i := 0 to 99 do begin Path := TPath.Create(IntToStr(random(30000))); // Fyld med testdata ListBox1.AddItem(IntToStr(i),Path); end; end;
// Når man klikker på et element sker dette
procedure TForm1.ListBox1Click(Sender: TObject); var Path : TPath; begin Path := nil; with (Sender as TListBox) do if ItemIndex >= 0 then Path := TPath(Items.Objects[ItemIndex]);
Edit1.Text := Path.Text; end;
// Når man har oprettet 100 instanser af TPath så skal der ryddes op ved afslutning.
procedure TForm1.FormCreate(Sender: TObject); var i : integer; begin for i := 0 to ListBox1.Count - 1 do ListBox1.Items.Objects[i].Free;
Nu snakker jeg om listviews - mente naturligvis ListBox. Har lavet en lille testapplikation der har en TListBox, TEdit og en TButton på formen.
Jeg opretter instanser af TPath og da hver linie i TListBox.Items har plads til at man kan hægte et objekt på, så hægter jeg det på der. Det vigtige er, at man rydder op bagefter og med en TListBox kan det bedst gøres i OnDestroy.
Hvis du bruger et TListView, så har de TListItems man opretter faktisk en Data-property hvor man kunne placere TPath. Meget bekvemt har et TListView nemlig en OnDeletion hvor man helt automatisk kan fjerne hvad der har været tilknyttet det listitem man sletter. Mit råd: Brug ovenstående løsning og skift til et TListView (i report-mode)
procedure TForm1.FormCreate(Sender: TObject); var i : integer; Path : TPath; begin ListBox1.Clear; For I := 0 to Listbox1.Items.Count-1 do Path := TPath.Create('playlist.txt'); ListBox1.AddItem(IntToStr(i),Path); end; end;
procedure TForm1.ListBox1Click(Sender: TObject); var Path : TPath; begin Path := nil; with (Sender as TListBox) do if ItemIndex >= 0 then Path := TPath(Items.Objects[ItemIndex]);
Edit1.Text := Path.Text; //hvad bruges den til? end;
procedure TForm1.FormDestroy(Sender: TObject); var i : integer; begin for i := 0 to ListBox1.Count - 1 do ListBox1.Items.Objects[i].Free;
var bare for at illustrere hvordan man brugte de data som TPath indeholdt. Via Node har vi fundet pointeren (det hedder det ikke i objektorienteret regi, men det er altså hvad det er (kaldes en "instans" i stedet for)) til TPath-objektet og så kopierer jeg stieen over i en TEdit.
At jeg bruger propertynavnet Text for TPath er ikke et tilfælde. Vil gerne bruge samme navne som de der findes i Delphi.
Det er alt der er i programmet; det er kun et lille let eksempel som kræver, at du ved lidt om hvordan man arbejder med klasser og objekter.
jeg ved intet om klasser og objekter. jeg kunne vel ikke få dig til at lave et eksempel til mig, hvor den loader en *.txt fil ind i path og når man så dubble kliker skal den spille stien til den item.
Nu bliver jeg lidt forvirret (naturligvis bare en grad mere end normalen). Du skriver om txt-filer i et katalog. Ovenfor snakker du om ID3-tags, underforstået at vi har med MPx filer at gøre. Skal jeg ignorere det og køre videre med at du vil have et progam der scanner et katalog for *.txt filer, smider dem ind i en listbox (eller andet), og sender stieen til et eller andet, hvis man klikker på en linie?
Hvad mener du med at "spille stien til den item"? Hvilke "item"?
Jeg vil gerne lave et eksempel til dig - lyder ikke så svært at jeg er afskrækket, men kravsspecifikationen ;-) er ikke helt forstået.
Min playlist er en *.txt fil som bliver loadet ind i en listbox. som du kan se er der en løkke der ændre alle stierne til mp3 filerne til id3 tagget. men da min mp3 player afspiller itemindex, og min listbox indeholder id3 tag istedet for stien så kan den ikke finde mp3 filen. håber du forstår hvad jeg mener.
procedure TForm1.FormCreate(Sender: TObject); Var INI: TINIFile; LastPlayed : String; I : Integer; begin ini := Tinifile.create(extractfilepath(application.exename)+'settings.ini');
For I := 0 to Listbox1.Items.Count-1 do begin id3.FileName := listbox1.Items.Strings[I]; //id3 er en komponet jeg bruger id3.Active := true; listbox1.Items.Strings[I] := id3.Artist + ' - ' + id3.Title; id3.Active := false; end;
end;
function TForm1.PlaySong : string; var mp3File : string; begin
Jeg har et program med en listbox (lbPlayList), en mediaplayer (mpPlayer) og en progressbar (pbStatus). Fandt en ID3 komponent som ikke helt ligner din, men det er tæt nok til at du sikkert kan tilrette det.
type (* TMyID3 er en containerklasse der indeholder en TID3-komponent foruden den property vi mangler: FileName. Dens constructor og destructor sørger for at tingene oprettes og frigives korrekt. ID3-komponenten jeg fandt, har ingen Active-property. I stedet har den bare en ReadID3 procedure som man kalder med filnavnet. *) TMyID3 = class private fFileName: string; fID3 : TID3; public constructor Create(const aFileName : string); destructor Destroy; override; property ID3 : TID3 read fID3; property FileName : string read fFileName; function AsString : string; end;
// Laver en "læsbar" præsentation af data function TMyID3.AsString: string; begin result := fID3.Artist + ' - ' + fID3.Title; end;
// Opretter lokal fID3-komponent og indlæser data - antages at filen altid findes! constructor TMyID3.Create(const aFileName: string); begin inherited Create; fFileName := aFileName; fID3 := TID3.Create(nil); fID3.ReadID3(fFileName); // Indlæser data end;
procedure TfrmMain.FormCreate(Sender: TObject); var i : Integer; MyID3 : TMyID3; LastPlayed : string; IniFileName : string; FileList : TStringList; begin IniFileName := ExtractFilePath(Application.ExeName)+'Settings.ini'; if not FileExists(IniFileName) then exit;
with TIniFile.Create(IniFileName) do try LastPlayed := ReadString('SETTINGS', 'LastPlayed', 'na') + '.txt'; finally Free; end; // try
FileList := TStringList.Create; try FileList.LoadFromFile(LastPlayed); for i := 0 to FileList.Count - 1 do begin if not FileExists(FileList[i]) then Continue; // Skipper loop og prøver den næste
// Opret data-objekt og indlæs data fra fil MyID3 := TMyID3.Create(FileList[i]);
// Her oprettes elementet i listboxen og gemmer MyID3-objektet sammen med det lbPlayList.AddItem(MyID3.AsString, MyID3); end; // for finally FileList.Free; end; // try end;
procedure TfrmMain.FormDestroy(Sender: TObject); var i : integer; begin // Frigiver alle de oprettede MyID3 objektinstanser der ligger i listbox'en for i := 0 to lbPlayList.Count - 1 do TMyID3(lbPlayList.Items.Objects[i]).Free; lbPlayList.Clear; end;
procedure TfrmMain.lbPlayListDblClick(Sender: TObject); var // For læsbarhed af eksemplet, laves denne instans-pointer. Der oprettes intet // objekt, der peges kun på det som vi lavede i OnCreate MyID3 : TMyID3; // Instans-pointeren! begin pbStatus.Min := 0; mpPlayer.Close; try // Henter det tilknyttede objekt frem igen with lbPlayList do MyID3 := TMyID3(Items.Objects[ItemIndex]);
P.S. Ligesom der findes Objects[], så har TTreeViews TTreeNode og TListViews TLIstItem en .Data property hvorpå man også kan hægte objekter eller datastrukturer på.
P.P.S. Du er velkommen til at skrive email-adresse hvis du gerne vil have programmet tilsendt.
den exe fil du sendte til mig virker ik' den ændre stien til id3 tagget, men når jeg dbl klikker så får jeg en no MCI device open eller cloce, men et eller anndet i den stil.
jeg kan ik finde rund i den kode, men det er bare fordi jeg er nybegynder. men hvis du gad give mig et eksemple på hvordan man loader en txt fil ind i tstringlist eller en object eller hvad det er, og derefter når man dbl klikker på min listbox så for man en messagebox med stien på den item du har klikket på. så burde jeg kunne få det sidte til at virke selv.
procedure TfrmMain.FormCreate(Sender: TObject); var i : Integer; MyID3 : TMyID3; LastPlayed : string; IniFileName : string; FileList : TStringList; begin IniFileName := ExtractFilePath(Application.ExeName)+'Settings.ini'; if not FileExists(IniFileName) then exit;
// Læs hvilken fil vi vil have fat i with TIniFile.Create(IniFileName) do try LastPlayed := ReadString('SETTINGS', 'LastPlayed', 'na') + '.txt'; finally Free; end; // try
// Opret en streng-liste hvori vi gemmer txt-filen FileList := TStringList.Create; try FileList.LoadFromFile(LastPlayed);
// Gennemløb listen og opret objekter løbende for i := 0 to FileList.Count - 1 do begin
// Hvis ikke den findes, så skip og prøv den næste if not FileExists(FileList[i]) then Continue;
// Opret data-objekt og indlæs data fra fil MyID3 := TMyID3.Create(FileList[i]);
// Her oprettes elementet i listboxen og gemmer MyID3-objektet sammen med det lbPlayList.AddItem(MyID3.AsString, MyID3); end; // for finally FileList.Free; end; // try end;
Øverst i listningen har jeg kreeret en TMyID3-klasse og det er den jeg banker ind sammen med listitem-elementet. Har tidligere haft store problemer med at sende exe-filer til andre - og ved ikke hvorfor - hvis det er tilfældet ved dig (tror mere det er en indstilling i mediaplayeren jeg ikke har fået sat), så må du prøve at oversætte programmet selv. Der er ikke mange fejlmuligheder med ovenstående kode.
playlist.txt bliver loadet ind i FileList, og jeg har sat det hele ind i functioner. og min id3 løkke og play function er også i en function (vær for sig).
så jeg har 3 functioner
load playlist ind i FileList ID3 løkke Play funktionen
min play function afspiller itemindex, men jeg vil gerne vide hvordan jeg kan exporter en Integer fra en function til an anden function
function GetName : string; begin result := 'Pelle Voigt'; end;
function GetPolitician : string; begin result := GetName; // Henter værdien fra den anden funktion end;
Det er ikke på det niveau, vel? Kan du ikke prøve at pensle det lidt mere ud?
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.