-2

我有个问题。当我点击使用的按钮界面正常工作时,我想使用 xxx.click 自动完成这项工作,但它不能正常工作。有什么区别?

if pos(hexFileVersion, currentFWVersion) = 0 then
begin
  Memo1.Lines.Add('Versions are different from each other, updating...');
  btnReset.Click;
  sleep(500);
  btnCaptureTarget.Click;
  sleep(500);
  BProgram.Click;
  sleep(200);
  BResetLIA.Click;
end;
4

2 回答 2

7

如果您在单击处理程序中有代码需要在其他地方调用,那么正确的方法是将其重构为单独的方法。以编程方式单击按钮作为触发事件处理程序作为执行代码的一种手段只是一种糟糕的做法。正如其他人所指出的,您问​​题中的方法应该同样有效,但它是一种真正应该避免的编程风格。

例如,如果您有:

procedure TForm1.btnResetClick(Sender: TObject);
begin
  //
  //  here some actions are taken
  //
  //
end;

您可以重构为:

procedure TForm1.DoReset;
begin
  //
  //  here some actions are taken
  //
  //
end;

procedure TForm1.btnResetClick(Sender: TObject);
begin
  DoReset;
end;

这样,如果您需要DoReset在单击处理程序的上下文之外,您可以编写:

if pos(hexFileVersion, currentFWVersion) = 0 then begin
  Memo1.Lines.Add('Versions are different from each other, updating...');
  DoReset;      
  DoCaptureTarget;      
  DoBProgram;
  DoBResetLIA;    
end;

作为一般规则,用户界面事件处理程序应该是非常轻量级的——它们应该包含尽可能少的代码。如果业务逻辑开始渗入它们,那应该是一个强烈的信号,表明您需要整理它们。

于 2013-10-24T15:34:23.920 回答
0

目前尚不清楚在您的情况下什么“无法正常工作”。

btnReset.Click调用OnClick()OnExecute()操作是否与此按钮相关联。

但是,当您通过鼠标单击时,例如,如果分配也onMouseDown可以OnMouseUp触发。

procedure TControl.Click;
begin
  { Call OnClick if assigned and not equal to associated action's OnExecute.
    If associated action's OnExecute assigned then call it, otherwise, call
    OnClick. }
  if Assigned(FOnClick) and (Action <> nil) and (@FOnClick <> @Action.OnExecute) then
    FOnClick(Self)
  else if not (csDesigning in ComponentState) and (ActionLink <> nil) then
    ActionLink.Execute(Self)
  else if Assigned(FOnClick) then
    FOnClick(Self);
end;

也尝试Application.ProcessMessages;在每个之后插入.Click

btnReset.Click;
Application.ProcessMessages;

sleep(500);

btnCaptureTarget.Click;
Application.ProcessMessages;

sleep(500);

BProgram.Click;
Application.ProcessMessages;

sleep(200);

BResetLIA.Click;
于 2013-10-24T13:56:29.837 回答