AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Position Elemente in TImage ???

Ein Thema von juniorA · begonnen am 18. Sep 2020 · letzter Beitrag vom 22. Sep 2020
Antwort Antwort
juniorA

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

Position Elemente in TImage ???

  Alt 18. Sep 2020, 09:40
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.
Miniaturansicht angehängter Grafiken
position-timage.jpg  
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.858 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: Position Elemente in TImage ???

  Alt 18. Sep 2020, 09:50
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)
Markus Kinzler
  Mit Zitat antworten Zitat
juniorA

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

AW: Position Elemente in TImage ???

  Alt 18. Sep 2020, 11:01
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;
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.858 Beiträge
 
Delphi 11 Alexandria
 
#4

AW: Position Elemente in TImage ???

  Alt 18. Sep 2020, 11:32
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.
Angehängte Dateien
Dateityp: zip Instanzen.zip (3,28 MB, 2x aufgerufen)
Markus Kinzler

Geändert von mkinzler (18. Sep 2020 um 11:47 Uhr)
  Mit Zitat antworten Zitat
juniorA

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

AW: Position Elemente in TImage ???

  Alt 18. Sep 2020, 12:28
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?
  Mit Zitat antworten Zitat
Benutzerbild von KodeZwerg
KodeZwerg

Registriert seit: 1. Feb 2018
3.691 Beiträge
 
Delphi 11 Alexandria
 
#6

AW: Position Elemente in TImage ???

  Alt 18. Sep 2020, 13:04
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.
Gruß vom KodeZwerg
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.063 Beiträge
 
Delphi 12 Athens
 
#7

AW: Position Elemente in TImage ???

  Alt 18. Sep 2020, 15:22
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:
MyRect.Create(1, 1, 150, 200);
Create liefert als "Ergebnis" das Gewünschte ... es ist keine "Funktion".
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.
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
juniorA

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

AW: Position Elemente in TImage ???

  Alt 18. Sep 2020, 16:01
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"
  Mit Zitat antworten Zitat
Benutzerbild von Harry Stahl
Harry Stahl

Registriert seit: 2. Apr 2004
Ort: Bonn
2.534 Beiträge
 
Delphi 11 Alexandria
 
#9

AW: Position Elemente in TImage ???

  Alt 20. Sep 2020, 14:41
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;
Miniaturansicht angehängter Grafiken
image.png  

Geändert von Harry Stahl (21. Sep 2020 um 00:06 Uhr)
  Mit Zitat antworten Zitat
juniorA

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

AW: Position Elemente in TImage ???

  Alt 22. Sep 2020, 15:35
Es funktioniert. Jugend forscht lernt nie aus. Danke für die Hilfe.
  Mit Zitat antworten Zitat
Antwort Antwort


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 05:36 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