2013-09-08 1 views
0

현재 블록 (3D 입방체)을 클릭 했으므로 하나를 클릭하면 그 위에 다른 블록이 생성됩니다. like so절차가 완료 될 때까지 마우스 클릭을 비활성화하십시오.

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에서 할 수있는 일인가요?

감사 글렌 물론

답변

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

''cubeClick : = nil;'및'CubeClick : = OldCubeClick; '에 "실제 매개 변수가 충분하지 않습니다"라는 오류 메시지가 나타납니다. –

+0

좋아, 그래서'CubeClick'을 실행하기 위해 새끼'onclick'을 설정하고 큐브 클릭에서'CubeClick'을 nil로 설정하는'HandleCubeClick'을 실행하도록 지시합니다. 아마도'onClick'을 nil로 설정해야합니까? –

+0

@Glen : 내 잘못. 게시 한 코드를 사용해보십시오 (첫 번째 단락의 편집 내용을 확인하십시오). –

0

당신은 확실히 OnClick을 해제 할 수 있습니다 이벤트 핸들러. 여러 가지 방법이 있지만 가장 간단한 방법은 OnClick 속성을 nil으로 설정하는 것입니다.

그러나 그렇게하면 프로그램에 영향을 미치지 않습니다. 그 이유는 OnClick 등록 정보의 값이 OnClick 이벤트 실행 중 프레임 워크에서 절대로 사용되지 않기 때문입니다. 입력 이벤트는 재입 행되지 않습니다. 그렇다면 UI 프로그램을 작성하는 것이 불가능할 것입니다. 한마디로

는 귀하의 질문에 간단한 대답을 가지고 있지만, 당신이 당신의 프로그램의 동작을 변경하지 않습니다 이벤트 처리기의 기간 동안 nilOnClick 설정 문제를 해결하는 데 도움이되지 않습니다.