-1

わかりました、私は そのようなものをいくつかTCubes持っていますOnClick

 procedure TForm2.cubeClick(sender: TObject);
begin
  handleCubeClick(Sender);
end;

そして、次のようにHandleCubeClick

Procedure TForm2.HandleCubeClick(Sender: TObject);
var
cube:TCube;
oldCubeClick: TNotifyEvent;
begin

  try
    cube:= Sender as TCube;
      //save old hadler
        oldCubeClick := cube.OnClick;
      //clear it to disale
        cube.onclick := nil;
    if setblocks then
    begin
      label4.Text := 'cubed clicked';
      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;
      label4.Text := 'cube made: '+inttostr(totalblocks);
    end;
  finally
    //Reset handler again to enable
    cube.OnClick := OldCubeclick;
  end;
end;

したがって、立方体を左クリックすると、その上に別の立方体が作成されます。右クリックすると、OnMouseDown を介してキューブが削除されます

procedure TForm2.mouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Single; RayPos, RayDir: TVector3D);
var
  cube: Tcube;
begin
  if button = Tmousebutton.mbRight then
    begin
    cube := Sender as Tcube;
    cube.Destroy;
    end;
viewport3d1.Repaint;
end;

問題は、キューブの 1 つで同じ場所をクリックすると、OnClick イベントが発生しないため、ブロックが追加されないことです。これを修正する方法はありますか?

コメントによる編集: 現在のところ、これらはすべてグローバル変数です

  SetBlocks : boolean;
  totalblocks : integer;
  CreateCube : array[1..10000] of tcube;
  cubeData : array[1..10000] of string;

Setblocks - ユーザーが画像の 1 つをクリックすると true に設定され、ブロック上の画像の種類が設定されます。私はこれを確認しましたが、主な問題が発生したときでも setblocks は true です。

 procedure TForm2.Image1Click(Sender: TObject);
begin
 updateblocktype('Lava.bmp');
 setblocks := true;
end;

Totalblocks - 配列内の次のキューブを作成するために現在使用されている、ゲームの総ブロック数です。1 から始まり、ブロックが作成されるたびに 1 が追加されます。また、主な問題がある場合、totalblocks の値は上がりません。

-cubedata は、キューブ クラスが完全になるまで使用した簡単な方法です。画像の名前が保存されます。したがって、マップが読み込まれると、そのキューブの画像名が取得されます。したがって、cube[totalblocks] は画像 cubedata[totalblocks] を持ちます。

4

2 に答える 2

4

問題は、マウス クリックとダブル クリックの処理が壊れているように見える XE2 FMX フレームワークにあります。マウスのダブル クリック間隔よりも頻繁にクリックすると、FMX フレームワークは、特定のキューブに対する今後のすべてのクリックをダブル クリックとして扱います。

ソースコードはかなり明らかです。イベントを発生させるコードは次のとおりです。

procedure TControl3D.MouseUp3D(Button: TMouseButton; Shift: TShiftState; X, Y: Single; RayPos, RayDir: TVector3D);
begin
  if FAutoCapture then
    ReleaseCapture;
  if FPressed and not(FDoubleClick) and (FIsMouseOver) then
  begin
    FPressed := False;
    Click;
  end;
  if Assigned(FOnMouseUp) then
    FOnMouseUp(Self, Button, Shift, X, Y, RayPos, RayDir);
end;

あなたの問題はそれFDoubleClickであり、それは発砲していないTrueことを意味します。Click

十分な速さでクリックすると、フレームワークはダブルクリックを実行していると判断します。それはで起こりTControl3D.MouseDown3Dます:

if (ssDouble in Shift) then
begin
  DblClick;
  FDoubleClick := True;
end

FDoubleClickしかし、ユニット内のどこにも に設定するコードはありませんFalse。そのため、コントロールを一度ダブルクリックすると、二度とクリックできないようです! 今後のすべてのクリックは、ダブルクリックとして解釈されます。

したがって、これが事実であることを簡単に示すために、新しいキューブOnClickOnDblClickの両方をイベント ハンドラーに接続します。これは、問題に対するかなり粗雑な回避策です。FMX フレームの最新バージョンで問題が解決すると思われますが、まだ確認していません。あなたは、最新のリリースよりも品質の低い最初のリリースで作業しています。

Sertac のコメントのおかげで、XE2 update 4 で欠陥が修正されたことを確認できました。したがって、以前のバージョンを使用していると推測できます。私は個人的に XE2 アップデート 3 を使用しています。私のようにアップデート 3 からの移行を拒否している XE2 ユーザーはほとんどいないのではないでしょうか。

問題を解決するためのオプション:

  • アップデート 4 を適用します。
  • プロジェクトにコンパイルする FMX ユニットの独自のバージョンで壊れたコードを修正します。
于 2013-09-13T13:42:22.777 に答える