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{任何数字});,他和他下面的语句就死活不执行!!!!为什么?????

解决方案 »

  1.   

    //  If uTrackIsDown=False Then //知道肯定是False 
    //既然确定是false,还是把上面那行注释掉试试吧。一般来说不会出现这种情况的。
      Begin
        //下面的死活不执行!!!
        AddImgTrack.Left:=Trunc(
          GFlashPlayer.CurrentFrame/GFlashPlayer.TotalFrams*(AddShpBlack.Width-20)+20
          );
        Application.ProcessMessages;
      End;
      

  2.   

    Application.ProcessMessages;
    去点看看~~
    是不是先处理了其它消息,死在那里了,就没执行下面的代码?
      

  3.   

    什么叫"死活不执行"?你单步调试检测到uTrackIsDown为false的时候也进不了下面的begin...end块?可能已经执行了,但是没有达到你的预期效果而已?
      

  4.   

    //下面的死活不执行!!!
        AddImgTrack.Left:=Trunc(在这里设个断点,看能不能执行到这里再说你也可用个 label 什么的,显示下:
    GFlashPlayer.CurrentFrame/GFlashPlayer.TotalFrams*(AddShpBlack.Width-20
    的数值,说不定,每次都一样
      

  5.   

    我的d7调试,cpu就100%
     If uTrackIsDown=False Then //知道肯定是False
      Begin
        //下面的死活不执行!!!
        AddImgTrack.Left:=Trunc(
          GFlashPlayer.CurrentFrame/GFlashPlayer.TotalFrams*(AddShpBlack.Width-20)+20
          );//这个出来的效果应该明显的,但是没看见效果阿
        GDebugObj.SendMsg('执行成功');//加了这个,也没执行到(GDebugObj是用了一个调试工具,SendMsg可以发消息给调试工具,显示出来)
        Application.ProcessMessages;
      End;
      

  6.   

    to LocustWei:这是什么意思,什么文件啊???
      

  7.   

    ??? uTimerID := SetTimer(0, 0, 1000, MethodAddress('WMOnTimer'));
    这样不行的,调用约定不同,Procedure TStdFrmMain.WMOnTimer(Hande: THandle; Msg: Cardinal; IDEvent: Pointer;
      dwTime: DWord);
    begin  //Self参数已经错了,下面的执行肯定错
      ...看看SDK的帮助
      

  8.   

    试过类似的情况,这是盗版Delphi才会有的情况.可以尝试以下方法
    1.删除EXE文件,然后重新编译
    2.把你要执行大代码写成一过程.然后调用
    3.重新安装DELPHI
      

  9.   

    to  huangmai(黄麦):3个方法都用过了(电脑也换了,彻底吧!),但是还是没用啊!
      

  10.   

    我用watch list看【AddImgTrack.Left】和【Trunc(      GFlashPlayer.CurrentFrame/GFlashPlayer.TotalFrams*(AddShpBlack.Width-20)+20);】,都显示『Inaccessible Value』怎么办啊???
      

  11.   

    你在
    AddImgTrack.Left:=Trunc(
          GFlashPlayer.CurrentFrame/GFlashPlayer.TotalFrams*(AddShpBlack.Width-20)+20
          );这里打个断点;
    在上面的判断那里看确实条件是否成立,如果成立则会执行到断点这,如果执行了,在这句话后面加个Exit,然后看有什么变化没有!
      

  12.   

    to Sunniness(逛追->理想) :条件成立,加了Exit,但是还是没有变化。
      

  13.   

    现在把代码改了,还是有问题!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;
      

  14.   

    但是,我的AddImgTrack能够正常通过鼠标拖动改变left(我写的代码),为什么?
    【注】StdFrmMain: TForm; StdFrmMain.AddImgTrack: TImage; StdFrmMain.AddShpBlack: TShape;
      

  15.   

    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;
      

  16.   

    先学一学DELPHI的调试方法吧!你先在程序的一些地方设置一个断点,运行程序后按F8来测试程序的执行步骤。就可以看出来是哪一步出现问题了。试试先
      

  17.   

    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调用时参数列表之上的一个堆栈数据(鬼知道是什么)不出问题才怪
      

  18.   

    现在的结果是这样的:
    ----------------------
    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。还是有问题啊!!!
      

  19.   

    还有:StdFrmMain.AddImgTrack.Left: Symbol was eliminated by linker如果不用mLeft作中间变量的话,那么StdFrmMain.AddImgTrack.Left就是Inaccessible Value.
      

  20.   

    to  Idle_(阿呆):
    汗!和我同时帖了但是我把它改成全局Procedure,还是有一模一样的问题啊!!!
    我知道是有个self的参数!!!
      

  21.   

    只能定义成:
    procedure WMOnTimer(Hande: THandle; Msg: Cardinal; IDEvent: Pointer; dwTime: DWord); stdcall;
    这种类型的全局过程不过使用起来有点麻烦而已,你必须通过那个全局的form变量才能访问到StdFrmMain中的东东搞不懂 为什么不用TTimer呢?
      

  22.   

    搞不懂 为什么不用TTimer呢?..>>为了减小cpu的负担啊
      

  23.   

    现在把它写成这样了已经: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;
      

  24.   

    Application.ProcessMessages 好象是自循环吧执行它后,控制权就交给系统了
      

  25.   

    to < hangguojun(布丁) >:那我现在没有加Application.ProcessMessage;,还是不对劲啊!现在改得就是你帖上面的那个啊,没有Application.ProcessMessage;。
      

  26.   

    问题解决了!!!!【低级错误!】没反应因为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 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;// ...
      

  27.   

    <明日下午结帖>
    因为上午用不了电脑:(,我老爸~~~