我想有一个播放列表在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或任何格式。 您可以轻松地添加图标等等.....

和你有合适的事件来触发。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top