【怪!】为什么我的Timer部分工作,部分却不工作?????

ExSystem 2005-07-24 05:44:37
Unit untMain;

Interface

Uses
//...
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;

Implementation

Var
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{任何数字});,他和他下面的语句就死活不执行!!!!为什么?????
...全文
406 33 打赏 收藏 转发到动态 举报
写回复
用AI写文章
33 条回复
切换为时间正序
请发表友善的回复…
发表回复
hangguojun 2005-08-06
  • 打赏
  • 举报
回复
呵呵
ExSystem 2005-08-05
  • 打赏
  • 举报
回复
<明日下午结帖>
因为上午用不了电脑:(,我老爸~~~
ExSystem 2005-08-05
  • 打赏
  • 举报
回复
问题解决了!!!!

【低级错误!】

没反应因为StdFrmMain是nil,
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 ONLY

Function InitObjs: Integer; //初始化全局对象。
Procedure UnInitObjs; //反初始化对象。

Implementation

Function 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;}
//删除!!!

Implementation

Uses
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;

// ...
ExSystem 2005-08-05
  • 打赏
  • 举报
回复
to < hangguojun(布丁) >:

那我现在没有加Application.ProcessMessage;,还是不对劲啊!现在改得就是你帖上面的那个啊,没有Application.ProcessMessage;。
hangguojun 2005-08-05
  • 打赏
  • 举报
回复
Application.ProcessMessages 好象是自循环吧

执行它后,控制权就交给系统了
ExSystem 2005-08-05
  • 打赏
  • 举报
回复
现在把它写成这样了已经:

Procedure WMOnTimer(Hande: THandle; Msg: Cardinal; IDEvent: Pointer; dwTime: DWord);
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;
opqhjb_2002 2005-08-04
  • 打赏
  • 举报
回复
先学一学DELPHI的调试方法吧!你先在程序的一些地方设置一个断点,运行程序后按F8来测试程序的执行步骤。就可以看出来是哪一步出现问题了。试试先
ExSystem 2005-08-04
  • 打赏
  • 举报
回复
还是有问题!我没时间,必须关机现在(我妈妈~~~)
ExSystem 2005-08-04
  • 打赏
  • 举报
回复
搞不懂 为什么不用TTimer呢?

..>>为了减小cpu的负担啊。。。
阿呆_ 2005-08-04
  • 打赏
  • 举报
回复
只能定义成:
procedure WMOnTimer(Hande: THandle; Msg: Cardinal; IDEvent: Pointer; dwTime: DWord); stdcall;
这种类型的全局过程

不过使用起来有点麻烦而已,你必须通过那个全局的form变量才能访问到StdFrmMain中的东东

搞不懂 为什么不用TTimer呢?
ExSystem 2005-08-04
  • 打赏
  • 举报
回复
to Idle_(阿呆):
汗!和我同时帖了

但是我把它改成全局Procedure,还是有一模一样的问题啊!!!
我知道是有个self的参数!!!
ExSystem 2005-08-04
  • 打赏
  • 举报
回复
还有:StdFrmMain.AddImgTrack.Left: Symbol was eliminated by linker

如果不用mLeft作中间变量的话,那么StdFrmMain.AddImgTrack.Left就是Inaccessible Value.
ExSystem 2005-08-04
  • 打赏
  • 举报
回复
现在的结果是这样的:
----------------------
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。还是有问题啊!!!
阿呆_ 2005-08-04
  • 打赏
  • 举报
回复
alphax(英文水皮士) 已经告诉答案了. 楼主没看见?
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调用时参数列表之上的一个堆栈数据(鬼知道是什么)

不出问题才怪
WuChenCan 2005-08-03
  • 打赏
  • 举报
回复
GFlashPlayer.TopInfo := IntToStr(GFlashPlayer.CurrentFrame);
//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;
ExSystem 2005-08-03
  • 打赏
  • 举报
回复
但是,我的AddImgTrack能够正常通过鼠标拖动改变left(我写的代码),为什么?
【注】StdFrmMain: TForm; StdFrmMain.AddImgTrack: TImage; StdFrmMain.AddShpBlack: TShape;
ExSystem 2005-08-03
  • 打赏
  • 举报
回复
现在把代码改了,还是有问题!

If uTrackIsDown = False Then
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;
ExSystem 2005-08-03
  • 打赏
  • 举报
回复
to Sunniness(逛追->理想) :

条件成立,加了Exit,但是还是没有变化。
Sunniness 2005-08-03
  • 打赏
  • 举报
回复
你在
AddImgTrack.Left:=Trunc(
GFlashPlayer.CurrentFrame/GFlashPlayer.TotalFrams*(AddShpBlack.Width-20)+20
);

这里打个断点;
在上面的判断那里看确实条件是否成立,如果成立则会执行到断点这,如果执行了,在这句话后面加个Exit,然后看有什么变化没有!
ExSystem 2005-08-03
  • 打赏
  • 举报
回复
难道没有人知道吗?
加载更多回复(13)

1,183

社区成员

发帖
与我相关
我的任务
社区描述
Delphi Windows SDK/API
社区管理员
  • Windows SDK/API社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧