📄 cd.pas
字号:
unit Cd;
interface
uses
SysUtils, WinTypes, WinProcs, Messages, Classes, Graphics, Controls,
Forms, Dialogs, StdCtrls, ExtCtrls, MPlayer, Buttons,MMsystem, Cdedit, Ledcntrl,
IniFiles, ComCtrls ;
type
TCDForm = class(TForm)
CDPanel: TMediaPlayer;
Ticker: TTimer;
TrackList: TComboBox;
TimerMethod1: TSpeedButton;
TimerMethod2: TSpeedButton;
Label1: TLabel;
TrackOnce: TSpeedButton;
TrackRepeat: TSpeedButton;
TimerMethod3: TSpeedButton;
TimerMethod4: TSpeedButton;
CDOnce: TSpeedButton;
CDRepeat: TSpeedButton;
Label2: TLabel;
PowerButton: TSpeedButton;
Bevel2: TBevel;
Bevel3: TBevel;
Bevel4: TBevel;
Bevel5: TBevel;
Button1: TButton;
Bevel6: TBevel;
Shape1: TShape;
TitleOfCD: TLabel;
Artist: TLabel;
Bevel7: TBevel;
BackDisp: TShape;
Bevel1: TBevel;
OnTopButton: TSpeedButton;
MMPlay: TSpeedButton;
MMPause: TSpeedButton;
MMStop: TSpeedButton;
MMForward: TSpeedButton;
MMRewind: TSpeedButton;
MMNext: TSpeedButton;
MMPrev: TSpeedButton;
MMEject: TSpeedButton;
MoveTimer: TTimer;
Volume: TTrackBar;
procedure TickerTimer(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure TrackListClick(Sender: TObject);
procedure TrackOnceClick(Sender: TObject);
procedure TrackRepeatClick(Sender: TObject);
procedure CDOnceClick(Sender: TObject);
procedure CDRepeatClick(Sender: TObject);
procedure TimerMethod1Click(Sender: TObject);
procedure TimerMethod2Click(Sender: TObject);
procedure TimerMethod3Click(Sender: TObject);
procedure TimerMethod4Click(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure PowerButtonClick(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure FormDblClick(Sender: TObject);
procedure OnTopButtonClick(Sender: TObject);
procedure VolumeChange(Sender: TObject);
procedure FormActivate(Sender: TObject);
procedure MMPlayClick(Sender: TObject);
procedure MMPauseClick(Sender: TObject);
procedure MMStopClick(Sender: TObject);
procedure MMForwardClick(Sender: TObject);
procedure MMRewindClick(Sender: TObject);
procedure MMNextClick(Sender: TObject);
procedure MMPrevClick(Sender: TObject);
procedure MMEjectClick(Sender: TObject);
procedure MMForwardMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
procedure MMForwardMouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
procedure MoveTimerTimer(Sender: TObject);
procedure MMRewindMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
procedure MMRewindMouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
private
procedure WMSizing(var mess: TMessage); message WM_Sizing;
{ Private declarations }
public
{ Public declarations }
RealCmdShow: word;
end;
const
MAXTRACKS=99;
const
CDDEVICE=2;
const
AllowedInstances = 0;
type TrackDetail=record
TrackTitle: string[80];
TrackStart: longint;
TrackLength: longint
end;
type CDDetail=record
CDTitle: string[80];
Artist: string[80];
TotalTracks: integer;
CDLength: longint;
TrackDetail: array[1..MAXTRACKS] of TrackDetail
end;
type
CDStates=(cdOffline,cdPlaying,cdStopped,cdNotReady,cdPaused);
TimerModes=(tmTrackGone,tmTrackLeft,tmCDGone,tmCDLeft);
PlayModes=(plTrackOnce,plTrackRepeat,plCDOnce,plCDRepeat);
var
CDForm: TCDForm;
PlayerStatus: CDStates;
LastPlayerStatus: CDStates;
CurrentTrack,LoopTrack: integer;
TrackPosition,CDPosition: longint;
CurRemaining,CDRemaining: longint;
TimerMode: TimerModes;
PlayMode: PlayModes;
EndPosition: longint;
CurrentCD: CDDetail;
Disptype: integer;
OnTop: Integer;
CDKey: string;
GlobalCD: CDDetail;
MyAppName, MyClassName: array[0..255] of Char;
NumFound: Integer;
LastFound, MyPopup: HWND;
downcnt: integer;
stepgap: integer;
procedure SetButtons(CDMode: CDStates);
procedure SetTimerTrack(tim:integer;tck: integer);
procedure SetupNewCD;
procedure TurnOnLEDs;
procedure TurnOffLEDs;
procedure EnablePlayer;
procedure DisablePlayer;
procedure GotoTrack(tracknum: integer);
procedure GotoPosition(pos: longint);
procedure GetPositions;
procedure PositionDisplay;
function GetPlayerStatus: CDStates;
procedure CDOfflineTimer;
procedure CDPlayingTimer;
procedure CDNotReadyTimer;
procedure CDStoppedTimer;
procedure CDPausedTimer;
function MilliToTime(t: LongInt): string;
procedure FindCD(key: string;var ACD: CDDetail);
procedure MakeCDKey(var ACD: CDDetail;var key: string);
procedure EditCD(var EdCD: CDDetail;key: string);
function ZeroFill(size: integer;s: string): string;
procedure WriteCD(key: string;var ACD: CDDetail);
procedure CDDetails(var ACD: CDDetail;s: integer);
function GetEndPosition(tracknum: integer): longint;
procedure SetTimer(t: CDStates);
procedure UpdateTracklist(l: integer);
procedure SetVolumeScroller;
procedure SetFormCaption(s: string);
procedure preparefornewCD;
implementation
{$R *.DFM}
procedure TCDForm.WMSizing(var mess: TMessage);
type
rp=^TRect;
var
r:rp;
w,h: integer;
begin
r:=rp(mess.LParam);
h:=r.bottom-r.top;
w:=236;
case h of
0..73: begin h:=73; w:=140; end;
74..100: h:=100;
101..137: h:=137;
138..167: h:=167;
else
h:=208;
w:=264;
end;
// Left and right sizing not to do anything
if mess.WParam in [WMSZ_TOP,WMSZ_TOPLEFT,WMSZ_TOPRIGHT] then
r.top:=r.bottom-h;
if mess.WParam in [WMSZ_BOTTOM,WMSZ_BOTTOMLEFT,WMSZ_BOTTOMRIGHT] then
r.bottom:=r.top+h;
if mess.WParam in [{WMSZ_LEFT,}WMSZ_BOTTOMLEFT,WMSZ_TOPLEFT] then
r.left:=r.right-w;
if mess.WParam in [{WMSZ_RIGHT,}WMSZ_BOTTOMRIGHT,WMSZ_BOTTOMLEFT,
WMSZ_TOP,WMSZ_BOTTOM] then
r.right:=r.left+w;
if mess.WParam in [WMSZ_RIGHT] then
r.right:=r.left+w;
if mess.WParam in [WMSZ_LEFT] then
r.left:=r.right-w;
mess.Result:=1;
end;
{ Enable/Disable CDPlayer Buttons }
procedure SetButtons(CDMode: CDStates);
var
n,m: TButtonSet;
begin
n:=CDForm.CDPanel.EnabledButtons;
{ case CDMode of
CDOffline: m:=[btEject];
CDPlaying: m:=[btPause,btStop,btNext,btPrev,btStep,btBack,btEject];
CDStopped: m:=[btPlay,btEject];
CDNotReady:m:=[btEject];
CDPaused: m:=[btPause,btStop,btEject];
end; }
with CDForm do
case CDMode of
CDOffLine, CDNotReady: begin
MMPlay.Enabled:=False; MMPause.Enabled:=False;
MMStop.Enabled:=False; MMForward.Enabled:=False;
MMRewind.Enabled:=False; MMNext.Enabled:=False;
MMPrev.Enabled:=False; MMEject.Enabled:=True;
end;
CDPlaying: begin
MMPlay.Enabled:=True; MMPlay.Down:=True;
MMPause.Enabled:=True;
MMStop.Enabled:=True; MMForward.Enabled:=True;
MMRewind.Enabled:=True; MMNext.Enabled:=True;
MMPrev.Enabled:=True; MMEject.Enabled:=True;
end;
CDStopped: begin
MMPlay.Enabled:=True; MMPause.Enabled:=False;
MMStop.Enabled:=False; MMForward.Enabled:=False;
MMRewind.Enabled:=False; MMNext.Enabled:=False;
MMPrev.Enabled:=False; MMEject.Enabled:=True;
end;
CDPaused: begin
MMPlay.Enabled:=True; MMPause.Enabled:=True;
MMPause.Down:=True;
MMStop.Enabled:=True; MMForward.Enabled:=True;
MMRewind.Enabled:=True; MMNext.Enabled:=False;
MMPrev.Enabled:=False; MMEject.Enabled:=True;
end;
end;
{ Only alter the buttons if the new setting is different -
this stops flickering }
if n<>m then CDForm.CDPanel.EnabledButtons:=m;
end;
procedure SetTimerTrack(tim:integer;tck: integer);
var
minutes,seconds: integer;
m,s,t: string[2];
begin
t:=zerofill(2,inttostr(tck));
// CDForm.Track.Enabled:=True;
// CDForm.Track.Display:=t;
minutes:=tim div 60;
seconds:=tim -(minutes*60);
m:=zerofill(2,inttostr(minutes));
s:=zerofill(2,inttostr(seconds));
// CDForm.TimeDisp.Display:=m + '.' + s ;
{ Application.Title:='CD Player:'+t +
' ' + m+ '.' + s; }
{ Application.Title:='CD Player:'+t +
' ' + m+ '.' + s + ' ' + Copy(CDForm.TrackList.Text, Pos(')',
CDForm.TrackList.Text) + 2, 100) ; // Greg Lief 1/2/97 }
Application.Title:='CD Player:'+t+' ' + m+ '.' + s+' '+
CurrentCD.TrackDetail[CurrentTrack].TrackTitle; // Slightly better way
end;
procedure SetupNewCD;
var
lp: integer;
begin
{ Get the total number of tracks for the new CD, And update the display }
CDForm.CDPanel.Timeformat:=tfMilliseconds;
CurrentCD.TotalTracks:=CDForm.CDPanel.Tracks;
{ Get the Total length of the CD}
CurrentCD.CDLength:=CDForm.CDPanel.Length;
{ Clear the Track List, then store track information }
for lp:=1 to CurrentCD.TotalTracks do
begin
CurrentCD.TrackDetail[lp].TrackStart:=CDForm.CDPanel.TrackPosition[lp];
CurrentCD.TrackDetail[lp].TrackLength:=CDForm.CDPanel.TrackLength[lp];
CurrentCD.TrackDetail[lp].TrackTitle:='';
end;
{ Get the current CDs Key }
MakeCDKey(CurrentCD,CDKey);
FindCD(CDKey,CurrentCD);
CDDetails(CurrentCD,1);
// Update the display
SetTimerTrack(CurrentCD.CDLength Div 1000,CurrentCD.TotalTracks);
{ Initialise the TrackList TrackName, This will change if the
CD is currently playing }
CurrentTrack:=1;
UpdateTrackList(1);
end;
{ Set all the LEDs to On 0's }
procedure TurnOnLEDs;
begin
// CDForm.Track.Enabled:=True;
// CDForm.TimeDisp.Enabled:=True;
end;
{ Set all the LEDs to Off 0's }
procedure TurnOffLEDs;
begin
// CDForm.Track.Enabled:=False;
// CDForm.TimeDisp.Enabled:=False;
end;
{ Activate all controls etc.. }
procedure EnablePlayer;
begin
TurnOnLEDs;
CDForm.CDPanel.Enabled:=True;
CDForm.Tracklist.Enabled:=True;
CDForm.Button1.Enabled:=True
end;
procedure SetDisp(d: integer);
begin
with CDForm do
begin
// Track.DisplayType:=d;
// TimeDisp.DisplayType:=d;
if d=0 then
begin
// Green on black displays
BackDisp.Brush.Color:=clBlack;
Shape1.Pen.Color:=clBlack;
Shape1.Brush.Color:=clBlack;
TitleOfCD.Color:=clBlack;
TitleOfCD.Font.Color:=clLime;
Artist.Color:=clBlack;
Artist.Font.Color:=clLime;
TrackList.Color:=clBlack;
TrackList.Font.Color:=clLime;
end else
begin
// Black on silver displays (LCD ish)
BackDisp.Brush.Color:=clSilver;
Shape1.Pen.Color:=clSilver;
Shape1.Brush.Color:=clSilver;
TitleOfCD.Color:=clSilver;
TitleOfCD.Font.Color:=clBlack;
Artist.Color:=clSilver;
Artist.Font.Color:=clBlack;
TrackList.Color:=clSilver;
TrackList.Font.Color:=clBlack;
end;
end;
end;
{ Deactivate all controls etc.. }
procedure DisablePlayer;
begin
TurnOffLeds;
Setbuttons(CDOffline);
// CDForm.CDPanel.Enabled:=False;
CDDetails(CurrentCD,0);
CDForm.Tracklist.Enabled:=False;
CDForm.Button1.Enabled:=False;
SetFormCaption('');
CDKey:='';
end;
{ Goto a specified Track Number }
procedure GotoTrack(tracknum: integer);
begin
if (tracknum<=CurrentCD.TotalTracks) and (tracknum>0) then
GotoPosition(CurrentCD.TrackDetail[tracknum].TrackStart);
end;
{ Goto a specified position }
procedure GotoPosition(pos: longint);
begin
if CDForm.CDPanel.Mode=mpPlaying then
begin
CDForm.CDPanel.Pause;
CDForm.CDPanel.Position:=pos;
CDForm.CDPanel.Resume;
end else
CDForm.CDPanel.Position:=pos;
end;
{ Get all the current positions of the CD Player }
procedure GetPositions;
var
lp: integer;
begin
{ Get the Current Position }
CDPosition:=CDForm.CDPanel.Position;
{ Get the current Track - I might lose this as EndPosition
allows me to determine the Current Track }
for lp:=1 to CurrentCD.TotalTracks do
if CDPosition>=CurrentCD.TrackDetail[lp].TrackStart then
CurrentTrack:=lp ;
{ Get Position within track }
TrackPosition:=CDPosition -
CurrentCD.TrackDetail[CurrentTrack].TrackStart;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -