Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Firemonkey welches Objekt (https://www.delphipraxis.net/202767-firemonkey-welches-objekt.html)

juniorA 6. Dez 2019 09:06

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?

juniorA 6. Dez 2019 09:09

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.

ZYLAGON 6. Dez 2019 21:57

AW: Firemonkey welches Objekt
 
Du könntest die gewünschte Änderung der Kugeln über deren OnClick-Eigenschaft realisieren.

VG ZYL

juniorA 7. Dez 2019 07:50

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.

ZYLAGON 7. Dez 2019 11:25

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

juniorA 7. Dez 2019 13:17

AW: Firemonkey welches Objekt
 
Danke. Funktioniert bestens aber wie komme ich jetzt an meine Kugel?

ZYLAGON 7. Dez 2019 14:19

AW: Firemonkey welches Objekt
 
Beispielsweise mit Hilfe des Sender-Objekts und der Tag-Eigenschaft:

Delphi-Quellcode:
CubeTag := TCube(Sender).Tag;

VG ZYL

juniorA 7. Dez 2019 15:03

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?

ZYLAGON 7. Dez 2019 15:31

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:
XK := Cube[CubeTag].Position.X
kommst Du an die X-Koordinate des gedrückten Cubes.

VG ZYL

juniorA 7. Dez 2019 15:39

AW: Firemonkey welches Objekt
 
Danke es funktioniert.


Alle Zeitangaben in WEZ +1. Es ist jetzt 12:43 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz