请问各位老大,调用form1.Button1Click(self);过程和直接在Form中单击Button1完全一样吗?
我写一个基于Indy的程序时遇到问题如下:
procedure TForm1.tcpserver01Execute(AThread: TIdPeerThread);
var ......
begin
 ...
 AThread.Connection.ReadStream(TmpStream,-1, True);
  ...
 form1.Button1Click(self);//此处调用Click过程
 ...
end;
//此处是Button1的Click事件
procedure TForm1.Button1Click(Sender: TObject);
var n:integer;
begin
    //播放键盘鼠标操作消息纪录回放链
   for n:=0 to 1000 do
   begin
    EventArr[n].time:=0;
    EventArr[n].hwnd:=0;
   end;
   PlayLog:=0;
   //下面这行运行不正常
   hPlay:=SetwindowsHookEx(WH_JOURNALPLAYBACK,PlayProc,HInstance,0);
end;
发现用鼠标单击Button1时
 hPlay:=SetwindowsHookEx(WH_JOURNALPLAYBACK,PlayProc,HInstance,0);
可以正常运行,但tcpserver01Execute调用时上面语句运行不了,但其它的行可以运行,百思不得其解。
希望高手指点,必然给分

解决方案 »

  1.   

    form1.Button1Click(self);
    改为:
    form1.Button1Click(Nil);
    或者
    form1.Button1Click(form1.Button1);
      

  2.   

    多谢二楼的关注,但使用form1.Button1Click(Nil);或者form1.Button1Clickform1.Button1);
    方法都不行。
    我在procedure TForm1.Button1Click(Sender: TObject);方法最后加了一句
    memo1.Lines.Add('Done');此语句可以正常运行,但hPlay:=SetwindowsHookEx(WH_JOURNALPLAYBACK,PlayProc,HInstance,0);语句就是不执行,
    深度忧闷中.................
      

  3.   

    模拟点击也许可以
    form1.Button1.Click; //此处调用Click过程
      

  4.   

    还是这样写吧  Self.Button1.Click;
      

  5.   

    经过艰难排查,发现不是Click本身的问题,而是Button1Click过程中hPlay:=SetwindowsHookEx(WH_JOURNALPLAYBACK,PlayProc,HInstance,0);的问题,再次理清一下问题,还请各位老大帮忙:
    =====================================================================
    程序是一个基于Indy的遇到问题如下:
    1、是Indy IdTcpServer组件的Execute过程
    procedure TForm1.tcpserver01Execute(AThread: TIdPeerThread);
    var ......
    begin
     ...
     AThread.Connection.ReadStream(TmpStream,-1, True);
      ...
     form1.Button1Click(self);//此处调用Click过程
     ...
    end;
    2、//是Button1的Click事件
    procedure TForm1.Button1Click(Sender: TObject);
    var n:integer;
    begin
    ..........
       PlayLog:=0;
       //下面这行运行不正常
       hPlay:=SetwindowsHookEx(WH_JOURNALPLAYBACK,PlayProc,HInstance,0);
    end;
    3、下面是SetwindowsHookEx函数调用的PlayProc函数Function PlayProc(iCode:Integer;wParam:wParam;lParam:lParam):LRESULT;stdcall;
    begin
      canPlay:=1;
      Result:=0;
      if iCode < 0 then //必须将消息传递到消息链的下一个接受单元
      Result := CallNextHookEx(hPlay,iCode,wParam,lParam)
      else if iCode = HC_SYSMODALON then  canPlay:=0
      else if iCode = HC_SYSMODALOFF then canPlay:=1
      else if ((canPlay =1 )and(iCode=HC_GETNEXT)) then
      begin
      if bDelay then begin
      bDelay:=False;
      Result:=50;
      end;
      pEventMSG(lParam)^:=EventArr[PlayLog];
      end else if ((canPlay = 1)and(iCode = HC_SKIP))then begin
      bDelay := True;
      PlayLog:=PlayLog+1;
      end;
      if PlayLog>=EventLog then
      begin
        Form1.memo1.Lines.Add('THE END');
        UNHookWindowsHookEx(hPlay);
      end;
    end;
    问题:直接Click Button1则编号3的PlayProc函数可运行消息记录至结束,而使用
    别的程序调用的Click 编号为3的PlayProc函数只运行一次就结束。
    =======================================================================