Hallo,
was besseres viel mir leider gerade nicht als Thema ein.
Es geht darum ein eigenes Playlist-System zu erstellen, ähnlich der MediaLibrary von Winamp.
Ich weiß nicht ob Winamp dafür eine Datenbank benutzt aber das ist gerade wengier wichtig.
Ich wurde von einem Bekannten angesprochen ob ich nicht etwas bauen könnte damit er eine interaktive Suche für seine Musik hat.
Er hat also alle Seine Musik und möchte nun nach einem Lied suchen, dessen genauen Namen er nicht mehr kennt, aber einen Teil von ihm.
Hatte es auch zum Teil schon fertig gehabt aber nicht direkt mit dem Erfolg den ich wollte.
Beim erstellen der "Liste" übergibt man Quellverzeichnis und eine Liste vom Typ TStrings(für die Visualisierung).
Das Verzeichnis inkl. aller Unterverzeichnisse wird durchsucht und für jede gefundene Datei ein CollectionItem angelegt.
Darin enthalten sind bisher nur Pfad und Dateiname. Später sollen dort aber auch noch ID3 Tag, Länge usw. drin enthalten sein.
Nachdem alle Dateien hinzugefügt werden, wird einfach nur der Dateiname an die Liste angehängt.
Intern nutze ich nur TStrings, da ist mir schon aufgefallen das es dort ja keine Eigenschaft ItemIndex gibt, was natürlich nicht so toll ist. Bin dann erstmal über IndexOf(S: String) gegangen aber was passiert wenn öfter eine Datei vorkommt. Dann würde er immer die erste nutzen.
Sie suche ansich funtioniert recht einfach. die liste wird gesäubert und es werden alle CollectionItems durchgegangen und wenn der Suchtext passt, wird er zur liste hinzugefügt. Da hab ich dann eben gemerkt wenn im Verzeichnis /xy/lied.mp3 liegt und direkt darunter im Verzeichnis /xx/lied.mp3 und ich klicke letzteres an er eben das erste nehmen würde.
Somit dachte ich ok übergibst halt auch das eigentliche Objekt bei der Suche und gehst dann direkt über das Objekt in der Liste.
Es wäre jetzt die Frage die ich hier stelle, ob es eine bessere Lösung gebe sowohl in der Umsetzung und Aufwand.
Das ist jetzt noch der Original Code ohne übergabe des Objektes an die Liste
Delphi-Quellcode:
type
TAudioItem = class(TCollectionItem)
private
FFilename: String;
FDirectory: String;
procedure SetDirectory(const Value: String);
procedure SetFilename(const Value: String);
public
property Filename: String read FFilename write SetFilename;
property Directory: String read FDirectory write SetDirectory;
end;
type
TAudioItems = class(TCollection)
private
public
constructor Create;
constructor Destroy;
function Add(Directory, Filename: String): TAudioItem;
function GetAudioItem(Index: Integer): TAudioItem;
end;
type
TPlayList = class(TObject)
private
FList: TStrings;
FAudioItems: TAudioItems;
FCount: Integer;
procedure GetFiles(aDirectory: String; const FileMask: String; SubDirs: Boolean);
public
constructor Create(List: TStrings);
destructor Destroy; override;
procedure AddDirectory(ADirectory: String);
procedure FileEntry(S: String; var Directory: String; var Filename: String);
procedure Search(S: String);
function Count: Integer;
function SelectedItem: Integer;
end;
procedure TPlayList.AddDirectory(ADirectory: String);
var
SR: TSearchRec;
I: Integer;
begin
GetFiles(ADirectory, '*.mp3', True);
for I := 0 to FAudioItems.Count - 1 do
FList.Add(FAudioItems.GetAudioItem(I).Filename);
end;
procedure TPlayList.FileEntry(S: String; var Directory, Filename: String);
var
AItem: TAudioItem;
I: Integer;
begin
for I := 0 to FAudioItems.Count - 1 do
if (FAudioItems.GetAudioItem(I).Filename = S) then
begin
AItem := FAudioItems.GetAudioItem(I);
break;
end;
Directory := AItem.Directory;
Filename := AItem.Filename;
end;