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

📄 cdmain.pas

📁 一个简单而使用的CD播放器,是从书上看来的.与大家分享
💻 PAS
字号:
unit CDMain;

interface

uses
  SysUtils, Windows, Classes, Graphics, Forms, Controls, MPlayer, StdCtrls,
  Menus, MMSystem, Messages, Buttons, Dialogs, ExtCtrls, Splash, Gauges,
  ComCtrls;

type
  TMainForm = class(TForm)
    tmUpdateTimer: TTimer;
    MainScreenPanel: TPanel;
    LblStatus: TLabel;
    Label2: TLabel;
    LblCurTrk: TLabel;
    Label4: TLabel;
    LblTrackTime: TLabel;
    Label7: TLabel;
    Label8: TLabel;
    LblTotTrk: TLabel;
    LblTotalLen: TLabel;
    Label12: TLabel;
    LblTrackLen: TLabel;
    Label15: TLabel;
    CDInfo: TPanel;
    SBPanel: TPanel;
    CDControl: TPanel;
    mpCDPlayer: TMediaPlayer;
    sbTrack1: TSpeedButton;
    sbTrack2: TSpeedButton;
    sbTrack3: TSpeedButton;
    sbTrack4: TSpeedButton;
    sbTrack5: TSpeedButton;
    sbTrack6: TSpeedButton;
    sbTrack7: TSpeedButton;
    sbTrack8: TSpeedButton;
    sbTrack9: TSpeedButton;
    sbTrack10: TSpeedButton;
    sbTrack11: TSpeedButton;
    sbTrack12: TSpeedButton;
    sbTrack13: TSpeedButton;
    sbTrack14: TSpeedButton;
    sbTrack15: TSpeedButton;
    sbTrack16: TSpeedButton;
    sbTrack17: TSpeedButton;
    sbTrack18: TSpeedButton;
    sbTrack19: TSpeedButton;
    sbTrack20: TSpeedButton;
    ggTrackDone: TGauge;
    ggDiskDone: TGauge;
    Label1: TLabel;
    Label3: TLabel;
    Label5: TLabel;
    Label6: TLabel;
    Volume: TTrackBar;
    Label9: TLabel;
    procedure tmUpdateTimerTimer(Sender: TObject);
    procedure mpCDPlayerPostClick(Sender: TObject; Button: TMPBtnType);
    procedure FormCreate(Sender: TObject);
    procedure sbTrack1Click(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure VolumeChange(Sender: TObject);
  private
    { Private declarations }
    OldTrack, CurrentTrack: Byte;
    m, s: Byte;
    TotalTracks: Byte;
    TotalLengthM: Byte;
    TotalLengthS: Byte;
    procedure GetCDTotals;
    procedure ShowTrackNumber;
    procedure ShowTrackTime;
    procedure ShowCurrentTime;
    procedure ShowPlayerStatus;
    procedure AdjustSpeedButtons;
    procedure HighlightTrackButton;
    function TrackNumToString(InNum: Byte): String;
  end;

var
  MainForm: TMainForm;

implementation

{$R *.DFM}

const
  { 定义一个数组,用于显示CD歌曲号码,范围从1-20 }
  NumStrings: array[1..20] of String[10] =
      ('1', '2', '3', '4', '5', '6', '7', '8', '9',
       '10', '11', '12', '13', '14', '15', '16',
       '17', '18', '19', '20');
  MSFormatStr = '%d分%d秒';  //定义一个显示时间的字符串
  PlayButtons: TButtonSet = [btPause, btStop, btNext, btPrev];
  StopButtons: TButtonSet = [btPlay, btNext, btPrev];

function TMainForm.TrackNumToString(InNum: Byte): String;
{ 这个函数用于将音轨数转化为字符串,返回值为字符串,对于于整数1-20 }
begin
  if (InNum > High(NumStrings)) or (InNum < Low(NumStrings)) then
    Result := IntToStr(InNum)
  else
    Result := NumStrings[InNum];
end;

procedure TMainForm.AdjustSpeedButtons;
{ 这个方法根据当前CD盘上的音轨数来使能合适数目的加速按钮,
每一个加速按钮对应一个音轨}
var
  i: integer;
begin
  for i := 0 to SBPanel.ControlCount - 1 do
    if SBPanel.Controls[i] is TSpeedButton then
      { 使高于音轨数的按钮失效}
      with TSpeedButton(SBPanel.Controls[i]) do Enabled := Tag <= TotalTracks;
end;


procedure TMainForm.GetCDTotals;
{这个方法用于得到CD盘上的总音轨数及总时间,并显示它们}
var
  TimeValue: longint;
begin
  mpCDPlayer.TimeFormat := tfTMSF;                  // 设置时间格式
  TimeValue := mpCDPlayer.Length;                   // 取得CD长度
  TotalTracks := mci_Tmsf_Track(mpCDPlayer.Tracks); // 取得总的音轨数
  TotalLengthM := mci_msf_Minute(TimeValue);     // 取得总长度的分值
  TotalLengthS := mci_msf_Second(TimeValue);     // 取得总长度的秒值
  {显示总音轨数 }
  LblTotTrk.Caption := TrackNumToString(TotalTracks);
  {显示总时间}
  LblTotalLen.Caption := Format(MSFormatStr, [TotalLengthM, TotalLengthS]);
  { 初始化计量器}
  ggDiskDone.MaxValue := (TotalLengthM * 60) + TotalLengthS;
  { 使正确数目的加速按钮有效}
  AdjustSpeedButtons;
end;

procedure TMainForm.ShowPlayerStatus;
{ 这个方法用于显示CD播放器的状态和当前被播放的歌曲}
begin
  if mpCDPlayer.EnabledButtons = PlayButtons then
    with LblStatus do
    begin
      case mpCDPlayer.Mode of
        mpNotReady: Caption := '没准备好';
        mpStopped:  Caption := '已停止';
        mpSeeking:  Caption := '正在搜索';
        mpPaused:   Caption := '暂停';
        mpPlaying:  Caption := '正在播放';
      end;
    end
  { 如果StopButtons处于使能状态,则说明已停止播放}
  else if mpCDPlayer.EnabledButtons = StopButtons then
    LblStatus.Caption := '已停止';
end;

procedure TMainForm.ShowCurrentTime;
{ 这个方法用于显示当前音轨已经播放了的时间}
begin
  { 音轨的分值}
  m := mci_Tmsf_Minute(mpCDPlayer.Position);
  { 音轨的秒值 }
  s := mci_Tmsf_Second(mpCDPlayer.Position);
  { 更新音轨时间}
  LblTrackTime.Caption := Format(MSFormatStr, [m,s]);
  { 更新音轨进度显示}
  ggTrackDone.Progress := (60 * m) + s;
end;

procedure TMainForm.ShowTrackTime;
{ 这个方法改变音轨时间以显示当前选择音轨的总长度}
var
  Min, Sec: Byte;
  Len: Longint;
begin
  {如果CD播放器处于同一音轨,不更新信息}
  if CurrentTrack <> OldTrack then
  begin
    Len := mpCDPlayer.TrackLength[mci_Tmsf_Track(mpCDPlayer.Position)];
    Min := mci_msf_Minute(Len);
    Sec := mci_msf_Second(Len);
    ggTrackDone.MaxValue := (60 * Min) + Sec;
    LblTrackLen.Caption := Format(MSFormatStr, [m,s]);
  end;
  OldTrack := CurrentTrack;
end;

procedure TMainForm.HighlightTrackButton;
{ 这个方法用于改变加速按钮字体的颜色,即让代表当前音轨的按钮字体为红色,
代表其他音轨的按钮字体为蓝色}
var
  i: longint;
begin
  for i := 0 to ComponentCount - 1 do
    if Components[i] is TSpeedButton then
      if TSpeedButton(Components[i]).Tag = CurrentTrack then
        {让代表当前音轨的按钮字体为红色}
        TSpeedButton(Components[i]).Font.Color := clRed
      else
        {让代表其他音轨的按钮字体为蓝色}
        TSpeedButton(Components[i]).Font.Color := clNavy;
end;

procedure TMainForm.ShowTrackNumber;
{ 这个方法用于显示当前正播放的音轨号码}
var
  t: byte;
begin
  t := mci_Tmsf_Track(mpCDPlayer.Position);     // 取得当前音轨
  CurrentTrack := t;
  LblCurTrk.Caption := TrackNumToString(t); //显示当前音轨
  HighlightTrackButton;     // 让代表当前音轨的按钮以红色显示
end;

procedure TMainForm.tmUpdateTimerTimer(Sender: TObject);
{ 这个方法是CD播放器的核心,它每隔一定的时间更新所有显示信息}
begin
  if mpCDPlayer.EnabledButtons = PlayButtons then
  begin
    mpCDPlayer.TimeFormat := tfMSF;
    ggDiskDone.Progress := (mci_msf_minute(mpCDPlayer.Position) * 60 +
                               mci_msf_second(mpCDPlayer.Position));
    mpCDPlayer.TimeFormat := tfTMSF;
    ShowTrackNumber; // 显示当前正播放的音轨号码
    ShowTrackTime;   // 显示当前音轨的总时间
    ShowCurrentTime; // 显示当前音轨已经播放了的时间
  end;
end;

procedure TMainForm.mpCDPlayerPostClick(Sender: TObject;
  Button: TMPBtnType);
{ 当某个按钮被单击时,这个方法用于显示正确的CD播放器按钮}
begin
  Case Button of
    btPlay:
      begin
        mpCDPlayer.EnabledButtons := PlayButtons;
        LblStatus.Caption := '正在播放...';
      end;
    btPause:
      begin
        mpCDPlayer.EnabledButtons := StopButtons;
        LblStatus.Caption := '暂停';
      end;
    btStop:
      begin
        mpCDPlayer.Rewind;
        mpCDPlayer.EnabledButtons := StopButtons;
        LblCurTrk.Caption := '1';
        LblTrackTime.Caption := '0m 0s';
        ggTrackDone.Progress := 0;
        ggDiskDone.Progress := 0;
        LblStatus.Caption := '已停止';
      end;
    btPrev, btNext:
      begin
        mpCDPlayer.Play;
        mpCDPlayer.EnabledButtons := PlayButtons;
        LblStatus.Caption := '正在播放...';
      end;
  end;
end;

procedure TMainForm.FormCreate(Sender: TObject);
{ 在窗体的创建过程中初始化CD播放器}
begin
  try
    mpCDPlayer.Open;    // 打开CD播放器设备
    { 如果在启动时一个CD正在播放,显示播放状态}
    if mpCDPlayer.Mode = mpPlaying then
      LblStatus.Caption := '正在播放...';
    GetCDTotals;      // 显示CD上所有音轨的总时间
    ShowTrackNumber;  // 显示当前音轨的号码
    ShowTrackTime;    // 显示当前音轨的时间
    ShowCurrentTime;  // 显示CD的当前位置
    ShowPlayerStatus; // 更新CD播放器的状态
  except
    { 如果发生错误,退出程序}
    on EMCIDeviceError do
    begin
      MessageDlg('对不起,无法播放CD!程序将马上退出!',
                 mtError, [mbOk], 0);
      Application.Terminate;
    end;
  end;
  { 检测CD-ROM的模式,使能合适的按钮}
  case mpCDPlayer.Mode of
    mpPlaying: mpCDPlayer.EnabledButtons := PlayButtons;
    mpStopped, mpPaused: mpCDPlayer.EnabledButtons := StopButtons;
  end;
  SplashScreen.Release;
end;

procedure TMainForm.sbTrack1Click(Sender: TObject);
{这个方法用于点歌,即当用户单击了一个代表音轨号码的按钮后,播放该音轨}
begin
  mpCDPlayer.Stop;
  {设置新选择音轨的初始位置}
  mpCDPlayer.StartPos := mpCDPlayer.TrackPosition[(Sender as TSpeedButton).Tag];
  { 开始在新位置播放CD }
  mpCDPlayer.Play;
  mpCDPlayer.EnabledButtons := PlayButtons;
  LblStatus.Caption := '正在播放...';
end;

procedure TMainForm.FormClose(Sender: TObject;
  var Action: TCloseAction);
begin
  mpCDPlayer.Close; //关闭CD播放器
end;

procedure TMainForm.VolumeChange(Sender: TObject);
{此方法用于调整CD播放器的音量}
var
  v,t: Longint;
begin
  t:=255-Volume.Position;
  v:=((t shl 8) or (t shl 24));
  auxsetvolume(CDDEVICE,v);
end;


end.

⌨️ 快捷键说明

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