Unit untMain;InterfaceUses
//...
Type
TStdFrmMain = Class(TForm)
// ...
ExbBtnPlayerPlay: TdxBarLargeButton;
ExbBtnPlayerPause: TdxBarLargeButton;
ExbBtnPlayerStop: TdxBarLargeButton;
Procedure WMOnTimer(Hande: THandle; Msg: Cardinal; IDEvent: Pointer;
dwTime: DWord); Stdcall;
Private
{ Private declarations }
Public
{ Public declarations }
End;Var
StdFrmMain: TStdFrmMain;ImplementationVar
uTimerID: UINT;Procedure TStdFrmMain.WMOnTimer(Hande: THandle; Msg: Cardinal; IDEvent: Pointer;
dwTime: DWord);
Begin
GFlashPlayer.TopInfo := IntToStr(GFlashPlayer.CurrentFrame);
Application.ProcessMessages;
//上面的都执行到了 If uTrackIsDown=False Then //知道肯定是False
Begin
//下面的死活不执行!!!
AddImgTrack.Left:=Trunc(
GFlashPlayer.CurrentFrame/GFlashPlayer.TotalFrams*(AddShpBlack.Width-20)+20
);
Application.ProcessMessages;
End;
End;Procedure TStdFrmMain.ExbBtnPlayerPlayClick(Sender: TObject);
Begin
GFlashPlayer.Play;
GFlashPlayer.TopInfo := '播放';
UpdateUI;
uTimerID := SetTimer(0, 0, 1000, MethodAddress('WMOnTimer'));
End;Procedure TStdFrmMain.ExbBtnPlayerPauseClick(Sender: TObject);
Begin
KillTimer(0, uTimerID);
GFlashPlayer.Pause;
GFlashPlayer.TopInfo := '暂停';
UpdateUI;
End;Procedure TStdFrmMain.ExbBtnPlayerStopClick(Sender: TObject);
Begin
KillTimer(0, uTimerID);
GFlashPlayer.Stop;
GFlashPlayer.TopInfo := '停止';
UpdateUI;
End;End.----
还有只要有AddImgXXX{是个TImage}.Left:=Trunc(YYY{任何数字});,他和他下面的语句就死活不执行!!!!为什么?????
//...
Type
TStdFrmMain = Class(TForm)
// ...
ExbBtnPlayerPlay: TdxBarLargeButton;
ExbBtnPlayerPause: TdxBarLargeButton;
ExbBtnPlayerStop: TdxBarLargeButton;
Procedure WMOnTimer(Hande: THandle; Msg: Cardinal; IDEvent: Pointer;
dwTime: DWord); Stdcall;
Private
{ Private declarations }
Public
{ Public declarations }
End;Var
StdFrmMain: TStdFrmMain;ImplementationVar
uTimerID: UINT;Procedure TStdFrmMain.WMOnTimer(Hande: THandle; Msg: Cardinal; IDEvent: Pointer;
dwTime: DWord);
Begin
GFlashPlayer.TopInfo := IntToStr(GFlashPlayer.CurrentFrame);
Application.ProcessMessages;
//上面的都执行到了 If uTrackIsDown=False Then //知道肯定是False
Begin
//下面的死活不执行!!!
AddImgTrack.Left:=Trunc(
GFlashPlayer.CurrentFrame/GFlashPlayer.TotalFrams*(AddShpBlack.Width-20)+20
);
Application.ProcessMessages;
End;
End;Procedure TStdFrmMain.ExbBtnPlayerPlayClick(Sender: TObject);
Begin
GFlashPlayer.Play;
GFlashPlayer.TopInfo := '播放';
UpdateUI;
uTimerID := SetTimer(0, 0, 1000, MethodAddress('WMOnTimer'));
End;Procedure TStdFrmMain.ExbBtnPlayerPauseClick(Sender: TObject);
Begin
KillTimer(0, uTimerID);
GFlashPlayer.Pause;
GFlashPlayer.TopInfo := '暂停';
UpdateUI;
End;Procedure TStdFrmMain.ExbBtnPlayerStopClick(Sender: TObject);
Begin
KillTimer(0, uTimerID);
GFlashPlayer.Stop;
GFlashPlayer.TopInfo := '停止';
UpdateUI;
End;End.----
还有只要有AddImgXXX{是个TImage}.Left:=Trunc(YYY{任何数字});,他和他下面的语句就死活不执行!!!!为什么?????
//既然确定是false,还是把上面那行注释掉试试吧。一般来说不会出现这种情况的。
Begin
//下面的死活不执行!!!
AddImgTrack.Left:=Trunc(
GFlashPlayer.CurrentFrame/GFlashPlayer.TotalFrams*(AddShpBlack.Width-20)+20
);
Application.ProcessMessages;
End;
去点看看~~
是不是先处理了其它消息,死在那里了,就没执行下面的代码?
AddImgTrack.Left:=Trunc(在这里设个断点,看能不能执行到这里再说你也可用个 label 什么的,显示下:
GFlashPlayer.CurrentFrame/GFlashPlayer.TotalFrams*(AddShpBlack.Width-20
的数值,说不定,每次都一样
If uTrackIsDown=False Then //知道肯定是False
Begin
//下面的死活不执行!!!
AddImgTrack.Left:=Trunc(
GFlashPlayer.CurrentFrame/GFlashPlayer.TotalFrams*(AddShpBlack.Width-20)+20
);//这个出来的效果应该明显的,但是没看见效果阿
GDebugObj.SendMsg('执行成功');//加了这个,也没执行到(GDebugObj是用了一个调试工具,SendMsg可以发消息给调试工具,显示出来)
Application.ProcessMessages;
End;
这样不行的,调用约定不同,Procedure TStdFrmMain.WMOnTimer(Hande: THandle; Msg: Cardinal; IDEvent: Pointer;
dwTime: DWord);
begin //Self参数已经错了,下面的执行肯定错
...看看SDK的帮助
1.删除EXE文件,然后重新编译
2.把你要执行大代码写成一过程.然后调用
3.重新安装DELPHI
AddImgTrack.Left:=Trunc(
GFlashPlayer.CurrentFrame/GFlashPlayer.TotalFrams*(AddShpBlack.Width-20)+20
);这里打个断点;
在上面的判断那里看确实条件是否成立,如果成立则会执行到断点这,如果执行了,在这句话后面加个Exit,然后看有什么变化没有!
Begin
mLeft:= Trunc
(
GFlashPlayer.CurrentFrame / GFlashPlayer.TotalFrams *
(AddShpBlack.Width-20)
)+10;
//Watches列表里面说【StdFrmMain.AddImgTrack.Left: Symbol was eliminated by linker】
//Watches列表里面说【StdFrmMain.AddShpBlack.Width:Inaccessible Value】
GDebugObj.SendMsg(IntToStr(mLeft));
AddImgTrack.Left:= mLeft;
AddImgTrack.Invalidate;
Exit;
End;
【注】StdFrmMain: TForm; StdFrmMain.AddImgTrack: TImage; StdFrmMain.AddShpBlack: TShape;
//Application.ProcessMessages; //把这句注释掉看看可能是转到其他消息去执行了。
//上面的都执行到了 showmessage('a');
If uTrackIsDown=False Then //知道肯定是False
Begin
//下面的死活不执行!!!
AddImgTrack.Left:=Trunc(
GFlashPlayer.CurrentFrame/GFlashPlayer.TotalFrams*(AddShpBlack.Width-20)+20
);
Application.ProcessMessages;
showmssage('uTrackIsDown=False');//看会不会执行这句。 End;
End;
Class的Method实际运行时需要的参数比你参数列表中列出来的多一个Procedure TStdFrmMain.WMOnTimer(Hande: THandle; Msg: Cardinal; IDEvent: Pointer; dwTime: DWord);
这个方法和普通过程:
Procedure WMOnTimer(Self: TObject; Hande: THandle; Msg: Cardinal; IDEvent: Pointer; dwTime: DWord);
是一样的.
知道问题出哪了吗?由windows 定时器调用时只传了Handle, Msg, IDEvent和dwTime这几个参数, 到你的方法中就变成了:
Self = windows传递的Handle
Handle = windows传递的Msg
Msg = windows传递的IDEvent
IDEvent = windows传递的dwTime
dwTime = windows调用时参数列表之上的一个堆栈数据(鬼知道是什么)不出问题才怪
----------------------
Procedure TStdFrmMain.WMOnTimer(Hande: THandle; Msg: Cardinal; IDEvent: Pointer;
dwTime: DWord);
Var
mLeft: Integer;
Begin
GFlashPlayer.TopInfo := IntToStr(GFlashPlayer.CurrentFrame); //这里设置的断点! If uTrackIsDown = False Then
Begin
mLeft:= Trunc //执行了(F8的时候有绿色的箭头)
(
GFlashPlayer.CurrentFrame / GFlashPlayer.TotalFrams *
(AddShpBlack.Width-20)
)+10;
AddImgTrack.Left:=mLeft;
Application.ProcessMessages;
ShowMessage('uTrackIsDown=False');//看会不会执行这句。【答:没有!】
Exit; //再F8,箭头直接到这里了
End;
End;Watch里面看mLeft说是等于2010246339,太不正常了!后来(Paused时)把鼠标移到AddShpBlack.Width,说=Inaccessible Value。还是有问题啊!!!
汗!和我同时帖了但是我把它改成全局Procedure,还是有一模一样的问题啊!!!
我知道是有个self的参数!!!
procedure WMOnTimer(Hande: THandle; Msg: Cardinal; IDEvent: Pointer; dwTime: DWord); stdcall;
这种类型的全局过程不过使用起来有点麻烦而已,你必须通过那个全局的form变量才能访问到StdFrmMain中的东东搞不懂 为什么不用TTimer呢?
Stdcall;
Begin
StdFrmMain.DoOnTimer;
End;Procedure TStdFrmMain.DoOnTimer;
Begin
GFlashPlayer.TopInfo := IntToStr(GFlashPlayer.CurrentFrame); If uTrackIsDown = False Then
Begin
ShowMessage('uTrackIsDown=False'); //弹出来了
AddImgTrack.Left:=Trunc
(
GFlashPlayer.CurrentFrame / GFlashPlayer.TotalFrams *
(AddShpBlack.Width-20)
)+10;
// AddImgTrack.Left=Inaccessible value !!!
// AddShpBlack.Width=Inaccessible value !!!
ShowMessage('second uTrackIsDown=False'); //没有弹出来!!!
Exit;
End;
End;
StdFrmMain之所以为nil,因为根本没有Create过!
//---untGlobalObjects.pas------Uses
SysUtils, Forms, untTCustomFlashPlayer, untTSettings, untTPlayList,
untTVolume, untMain,
csIntf; //DEBUG ONLY
Var
GFlashPlayer: TCustomFlashPlayer = Nil; //TCustomFlashPlayer类的对象。
GSettings: TSettings = Nil; //TSettings类的对象。
GPlayList: TPlayList = Nil; //TPlayList类的对象。
GVolume: TVolume = Nil; //TVolume类的对象。 GMainForm: TStdFrmMain = Nil; //TMainForm的对象。
// !!!这里!!!! GDebugObj: TCSObject = Nil; //DEBUG ONLYFunction InitObjs: Integer; //初始化全局对象。
Procedure UnInitObjs; //反初始化对象。ImplementationFunction InitObjs: Integer;
Var
SettingsURL: String;
Begin
Result := 0; SettingsURL := ExtractFilePath(Application.ExeName) + 'Settings\Settings.ini';
If SettingsURL = '' Then
Result := 1; //如果文件不存在则返回错误代码:1。
GSettings := TSettings.Create(SettingsURL); Application.CreateForm(TStdFrmMain, GMainForm);
GFlashPlayer := TCustomFlashPlayer.Create(GSettings, GMainForm.ExbDkpPlayer); GPlayList := TPlayList.Create(GFlashPlayer, GSettings);
GVolume := TVolume.Create; GDebugObj := TCSObject.Create(Nil); //DEBUG ONLY
End;//...//----prjPowerFlashPlayer.dpr----Program prjPowerFlashPlayer;Uses
Forms,
untMain In 'untMain.pas' {StdFrmMain},
untTVolume In 'untTVolume.pas',
untTCustomFlashPlayer In 'untTCustomFlashPlayer.pas',
untTSettings In 'untTSettings.pas',
untTFileInfo In 'untTFileInfo.pas',
untTPlayList In 'untTPlayList.pas',
untFileAssociation In 'untFileAssociation.pas',
untGlobalObjects In 'untGlobalObjects.pas',
untOpen In 'untOpen.pas' {StdFrmOpen};{$R *.res}Begin
Application.Initialize;
Try
InitObjs; // !!! 调用了它
Application.Title := 'iPowerFlashPlayer v2.0';
Application.Run;
Finally
UnInitObjs;
End;
End.//-----untMain.pas-------//...{Var
StdFrmMain: TStdFrmMain;}
//删除!!! ImplementationUses
untGlobalObjects, untOpen; //!!!!!Var
// ...{$R *.dfm}Procedure WMOnTimer(Hande: THandle; Msg: Cardinal; IDEvent: Pointer; dwTime: DWord); Stdcall;
Begin
//StdFrmMain.DoOnTimer;
GFlashPlayer.TopInfo := IntToStr(GFlashPlayer.CurrentFrame); If uTrackIsDown = False Then
Begin
GMainForm.AddImgTrack.Left:=Trunc
(
GFlashPlayer.CurrentFrame / GFlashPlayer.TotalFrams *
(GMainForm.AddShpBlack.Width-200)
)+10; //mLeft;
GMainForm.AddImgTrack.Invalidate;
// 应该是GMainForm!!!不是StdFrmMain!!!被ide给骗了!!!
// StdFrmMain更本没Create过!!!
End;
End;// ...
因为上午用不了电脑:(,我老爸~~~