Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Position Elemente in TImage ??? (https://www.delphipraxis.net/205512-position-elemente-timage.html)

juniorA 18. Sep 2020 08:40

Position Elemente in TImage ???
 
Liste der Anhänge anzeigen (Anzahl: 1)
Ich habe ein Formular. Auf dem Formular ist ein TImage worin ich zeichnen will. Wenn auf das Image ein Rechteck ausgeben will, beziehen sich die Koordinaten auf das Formular und nicht auf das Image. Was mach ich falsch?
Delphi-Quellcode:
unit zf;

interface

uses
  System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
  FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, FMX.StdCtrls,
  FMX.Controls.Presentation, FMX.Objects;

type
  Tzeichnung = class(TForm)
    Image1: TImage;
    Panel1: TPanel;
    Button1: TButton;
    procedure Button1Click(Sender: TObject);

  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  zeichnung: Tzeichnung;

implementation

{$R *.fmx}


procedure Tzeichnung.Button1Click(Sender: TObject);
var MyRect: TRectF;
begin
  MyRect.Create(1, 1, 150, 200);
  with zeichnung.Image1.Canvas do
  begin
    BeginScene;
    Stroke.Kind     := TBrushKind.Solid;
    Stroke.Color    := TAlphaColors.Blue;
    Stroke.Thickness := 2;
    DrawRect(MyRect, 10, 10, AllCorners, 1.0);
    EndScene
  end;
end;

end.

mkinzler 18. Sep 2020 08:50

AW: Position Elemente in TImage ???
 
Lass mal das with weg.

Delphi-Quellcode:
  c: TCanvas;
...
  c := Image1.Canvas;
  c.BeginScene;
  c.Stroke.Kind := TBrushKind.Solid;
  c.Stroke.Color := TAlphaColors.Blue;
  c.Stroke.Thickness := 2;
  c.DrawRect(MyRect, 10, 10, AllCorners, 1.0);
  c.EndScene;
Zudem sollte man sich nie auf eine bestimme Instanz beziehen (zeichnung)

juniorA 18. Sep 2020 10:01

AW: Position Elemente in TImage ???
 
Hallo,

mit den with weggelassen das verstehe ich ja noch. Aber die zweite Aussage, dass es nicht auf eine bestimmte Instanz zeigen soll, da komme ich nicht weiter. Zeichnung ist ja mein Formular, wo neben der Zeichenfläche noch andere Element wie Button und Memofelder sein sollen.
Aktuell sieht mein Button1Click wie folgt aus, wo er das Rechteck immer noch oben links im Formular und nicht im Image positioniert. :(

Delphi-Quellcode:
procedure Tzeichnung.Button1Click(Sender: TObject);
var MyRect: TRectF;
     c    : Tcanvas;
begin
  MyRect.Create(1, 1, 150, 200);
  c := Image1.Canvas;
  c.BeginScene;
  c.Stroke.Kind := TBrushKind.Solid;
  c.Stroke.Color := TAlphaColors.Blue;
  c.Stroke.Thickness := 2;
  c.DrawRect(MyRect, 10, 10, AllCorners, 1.0);
  c.EndScene;
end;

mkinzler 18. Sep 2020 10:32

AW: Position Elemente in TImage ???
 
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:

Aber die zweite Aussage, dass es nicht auf eine bestimmte Instanz zeigen soll, da komme ich nicht weiter. Zeichnung ist ja mein Formular ...
Nein, zeichnung ist eine Instanz der Formularklasse. Delphi definiert automatisch eine (Referenz)Variable für diese Klasse (ohne das T). Diese referenziert dann die automatisch erzeugt Instanz der Klasse (durch die Factory im Projekt). Es kann aber beliebig viele Instanzen dieser Klasse geben.

Delphi-Quellcode:
 Formular := TFormular.Create( Application);
 Formular := TFormular.Create( Application);
 Formular := TFormular.Create( Application);
Es gibt nun 3 Instanzen. Die Referenz zeigt auf die letzte.

Ich habe hierfür ein kleines Demo angehängt.

juniorA 18. Sep 2020 11:28

AW: Position Elemente in TImage ???
 
Danke für die Bemühungen,

muss aber gestehen, dass ich da nicht mehr mitkomme.
Bei meinen bisherigen Anwendungen, habe ich ein neues Formular aufgemacht. Dort habe ich ein TImage raufgezogen, es ausgerichtet und dann konnte ich auf dem Canvas vom Image Linien, Rechtecke und Co. mit Bezug auf den Nullpunkt des Images platzieren.
Bei FMX ist mir das leider vergönnt, da dort der Nullpunkt immer beim Ausgangspunkt landet. Wie bekomme ich es hin, dass es auch dort läuft. Gibt es da ein Beispiel?

KodeZwerg 18. Sep 2020 12:04

AW: Position Elemente in TImage ???
 
Schau Dir mal diesen C++ FMX code an.
Da wird praktisch das gemacht was Du möchtest.
Allerdings wird dort ein neues Bitmap erstellt und abschließend übernommen.
Ich hoffe so kommst Du an Dein Ziel.

himitsu 18. Sep 2020 14:22

AW: Position Elemente in TImage ???
 
Zitat:

Delphi-Quellcode:
procedure Tzeichnung.Button1Click(Sender: TObject);
begin
  with zeichnung.Image1.Canvas do

Wie kommt man bitte auf die saublöde komische Idee HIER auf die globale Variable "zeichnung" zuzugreifen?
Delphi-Quellcode:
with Image1.Canvas do

// oder wenn es sein muß, dann
with Self.Image1.Canvas do
Und sollte dir jemand wegen des WITH den Popo verhauen, dann hat er das Recht dazu.


Zitat:

Delphi-Quellcode:
MyRect.Create(1, 1, 150, 200);

Create liefert als "Ergebnis" das Gewünschte ... es ist keine "Funktion".
Delphi-Quellcode:
MyRect := TRect.Create(1, 1, 150, 200); // oder MyRect := Rect(1, 1, 150, 200)



@Die Anderen:
Macht TImage im FMX eigentlich was Ähnliches wie in der VCL?
Image1.Canvas das Canvas in der Ansicht,
aber Image1.Picture.Graphic.Canvas das Canvas des Bildes.

Und da das TImage in der VCL kein "WinControl" ist, zeichnet es auch noch auf den Canvas seines Parents, anstatt auf ein Eigenes.

juniorA 18. Sep 2020 15:01

AW: Position Elemente in TImage ???
 
aktuell bin ich bei folgender Variante
Delphi-Quellcode:
unit zf;

interface

uses
  System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
  FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, FMX.StdCtrls,
  FMX.Controls.Presentation, FMX.Objects;

type
  Tzeichnung = class(TForm)
    Image1   : TImage;
    Panel1   : TPanel;
    Button1  : TButton;
    procedure Button1Click(Sender: TObject);

  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  zeichnung: Tzeichnung;

implementation

{$R *.fmx}

procedure Tzeichnung.Button1Click(Sender: TObject);
var MyBitmap: TBitmap;
    MyRect : TRectF;
begin
  MyBitmap := TBitmap.Create(0, 0);
  try
    MyRect.Create(50, 30, 150, 200); // A record on the stack, does not Free
    MyBitmap.Assign(Image1.Bitmap);
    MyBitmap.Canvas.BeginScene;
    MyBitmap.Canvas.Stroke.Kind     := TBrushKind.Solid;
    MyBitmap.Canvas.Stroke.Color    := TAlphaColors.Black;
    MyBitmap.Canvas.Stroke.Thickness := 4;
    MyBitmap.Canvas.DrawRect(MyRect, 20, 20, AllCorners, 1.0);
    MyBitmap.Canvas.EndScene;

    // Display the result
    Image1.Bitmap := MyBitmap;
  finally
    MyBitmap.Free;
  end;
 end;
end.
leider endet die mit einer Fehlermeldung "Kein Eigentümer der Obejektsperre gefunden" :roll:

Harry Stahl 20. Sep 2020 13:41

AW: Position Elemente in TImage ???
 
Liste der Anhänge anzeigen (Anzahl: 1)
Ja, die FMX-Objekte selber haben nicht jeweils einen eigenen Canvas, sondern teilen sich den Anzeigebereich mit der Form.

Es ist der falsche Ansatz, von außen auf die Anzeige-Elemente zeichnend zuzugreifen (also hier im Button-Click-Event), da diese sich ja auch selbst zeichnen müssen, wenn man ein anderes Formular über das Anzeige-Element schiebt.

Daher besser das Painting-Event des Controls verwenden, da erhält man auch direkt den Anzeigebereich übergeben.

So funktioniert es (mit Deinem ersten Ansatz):

Delphi-Quellcode:
procedure TForm33.Image1Painting(Sender: TObject; Canvas: TCanvas; const ARect: TRectF);
var
  MyRect: TRectF;
  c : Tcanvas;
begin
  MyRect.Create(1, 1, 150, 200);
  c := canvas; //Image1.Canvas;
  c.BeginScene;
  c.Stroke.Kind := TBrushKind.Solid;
  c.Stroke.Color := TAlphaColors.Blue;
  c.Stroke.Thickness := 2;
  c.DrawRect(MyRect, 10, 10, AllCorners, 1.0);
  c.EndScene;
end;

juniorA 22. Sep 2020 14:35

AW: Position Elemente in TImage ???
 
Es funktioniert. Jugend forscht lernt nie aus. Danke für die Hilfe.


Alle Zeitangaben in WEZ +1. Es ist jetzt 05:46 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