문제

하고 싶은 재생목록 나의 음악 플레이어에서 Delphi/파스칼.

내가 될 것이라고 생각했 최고의 솔루션을 TStringList 의 경로와는 MP3 파일을-또한다-TListBox 노래와 함께 이름입니다.치에서 문자열을 모두 목록에 있어야합니다 같은 위치에 있습니다.그렇다면 사용자 선택 품목에서 5TListBox 을 경로에 위치한 5 에 TStringList.

이 잘 작동합니다.

그러나 이제는 내가 필요 재생 목록에 두 개의 열이 있:"예술가"및"노래 제목".당신이해야 할 수 있을 정식으로 노래 아티스트(오름차순과 내림차순으로)뿐만 아니라 노래 제목으로(오름차순과 내림차순)-알파벳순으로,물론입니다.

어떻게 해야 하나요?는 두 개의 TStringList-중 하나에 의해 정렬 아티스트와 중 하나로 정렬된 노래 제목?

도움이 되었습니까?

해결책

나는 시간이 지남에 따라이 "목록"중 몇 가지를 해냈고 결국에는 항상 수업을 쉽게 만드는 것을 발견했지만 특히 디스크에서 목록을 저장하고 특히 "도전적인"것으로 입증되었습니다.

도전 과제는 사용자가 실제로 외부 편집자로 목록을 조작하여 목록을 읽기 쉬운 경우가 발생했습니다.

보편적으로 허용되는 재생 목록 형식 (M3U)의 경우 http://schworak.com/programming/music/playlist_m3u.asp.

여러 형식을 읽는 소스가있는 VCL 구성 요소는 Torry의 "Playlist v.0.5.1"에서 사용할 수 있습니다. http://www.torry.net/quicksearchd.php?string=playlist+v.0.5.1&title=yes

다른 팁

적어도 아티스트와 제목 속성을 포함하는 TSONG 클래스와 적절한 정렬 필드 (S.
분명히 관리 해야하는 별도의 문자열 목록 2 개를 유지하지 않고 정렬 할 때 동기화 및 개편을 유지합니다 ...

그것을 구현하는 저렴한 방법 중 하나는 다른 열에 정렬 할 수있는 그리드에 표시되는 레코드와 경로가 포함 된 레코드가 포함 된 메모리 데이터 세트를 갖는 것입니다.
현재 행은 두 정보를 직접 제공합니다.

하나의 간단한 솔루션을 구현하는 노래/song 정보로 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 구조를 모두 사용할 수 있습니다. 당신은 subitems가있는 목록이 있습니다. 열별로 정렬하고 CSV 또는 모든 형식에 저장할 수 있습니다. 아이콘 등을 쉽게 추가 할 수 있습니다 .....

그리고 당신은 트리거 할 올바른 이벤트가 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top