目前我有块(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做的事,有谁知道怎么做?
由于 格伦
答案 0 :(得分:3)
当然可以。首先,将您的逻辑从CubeClick
事件移到另一个方法中。 (下面的代码假定您的Cube
为Cube1
- 如果不是,请进行调整。)
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
不会改变程序的行为。