播放列表中的多个数据项的德尔福/列表的音乐播放器
题
我想有一个播放列表在Delphi /帕斯卡尔自己的音乐播放器。
我认为这将是有MP3文件和路径一TStringList中的最佳解决方案 - 还 - 一个TListBox中的歌曲名称。这两个列表中匹配的字符串必须是在同一位置。因此,如果用户在选择的TListBox项目5我可以采取在TStringList中位置5的路径。
此工作正常。
但现在我需要两列播放列表:“艺术家”和“歌曲名”。您应该能够按艺术家播放列表(升序和降序),以及通过歌曲名称(升序和降序) - 按字母排序,当然
我怎么能这样做?有TStringList中的两个对象 - 一个由艺术家排序,并通过一个歌曲标题排序
解决方案
我已经做了一些这些“名单”随着时间的推移,到最后我总是发现制造类比较容易的,但是存储尤其是从磁盘读取列表中已被证明“挑战”,至少可以说。
面临的挑战是在例用户实际操纵与外部编辑器的列表,从而使得读取列表容易出错。
有关普遍接受的播放列表格式(M3U)看看 HTTP:// schworak。 COM /编程/音乐/ playlist_m3u.asp 。
与源甲VCL组件,其读取多种格式提供的托里的称为“播放列表v.0.5.1”。 http://www.torry.net/quicksearchd。 PHP?字符串=播放列表+ v.0.5.1&标题=是
其他提示
我会做至少含有艺术家和标题属性和TSongList提供1个或多个排序方法聪类使用正确的排序字段(一个或多个(可以是通用的)。结果 当然不是在维护你必须要管理,保持同步和洗牌2个独立的StringLists排序时...
要有点儿实现一个廉价的方式,可与含艺术家和路径,你可以排序的不同列的网格显示的记录存储数据集有一个。结果 当前行,将直接给双方的信息。
一个简单的解决办法是执行歌曲列表/歌曲信息作为TCollection。
通过使用集合,你可以让VCL处理加载和保存到磁盘。
例如:
请注意,这并不功能完整,我会留给你的,因为我写这从我的头顶,我可能会弄乱的东西了。它只是让你开始一个例子。
{...}
interface
Type
TSongCollectionItem = class(TCollectionItem)
public
constructor create(Owner:TCollection); override;
procedure assign(source : TPersistent); override;
published
property FileName : String read fFileName Write fFileName;
property Artist : string read fArtist write fArtist;
property Title : string read fTitle write fTitle;
{...}
property Album : string read fAlbum write fAlbum;
end;
TSongCollection = class(TOwnedCollection)
private
function GetItem(Index: Integer): TSongCollectionItem;
procedure SetItem(Index: Integer; Value: TSongCollectionItem);
public
constructor Create(AOwner: TPersistent);
function Add: TSongCollectionItem;
property Songs[Index: Integer]: TSongCollectionItem read GetItem write SetItem; default;
end;
procedure SaveSongList(Songs : TSongCollection; FileName:string; Binary:boolean);
procedure LoadSongList(Songs : TSongCollection; FileName:string; Binary:boolean);
{...}
implementation
{...}
type
TSongComponent = class(TComponent)
published
property SongList : TSongCollection read fsonglist write SetSongList;
end;
procedure SaveSongList(Songs : TSongCollection; FileName:string; Binary:boolean);
var
wFile : TFileStream;
wConvert : TMemoryStream;
wSongList : TSongComponent;
begin
RegisterClass(TSongComponent);
Try
wConvert := TMemoryStream.Create;
wFile := TFileStream.Create(filename, fmcreate);
wSongList := TSongComponent.create(nil);
try
wSongList.SongList.Assign(Songs);
if not Binary then
begin
wConvert.WriteComponent(wSongList);
wConvert.Position := 0;
ObjectBinaryToText(wConvert, wFile);
end
else
wFile.WriteComponent(wSongList);
finally
wConvert.Free;
wFile.Free;
wSongList.free;
end;
finally
Unregisterclass(TSongComponent);
end;
end;
procedure LoadSongList(Songs : TSongCollection; FileName:string; Binary:boolean);
var
wFile : TFileStream;
wConvert : TMemoryStream;
wSongList : TSongComponent;
begin
RegisterClass(TSongComponent);
Try
wConvert := TMemoryStream.Create;
wFile := TFileStream.Create(filename, fmOpenRead);
try
if not Binary then
begin
ObjectTextToBinary(wFile, wConvert);
wConvert.Position := 0;
wSongList := TSongComponent(wConvert.ReadComponent(Nil));
end
else
wSongList := TSongComponent(wFile.ReadComponent(Nil));
if assigned(Songs) and assigned(wSongList) then
Songs.Assign(wSongList.Songs);
if assigned(wSongList) then
wSongList.free;
finally
wConvert.Free;
wFile.Free;
end;
finally
Unregisterclass(TSongComponent);
end;
end;
如果你不希望建立一个全局对象结构,你可以使用永诺结构TListView的报告模式。 你必须有一个列表,子项目。 您可以通过列进行排序,并保存到CSV或任何格式。 您可以轻松地添加图标等等.....
和你有合适的事件来触发。