【问题标题】:Disable mouse click till procedure is done禁用鼠标单击直到程序完成
【发布时间】:2013-09-08 06:03:11
【问题描述】:

目前我有块(3d 立方体),当您单击一个时,它将在其上创建另一个块。像这样

procedure TForm2.cubeClick(sender: TObject);
var
  cube: Tcube;
begin
cube := Sender as Tcube;
if setblocks then
  begin
    totalblocks := totalblocks +1 ;
    CreateCube[totalblocks]:=tcube.Create(self);
    CreateCube[totalblocks].Visible := true;
    CreateCube[totalblocks].Name := 'cubename'+inttostr(totalblocks);
    CreateCube[totalblocks].Position.x := cube.Position.X;
    CreateCube[totalblocks].Position.Y := cube.Position.y;
    CreateCube[totalblocks].Position.Z := cube.Position.Z -1;
    CreateCube[totalblocks].Material.Texture.CreateFromFile(gamedir+'\pics\'+blocktype);
    CubeData[totalblocks] := blocktype;
    CreateCube[totalblocks].Material.Lighting := false;
    CreateCube[totalblocks].Material.Modulation := TTextureMode.tmReplace;
    CreateCube[totalblocks].Parent := viewport3d1;
    CreateCube[totalblocks].OnClick := cubeClick;
    CreateCube[totalblocks].OnMouseDown := mousedown;
  end;
   label2.Text := inttostr(10000 - totalblocks);
end;

我遇到的问题是,如果我点击得足够快,它会停止添加块,不确定原因。但我想如果我可以在整个过程完成之前禁用鼠标单击,那么它会处理它。这是你可以在 firemonkey 中做的事情吗,有人知道怎么做吗?

谢谢 格伦

【问题讨论】:

    标签: delphi delphi-xe2 firemonkey


    【解决方案1】:

    当然。首先,将您的逻辑从CubeClick 事件中移到另一个方法中。 (下面的代码假定您的 CubeCube1 - 如果不是,请调整它。)

    procedure TForm2.HandleCubeClick(Sender: TObject);
    var
      cube: Tcube;
      OldCubeClick: TNotifyEvent;
    begin
      // Save old handler
      OldCubeClick := Cube1.OnClick;
      // Clear it to disable
      Cube1.OnClick := nil;
      try
        cube := Sender as Tcube;
        if setblocks then
        begin
          totalblocks := totalblocks +1 ;
          CreateCube[totalblocks]:=tcube.Create(self);
          CreateCube[totalblocks].Visible := true;
          // Rest of code here
    
        end;
      finally
        // Reset handler again to enable
        Cube1.OnClick := OldCubeClick;
      end;
    end;
    

    现在更改您的 CubeClick 事件以调用该新过程:

    procedure TForm2.CubeClick(Sender: TObject);
    begin
      HandleCubeClick(Sender);
    end;
    

    【讨论】:

    • 我在cubeClick := nil;CubeClick := OldCubeClick; 上收到错误“实际参数不足”有什么想法吗?
    • 好的,所以我将 cubs onclick 设置为运行 CubeClick 并在立方体中单击它告诉它运行 HandleCubeClickCubeClick 设置为 nil,也许它应该设置 @987654333 @ 为零?
    • @DavidHeffernan 我同意 visible 代码不会抽出队列,但是有很多底层代码对​​我们来说是不可见的。 TCube 的实现,一些似乎是类上的属性或方法调用。其中任何一个都可以调用Application.ProcesMessages。值得注意的是,由于 Ken 的建议,Glen 观察到了特定的行为变化(说现在他可以非常快地点击)。这强烈暗示实际上在某处有一个ProcessMessages 调用。
    • 我希望 cmets 有一个徽章......但他的代码真的帮助了我,解决了我的一半问题。也许这不是你会怎么做的,但我没有看到你的答案。
    • @Glen - 这个问题需要注意吗?如果没有,您可以奖励赏金,这样它就不会得到任何奖励。否则,请尝试解释现有答案如何无法解决问题。
    【解决方案2】:

    您当然可以禁用OnClick 事件处理程序。有多种方法,但最简单的方法是将OnClick 属性设置为nil

    但是,这样做不会对您的计划产生任何影响或影响。原因是在执行OnClick 事件期间,框架从未使用过OnClick 属性的值。输入事件不可重入。如果是这样,那么编写 UI 程序几乎是不可能的。

    简而言之,您的问题有一个简单的答案,但它不会帮助您解决问题。在事件处理程序期间将OnClick 设置为nil 不会改变程序的行为。

    【讨论】:

      猜你喜欢
      • 2011-07-22
      • 2012-01-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多