0

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

谢谢格伦

4

2 回答 2

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;
于 2013-09-08T06:13:07.543 回答
0

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

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

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

于 2013-09-13T17:03:18.283 回答