📄 cdmain.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 + -