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