禁用鼠标单击直到程序完成

时间:2013-09-08 06:03:11

标签: delphi delphi-xe2 firemonkey

目前我有块(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做的事,有谁知道怎么做?

由于 格伦

2 个答案:

答案 0 :(得分:3)

当然可以。首先,将您的逻辑从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;

答案 1 :(得分:0)

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

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

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