AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

Firemonkey welches Objekt

Ein Thema von juniorA · begonnen am 6. Dez 2019 · letzter Beitrag vom 7. Dez 2019
Antwort Antwort
juniorA

Registriert seit: 14. Sep 2011
112 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#1

Firemonkey welches Objekt

  Alt 6. Dez 2019, 09:06
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?
Miniaturansicht angehängter Grafiken
welche_kugel.jpg  
  Mit Zitat antworten Zitat
juniorA

Registriert seit: 14. Sep 2011
112 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#2

AW: Firemonkey welches Objekt

  Alt 6. Dez 2019, 09:09
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.
  Mit Zitat antworten Zitat
ZYLAGON

Registriert seit: 11. Nov 2015
49 Beiträge
 
Delphi 10.3 Rio
 
#3

AW: Firemonkey welches Objekt

  Alt 6. Dez 2019, 21:57
Du könntest die gewünschte Änderung der Kugeln über deren OnClick-Eigenschaft realisieren.

VG ZYL
  Mit Zitat antworten Zitat
juniorA

Registriert seit: 14. Sep 2011
112 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#4

AW: Firemonkey welches Objekt

  Alt 7. Dez 2019, 07:50
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.
  Mit Zitat antworten Zitat
ZYLAGON

Registriert seit: 11. Nov 2015
49 Beiträge
 
Delphi 10.3 Rio
 
#5

AW: Firemonkey welches Objekt

  Alt 7. Dez 2019, 11:25
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
  Mit Zitat antworten Zitat
juniorA

Registriert seit: 14. Sep 2011
112 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#6

AW: Firemonkey welches Objekt

  Alt 7. Dez 2019, 13:17
Danke. Funktioniert bestens aber wie komme ich jetzt an meine Kugel?
  Mit Zitat antworten Zitat
ZYLAGON

Registriert seit: 11. Nov 2015
49 Beiträge
 
Delphi 10.3 Rio
 
#7

AW: Firemonkey welches Objekt

  Alt 7. Dez 2019, 14:19
Beispielsweise mit Hilfe des Sender-Objekts und der Tag-Eigenschaft:

CubeTag := TCube(Sender).Tag;
VG ZYL
  Mit Zitat antworten Zitat
juniorA

Registriert seit: 14. Sep 2011
112 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#8

AW: Firemonkey welches Objekt

  Alt 7. Dez 2019, 15:03
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?
  Mit Zitat antworten Zitat
ZYLAGON

Registriert seit: 11. Nov 2015
49 Beiträge
 
Delphi 10.3 Rio
 
#9

AW: Firemonkey welches Objekt

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

VG ZYL
  Mit Zitat antworten Zitat
juniorA

Registriert seit: 14. Sep 2011
112 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#10

AW: Firemonkey welches Objekt

  Alt 7. Dez 2019, 15:39
Danke es funktioniert.
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:53 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