Delphi 禁用鼠标单击,直到过程完成

Delphi 禁用鼠标单击,直到过程完成,delphi,delphi-xe2,firemonkey,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); Cr

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

谢谢
格伦当然可以。首先,将逻辑从
CubeClick
事件移到另一个方法中。(下面的代码假定您的
多维数据集
Cube1
——如果不是,请调整它。)

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

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

当然可以。首先,将逻辑从
CubeClick
事件移到另一个方法中。(下面的代码假定您的
多维数据集
Cube1
——如果不是,请调整它。)

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

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

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

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


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

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

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


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

我在
cubeClick:=nil
cubelick:=oldccubelick
有什么想法吗?好的,我正在设置cubs
onclick
运行
CubeClick
,然后在cube中单击它告诉它运行
HandleCubeClick
,这将
CubeClick
设置为零,也许它应该将
onclick
设置为零?@DavidHeffernan我同意可见的代码不会抽取队列,但是有很多底层代码我们看不见。
TCube
的实现,许多似乎是类上的属性或方法调用。其中任何一个都可以调用
Application.ProcesMessages
。有趣的是,格伦观察到,由于肯的建议,他的行为发生了一种特殊的变化(说现在他可以很快地点击)。这强烈地暗示了在某个地方实际上有一个
ProcessMessages
调用。我希望有一个用于评论的徽章。。。但实际上他的代码帮助了我,解决了我一半的问题。也许你不会这么做,但我没有看到你的答案。@Glen-这个问题需要注意吗?如果没有,你可以奖励赏金,这样就不会得到任何赏金。否则,请尝试解释现有答案如何无法解决问题。我在
cubelick:=nil
cubelick:=oldccubelick
有什么想法吗?好的,我正在设置cubs
onclick
运行
CubeClick
,然后在cube中单击它告诉它运行
HandleCubeClick
,这将
CubeClick
设置为零,也许它应该将
onclick
设置为零?@DavidHeffernan我同意可见的代码不会抽取队列,但是有很多底层代码我们看不见。
TCube
的实现,许多似乎是类上的属性或方法调用。其中任何一个都可以调用
Application.ProcesMessages
。有趣的是,格伦观察到,由于肯的建议,他的行为发生了一种特殊的变化(说现在他可以很快地点击)。这强烈地暗示了在某个地方实际上有一个
ProcessMessages
调用。我希望有一个用于评论的徽章。。。但实际上他的代码帮助了我,解决了我一半的问题。也许你不会这么做,但我没有看到你的答案。@Glen-这个问题需要注意吗?如果没有,你可以奖励赏金,这样就不会得到任何赏金。否则,请尝试解释现有答案如何无法解决问题。