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. |
AW: Position Elemente in TImage ???
Lass mal das with weg.
Delphi-Quellcode:
Zudem sollte man sich nie auf eine bestimme Instanz beziehen (zeichnung)
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; |
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; |
AW: Position Elemente in TImage ???
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:
Delphi-Quellcode:
Es gibt nun 3 Instanzen. Die Referenz zeigt auf die letzte.
Formular := TFormular.Create( Application);
Formular := TFormular.Create( Application); Formular := TFormular.Create( Application); Ich habe hierfür ein kleines Demo angehängt. |
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? |
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. |
AW: Position Elemente in TImage ???
Zitat:
Delphi-Quellcode:
Und sollte dir jemand wegen des WITH den Popo verhauen, dann hat er das Recht dazu.
with Image1.Canvas do
// oder wenn es sein muß, dann with Self.Image1.Canvas do Zitat:
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. |
AW: Position Elemente in TImage ???
aktuell bin ich bei folgender Variante
Delphi-Quellcode:
leider endet die mit einer Fehlermeldung "Kein Eigentümer der Obejektsperre gefunden" :roll:
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. |
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; |
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