1

Delphi/Pascalに自分の音楽プレーヤー用のプレイリストが欲しいのですが。

MP3ファイルのパスを含むTStringListと、曲名を含むTListBoxを用意するのが最善の解決策だと思いました。両方のリストで一致する文字列は同じ位置にある必要があります。したがって、ユーザーがTListBoxで項目5を選択した場合、TStringListの位置5のパスをたどることができます。

これは正常に機能します。

しかし、今は「アーティスト」と「曲のタイトル」の2つの列を持つプレイリストが必要です。プレイリストは、アーティスト(昇順と降順)および曲のタイトル(昇順と降順)で並べ替えることができるはずです。もちろん、アルファベット順に並べ替えることができます。

どうすればこれを行うことができますか?TStringListの2つのオブジェクトがあります。1つはアーティストで並べ替えられ、もう1つは曲のタイトルで並べ替えられていますか?

4

4 に答える 4

4

少なくともArtistプロパティとTitleプロパティを含むTSongクラスと、適切な並べ替えフィールドを使用して1つ以上の並べ替えメソッド(ジェネリックにすることができます)を提供する
TSongListを実行します。並べ替え時に同期して再シャッフルします...

これを実装するための安価な方法の1つは、異なる列で並べ替えることができるグリッドに表示されたArtistとPathを含むレコードを含むメモリ内のDataSetを用意することです。
現在の行は、両方の情報を直接提供します。

于 2010-02-14T00:03:29.537 に答える
2

簡単な解決策の1つは、曲リスト/曲情報を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;
于 2010-02-14T15:11:31.737 に答える
1

私はこれらの「リスト」のいくつかを時間をかけて作成し、最終的にはクラスをかなり簡単にすることにいつも気づきましたが、ディスクからのリストの保存と特に読み取りは控えめに言っても「挑戦的」であることが証明されました。

ユーザーが実際に外部エディターでリストを操作し、リストの読み取りでエラーが発生しやすくなる場合が課題でした。

広く受け入れられているプレイリスト形式(M3U)については、http: //schworak.com/programming/music/playlist_m3u.aspを参照してください。

複数のフォーマットを読み取るソースを備えたVCLコンポーネントは、Torryの「PlayListv.0.5.1」で入手できます。http://www.torry.net/quicksearchd.php?String=PlayList+v.0.5.1&Title=Yes

于 2010-02-14T08:01:03.900 に答える
1

グローバルオブジェクト構造を構築したくない場合は、常にレポートモードでTlistView構造を使用できます。サブアイテムを含むリストがあります。列で並べ替えて、csvまたは任意の形式で保存できます。アイコンなどを簡単に追加できます。

トリガーする適切なイベントがあります。

于 2010-02-14T13:54:53.013 に答える