2013-09-08 2 views
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, кто-нибудь знает как?

Благодаря Glen

ответ

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; 
+0

Я получаю ошибку «недостаточно фактических параметров» на 'cubeClick: = nil;' и 'CubeClick: = OldCubeClick;' любая идея? –

+0

ok, поэтому я устанавливаю детенышей 'onclick' для запуска' CubeClick', а в кубе щелкнуть его, чтобы он запускал 'HandleCubeClick', который устанавливает' CubeClick' в nil, может быть, он должен установить 'onClick' в nil? –

+0

@ Glen: Моя вина. Попробуйте код, который я разместил (обратите внимание на изменения в первом абзаце). –

0

Можно, конечно, отключить OnClick обработчик события. Существует несколько способов, но самым простым является присвоение OnClick собственности nil.

Однако это не повлияет на вашу программу. Причина в том, что значение свойства OnClick никогда не используется каркасом во время выполнения события OnClick. События ввода не возвращаются. Если бы они были тогда, было бы почти невозможно писать программы пользовательского интерфейса.

Короче говоря, на ваш вопрос есть простой ответ, но это не поможет вам решить вашу проблему. Установка OnClick в nil на время вашего обработчика событий не изменит поведение вашей программы.