⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 uplaylist.pas

📁 MP3播放器
💻 PAS
字号:
unit uPlayList;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, IniFiles, MPlayer, ExtCtrls, MMSystem, ShlObj;

type
  TfrmPlayList = class(TForm)
    ListBox_PlayFiles: TListBox;
    btn_AddFile: TButton;
    btn_DelFile: TButton;
    btn_Clear: TButton;
    OpenDlg_PlayList: TOpenDialog;
    SaveDlg_PlayList: TSaveDialog;
    AutoPlayTimer: TTimer;
    btn_AddDir: TButton;
    procedure ListBox_PlayFilesDblClick(Sender: TObject);
    procedure btn_AddFileClick(Sender: TObject);
    procedure btn_ClearClick(Sender: TObject);
    procedure btn_DelFileClick(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure AutoPlayTimerTimer(Sender: TObject);
    procedure btn_AddDirClick(Sender: TObject);
  private
    procedure Init;
    function SearchFile(DirPath, FileName: string; var BackUpResult: TStrings): Boolean;
    { Private declarations }
  public
    FileIndex: Integer;          // 播放文件的索引
    FileCount: Integer;          // 列表中文件总数
    IsFileChange: Boolean;       // 通知主窗口播放歌曲已改
    FileLength: Longint;         // 文件长度
    FilePosition: Longint;       // 当前播放的帧数
    Drive: char;                 // 光驱盘符
    IsCDOpen: Boolean;           // 光驱是否打开
    FileListName: TIniFile;      // 列表文件关联名
    IsPlayingPause: Boolean;     // 暂停控制
    procedure PlayMedia;         // 播放音频文件
    procedure PlayPause;         // 暂停当前播放文件
    procedure PlayStop;          // 停止当前播放文件
    procedure PlayBack;          // 倒退当前播放文件
    procedure PlayStep;          // 快进当前播放文件
    procedure PlayPrev;          // 播放上一曲目
    procedure PlayNext;          // 播放下一曲目
    procedure AddPlayFile;       // 添加播放列表文件
    procedure DelPlayFile;       // 删除播放列表文件
    procedure ClearPlayFile;     // 清空播放列表文件
    procedure CDControl;         // 控制CDROM开关
    { Public declarations }
  end;

var
  frmPlayList: TfrmPlayList;

implementation

uses uEPlayer, uMovie;

{$R *.dfm}

procedure TfrmPlayList.ListBox_PlayFilesDblClick(Sender: TObject);
var
  Index: Integer;
begin
  Index := ListBox_PlayFiles.ItemIndex;
  if Index < 0 then Exit;
  if Index = FileIndex then Exit;
  frmEPlayer.MediaPlayer.Close;
  FileIndex := Index;
  FileListName.WriteInteger('播放文件', '文件号', FileIndex);
  PlayMedia;
end;

procedure TfrmPlayList.btn_AddFileClick(Sender: TObject);
begin
  AddPlayFile;
end;

procedure TfrmPlayList.btn_ClearClick(Sender: TObject);
begin
  ClearPlayFile;
end;

procedure TfrmPlayList.btn_DelFileClick(Sender: TObject);
begin
  DelPlayFile;
end;

procedure TfrmPlayList.PlayMedia;
var
  ExtName: string;
begin
  with frmEPlayer.MediaPlayer do
  begin
    if Mode = mpOpen then Close;    //如果正在播放,则关闭
    FileName := FileListName.ReadString('文件列表', 'No.[' + IntToStr(FileIndex) + ']','');
    try
      Open;
      ExtName := ExtractFileExt(FileName);
      if (StrIComp(PChar(ExtName), '.mpg') = 0) or
         (StrIComp(PChar(ExtName), '.dat') = 0) or
         (StrIComp(PChar(ExtName), '.avi') = 0) or
         (StrIComp(PChar(ExtName), '.asf') = 0) then
      begin
        //frmEPlayer.MediaPlayer.Display := frmMovie.Panel_DisPlay;
        //frmEPlayer.MediaPlayer.DisplayRect := frmMovie.Panel_DisPlay.ClientRect;
        //frmMovie.Visible := True;
      end
      else
        begin
          //frmEPlayer.MediaPlayer.Display := nil;
          //frmMovie.Visible := False;
        end;
        TimeFormat := tfMilliseconds;
        Position := 0;
        IsFileChange := True;
        Play;
        //PlayingPause := False;
    except
      MessageDlg('无法打开或者播放此文件!',mtError,[mbOK],0);
    end;
  end;
end;
// 播放下一曲目
procedure TfrmPlayList.PlayNext;
begin
  if FileIndex >= FileCount - 1 then Exit;
  FileIndex := FileIndex + 1;
  ListBox_PlayFiles.ItemIndex := FileIndex;
  FileListName.WriteInteger ('播放文件', '文件号', FileIndex);
  PlayMedia;
end;
// 添加播放列表文件
procedure TfrmPlayList.AddPlayFile;
var
  I: Integer;
begin
  OpenDlg_PlayList.Filter := '音频文件(*.WAV,*.MP3,*.WMA,*.MID,*.RMI,*.CDA)|*.WAV;*.MP3;*.WMA;*.MID;*.RMI;*.CDA|视频文件(*.MPG,*.AVI,*.DAT,*.ASF,*,MPEG)|*.MPG;*.AVI;*.DAT;*.ASF;*.MPEG|所有文件(*.*)|*.*';
  if OpenDlg_PlayList.Execute then
  begin
    with OpenDlg_PlayList.Files do
      for I := 0 to Count - 1 do
      begin
        ListBox_PlayFiles.Items.Add(Strings[I]);
        FileListName.WriteString('文件列表', 'No.[' + IntToStr(FileCount + I) + ']', Strings[I]);
      end;
      FileIndex := FileCount;
      ListBox_PlayFiles.ItemIndex := FileIndex;
      //ListBoxScrollar(Sender);
      FileCount := FileCount + OpenDlg_PlayList.Files.Count;
      FileListName.WriteInteger('播放文件', '文件号', FileIndex);
      FileListName.WriteInteger('播放文件', '文件数', FileCount);
      PlayMedia;
  end;
end;
// 删除播放列表文件
procedure TfrmPlayList.DelPlayFile;
var
  Index : Integer;
begin
  if FileCount <= 0 then Exit;      // 如果列表中为空则退出
  Index := ListBox_PlayFiles.ItemIndex;
  if Index < 0 then Exit;           // 如果没有选择则退出
  // 如果被删除的是当前正在播放的音乐,则关闭音乐
  if frmEPlayer.MediaPlayer.FileName = ListBox_PlayFiles.Items.Strings[Index] then
  begin
    frmEPlayer.MediaPlayer.Close;
    FileIndex := -1;
    FileListName.WriteInteger('播放文件', '文件号', FileIndex);
  end;
  // 从列表中删除
  ListBox_PlayFiles.Items.Delete(Index);
  // 列表文件总数减一
  FileCount := FileCount - 1;
  if FileCount = 0 then
  begin
    FileIndex := -1;
    FileListName.WriteInteger('播放文件', '文件号', FileIndex);
  end;
  if Index = FileCount then
    ListBox_PlayFiles.ItemIndex := 0
  else
    ListBox_PlayFiles.ItemIndex := Index;

  FileListName.WriteInteger('播放文件', '文件数', FileCount);
  for Index := Index to FileCount - 1 do
  begin
    FileListName.WriteString ('文件列表', 'No.[' + IntToStr(Index) + ']',
    ListBox_PlayFiles.Items.Strings[Index]);
  end;
  //ListBoxScrollar(Sender);
  FileListName.DeleteKey('文件列表', 'No.[' + IntToStr(FileCount) + ']');
end;

procedure TfrmPlayList.Init;
var
  I: Integer;
  TmpName: string;
begin
  FileListName := TIniFile.Create(ExtractFilePath(ParamStr(0)) + 'EPlayer.ini');
  // 建立列表文件关联
  FileCount := FileListName.ReadInteger('播放文件', '文件数', 0);
  for I := 0 to FileCount - 1 do
  begin
    TmpName := FileListName.ReadString('文件列表', 'No.[' + IntToStr(I) + ']', '');
    ListBox_PlayFiles.Items.Add (TmpName);
  end;
  FileIndex :=FileListName.ReadInteger('播放文件', '文件号', -1);
  ListBox_PlayFiles.ItemIndex := FileIndex;
  //ListBoxScrollar(Sender);
  {for I := Ord('A') to Ord('Z') do
  begin
    Drive := Chr(I);
    if GetDriveType(PChar(Drive + ':\' + #0)) = DRIVE_CDROM  then
      Break;
  end;}
end;
// 清空播放列表文件
procedure TfrmPlayList.ClearPlayFile;
begin
  if FileCount <= 0 then exit; //如果列表中为空则退出
    frmEPlayer.MediaPlayer.Close;
    FileCount := 0;
    FileIndex := -1;
    FileListName.WriteInteger('播放文件', '文件数', FileCount);
    FileListName.WriteInteger('播放文件', '文件号', FileIndex);
    FileListName.EraseSection('文件列表');
    ListBox_PlayFiles.Items.Clear;
end;


procedure TfrmPlayList.FormCreate(Sender: TObject);
begin
  Init;
end;

procedure TfrmPlayList.AutoPlayTimerTimer(Sender: TObject);
begin
  if frmEPlayer.MediaPlayer.Mode = mpPlaying then
    if frmEPlayer.MediaPlayer.Position >= frmEPlayer.MediaPlayer.Length - 1000 then
    PlayNext;
end;
// 控制CDROM开关
procedure TfrmPlayList.CDControl;
begin
  if IsCDOpen then
  begin
    MciSendString('set cdaudio door closed', nil, 0, 0);
    IsCDOpen := False;
  end
  else
  begin
    MciSendString('set cdaudio door open', nil, 0, 0);
    IsCDOpen := True;
  end;
end;
// 倒退当前播放文件
procedure TfrmPlayList.PlayBack;
begin
  with frmEPlayer.MediaPlayer do
  begin
    if not(Mode in [mpPlaying]) then Exit;
    Pause;
    Position := Position - 6000;
    Play;
  end;
end;
// 暂停当前播放文件
procedure TfrmPlayList.PlayPause;
begin
  with frmEPlayer.MediaPlayer do
  begin
    if Mode in [mpOpen, mpPlaying] then Pause
    else if Mode in [mpOpen, mpPaused] then Resume;
  end;
end;
// 播放上一曲目
procedure TfrmPlayList.PlayPrev;
begin
  if FileIndex <= 0 then Exit;
  FileIndex := FileIndex - 1;
  ListBox_PlayFiles.ItemIndex := FileIndex;
  FileListName.WriteInteger('播放文件', '文件号', FileIndex);
  PlayMedia;
end;
// 快进当前播放文件
procedure TfrmPlayList.PlayStep;
begin
  with frmEPlayer.MediaPlayer do
  begin
    if not(Mode in [mpPlaying]) then Exit;
    Pause;
    Position := Position + 6000;
    Play;
  end;
end;
// 停止当前播放文件
procedure TfrmPlayList.PlayStop;
begin
  with frmEPlayer.MediaPlayer do
  begin
    if Mode in [mpStopped] then Exit;
    Close;
  end;
end;

function IsValidDir(SearchRec: TSearchRec): Boolean;
begin
  if (SearchRec.Attr = 16) and (SearchRec.Name <> '.') and
     (SearchRec.Name <> '..') then
     Result := True
  else
    Result := False;
end;

{查询目录主体函数}
function TfrmPlayList.SearchFile(DirPath, FileName: string;
         var BackUpResult: TStrings): Boolean;
var
  I: Integer;
  IsBackUp: Boolean;
  SubDir: TStrings;
  SearchRec: TSearchRec;
begin
  IsBackUp := False;
  if Trim(FileName) <> '' then
  begin
    {字符串列表必须动态生成}
    SubDir := TStringList.Create;
    {找出所有下级子目录}
    if (FindFirst(DirPath + '*.*',faDirectory,SearchRec) = 0) then
    begin
      if IsValidDir(SearchRec) then
        SubDir.Add(SearchRec.Name);
      while (FindNext(SearchRec) = 0) do
      begin
        if IsValidDir(SearchRec) then
          SubDir.Add(SearchRec.Name)
        else
        begin
        {查找当前目录}
          if FileExists(DirPath + FileName) then
          begin
            BackUpResult.Add(DirPath + FileName);
            if SearchRec.Name <> '..' then
            begin
              if UpperCase(ExtractFileExt(SearchRec.Name)) =
                 UpperCase(ExtractFileExt(FileName)) then
                ListBox_PlayFiles.Items.Add(DirPath + SearchRec.Name);
            end;
          end;
        end;
      end;
      FindClose(SearchRec);
      IsBackUp := True;
      for I := 0 to SubDir.Count - 1 do
      IsBackUp := SearchFile(DirPath + SubDir.Strings[I] +
                '\', FileName, BackUpResult) or IsBackUp;
      {释放资源并返回结果}
      SubDir.Free;
    end;
    Result := IsBackUp;
  end;
end;

{添加播放文件目录}
procedure TfrmPlayList.btn_AddDirClick(Sender: TObject);
var
  Info: TBrowseInfo;
  Dir: array[0..260] of char;
  ItemId: PItemIDList;
  AudioDirList: TStrings;
  I: Integer;
begin
  with Info do
  begin
    hwndOwner := Self.Handle;
    pidlRoot := nil;
    pszDisplayName := nil;
    lpszTitle := '请选择播放目录文件夹:';
    ulFlags := 0;
    lpfn := nil;
    lParam := 0;
    iImage := 0;
  end;
  ItemId := SHBrowseForFolder(Info);
  if ItemId <> nil then
  begin
    SHGetPathFromIDList(ItemId, @Dir);
    AudioDirList := TStringList.Create;
  try
    if Length(string(Dir)) = 3 then
    begin
      SearchFile(string(Dir), '*.mp3', AudioDirList);
      SearchFile(string(Dir), '*.wma', AudioDirList);
    end
    else
      SearchFile(string(Dir)+'\', '*.mp3', AudioDirList);
      SearchFile(string(Dir)+'\', '*.wma', AudioDirList);
  finally
    AudioDirList.Free;
  end;
  for I := 0 to ListBox_PlayFiles.Count - 1 do
  begin
    ListBox_PlayFiles.Items.Add(ListBox_PlayFiles.Items.Strings[I]);
    FileListName.WriteString('文件列表', 'No.[' + IntToStr(FileCount + I) + ']', ListBox_PlayFiles.Items.Strings[I] );
  end;
    FileIndex := FileCount;
    ListBox_PlayFiles.ItemIndex := FileIndex;
    FileCount := FileCount + ListBox_PlayFiles.Count;
    FileListName.WriteInteger('播放文件', '文件号', FileIndex);
    FileListName.WriteInteger('播放文件', '文件数', FileCount);
  end;
end;
end.

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -