![]() |
Firemonkey welches Objekt
Liste der Anhänge anzeigen (Anzahl: 1)
Wie bekommt man mit, über welchen Objekt der Cursor gerade steht. Problem: Ich lege zu Laufzeit Kugeln auf ein Grundgitter, was ich im Raum drehen kann. Jetzt will ich mit der linken Maus auf eine der Kugeln rasten um diese zu ändern. Wie komme ich da ran? Wie komme ich von den 2D Cursorkoordinaten, an die richtige Kugel die sich im Raum befindet?
|
AW: Firemonkey welches Objekt
Delphi-Quellcode:
//----------------------------------------------------------------------------------------------------------------------------------
// Grundbildschirm //---------------------------------------------------------------------------------------------------------------------------------- unit pB_main; interface uses System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants, FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, FMX.Viewport3D, System.Math.Vectors, FMX.Controls3D, FMX.Objects3D, FMX.Controls.Presentation, FMX.StdCtrls; type THaupt_Form = class(TForm) Viewport_3D : TViewport3D; Model_3D : TModel3D; Grundraster : TGrid3D; Status_Zeile : TStatusBar; Panel_XY : TPanel; Text_XY_Pos : TLabel; Zoom_panel : TPanel; Zoom_Label : TLabel; TrackBar_Zoom: TTrackBar; procedure Viewport_3DMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Single); procedure Viewport_3DMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Single); procedure Viewport_3DMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Single); procedure FormActivate(Sender: TObject); procedure TrackBar_ZoomTracking(Sender: TObject); procedure Viewport_3DMouseWheel(Sender: TObject; Shift: TShiftState; WheelDelta: Integer; var Handled: Boolean); procedure FormClose(Sender: TObject; var Action: TCloseAction); private { Private-Deklarationen } public { Public-Deklarationen } Down_Pos : TPointF; Mouse_Down: Boolean; end; type kugel = record huelle : TSphere; name : string; end; var Haupt_Form : THaupt_Form; kugel_feld : array of kugel; implementation {$R *.fmx} // Initialisierung procedure THaupt_Form.FormActivate(Sender: TObject); var i : integer; begin Grundraster.HitTest := false; // Kugeln setzen Viewport_3D.BeginUpdate; for i := 0 to 9 do begin setlength(kugel_feld, succ(length(kugel_feld))); kugel_feld[pred(length(kugel_feld))].huelle := tsphere.Create(self); kugel_feld[pred(length(kugel_feld))].huelle.Parent := grundraster; kugel_feld[pred(length(kugel_feld))].huelle.Position.x := 1; kugel_feld[pred(length(kugel_feld))].huelle.Position.y := i; kugel_feld[pred(length(kugel_feld))].huelle.Width := 1; kugel_feld[pred(length(kugel_feld))].huelle.Height := 1; kugel_feld[pred(length(kugel_feld))].huelle.Repaint; kugel_feld[pred(length(kugel_feld))].name := inttostr(i); end; Viewport_3D.endUpdate; Viewport_3D.Repaint; end; procedure THaupt_Form.FormClose(Sender: TObject; var Action: TCloseAction); var i : integer; begin for i := 0 to pred(length(kugel_feld)) do kugel_feld[i].huelle.Free; end; procedure THaupt_Form.TrackBar_ZoomTracking(Sender: TObject); begin Model_3D.Scale.X := TrackBar_Zoom.value; Model_3D.Scale.Y := TrackBar_Zoom.value; Model_3D.Scale.Z := TrackBar_Zoom.value; end; procedure THaupt_Form.Viewport_3DMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Single); begin Down_Pos := PointF(X, Y); Mouse_Down := True; end; procedure THaupt_Form.Viewport_3DMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Single); begin if (ssLeft in Shift) and (Mouse_Down) then begin Model_3D.RotationAngle.X := Model_3D.RotationAngle.X - ((Y - Down_Pos.Y) * 0.25); Model_3D.RotationAngle.Y := Model_3D.RotationAngle.Y + ((X - Down_Pos.X) * 0.25); Down_Pos := PointF(X, Y); end; Text_XY_Pos.Text := 'XY Pos ' + floattostr(X) + '/' + floattostr(y); end; procedure THaupt_Form.Viewport_3DMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Single); begin Mouse_Down := false; end; procedure THaupt_Form.Viewport_3DMouseWheel(Sender: TObject; Shift: TShiftState; WheelDelta: Integer; var Handled: Boolean); begin begin if WheelDelta < 0 then TrackBar_Zoom.value := TrackBar_Zoom.value - 0.1 else TrackBar_Zoom.value := TrackBar_Zoom.value + 0.1; Model_3D.Scale.X := TrackBar_Zoom.value; Model_3D.Scale.Y := TrackBar_Zoom.value; Model_3D.Scale.Z := TrackBar_Zoom.value; end; end; end. |
AW: Firemonkey welches Objekt
Du könntest die gewünschte Änderung der Kugeln über deren OnClick-Eigenschaft realisieren.
VG ZYL |
AW: Firemonkey welches Objekt
Kling erst einmal gut.
Wo ich aber noch auf dem Schlauch stehe, wie ich an das OnClick Ereignis der Kugel herankomme, da die Kugel erst zu Laufzeit erstellt wird. Muss gestehen ich bin nicht so tief in der Materie. Ein Ereignis von einem Objekt ändern, was am Anfang schon da ist, ist kein Problem aber wenn es erst zur Laufzeit erzeugt wird, da verließen sie mich. |
AW: Firemonkey welches Objekt
Hier mal ein Beispiel:
Delphi-Quellcode:
procedure Txxx.OnClick(Sender:TObject);
begin // end;
Delphi-Quellcode:
//Cube
for i:=Low(Cube) to High(Cube) do begin Cube[i]:=TCube.Create(nil); Cube[i].Parent:=Dummy; Cube[i].Tag:=i; Cube[i].MaterialSource:=TMS_Cu; Cube[i].Width:=2; Cube[i].Height:=0.1; Cube[i].Depth:=2; Cube[i].OnClick:=OnClick; end; VG ZYL |
AW: Firemonkey welches Objekt
Danke. Funktioniert bestens aber wie komme ich jetzt an meine Kugel?
|
AW: Firemonkey welches Objekt
Beispielsweise mit Hilfe des Sender-Objekts und der Tag-Eigenschaft:
Delphi-Quellcode:
CubeTag := TCube(Sender).Tag;
VG ZYL |
AW: Firemonkey welches Objekt
so richtig komme ich damit leider noch nicht weiter.
Was ich Suche ist z.B. die Position der Kugel die gerade rastet wurde. Bei CubeTag := TCube(Sender).Tag bekommen ich immer 0 wenn cubetag den Typ longint hat oder liegt hier der Fehler? |
AW: Firemonkey welches Objekt
Ja, CubeTag soll einfach nur eine Integer-Variable sein, um sich den Tag (also in unserem Fall einfach die Nummer) des gedrückten Cubes zu merken.
Dass Du immer den Wert '0' erhälst liegt daran, dass Du den Cubes keine Tags zugewiesen hast. Siehe in meinem ersten Post wie ich das gemacht habe (Cube 1 bekommt Tag '1', Cube 2 bekommt Tag '2', usw.). Mit
Delphi-Quellcode:
kommst Du an die X-Koordinate des gedrückten Cubes.
XK := Cube[CubeTag].Position.X
VG ZYL |
AW: Firemonkey welches Objekt
Danke es funktioniert.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:49 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz