AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

FMX Linie "wegzeichnen"

Ein Thema von Schorschi5566 · begonnen am 3. Jun 2012 · letzter Beitrag vom 7. Jun 2012
Antwort Antwort
Schorschi5566

Registriert seit: 6. Feb 2006
197 Beiträge
 
Delphi 10.2 Tokyo Enterprise
 
#1

FMX Linie "wegzeichnen"

  Alt 3. Jun 2012, 09:33
Hallo Gemeinde,

klingt vielleicht trivial aber es gelingt mir derzeit nicht in einem FMX-TImage eine mit beispielsweise claRed gemalte Linie wieder rückstandsfrei zu entfernen. (Drübermalen mit einer anderen Farbe/Linienstärke) funktioniert, außer mit claNull=Transparent )

Einen DrawMode wie XOR gibt es scheinbar nicht und die Canvas-Funktion ClearRect löscht den ganzen Canvas aber nicht den über ARect angegebenen Teil (Bug?).

Mein aktueller Workarround besteht tatsächlich darin, den ganzen Canvas zu löschen und neu zu zeichnen.

Kennt jemand das Problem und hat vielleicht eine etwas elegantere Lösung parat?


Viele Grüße,
Uwe

Delphi-Quellcode:
function TCardPoint.DrawMarker(Mode : TMarkerMode; Canvas : TCanvas; UseScene :
    Boolean = True): Boolean;
begin
  Result := False;
  if UseScene then
    Canvas.BeginScene;
  try
    if Mode = mmCross then
      SetStrokeColor(claBlack)
    else if Mode = mmCircle then
      SetStrokeColor(claOrange);
    case Mode of
      mmCircle:
        Canvas.DrawEllipse(RectF(FPoint.X-7, FPoint.Y-7, FPoint.X+7, FPoint.Y+7), 1);
      mmCross:
      begin
        Canvas.DrawLine(PointF(FPoint.X-5, FPoint.Y), PointF(FPoint.X+5, FPoint.Y), 1);
        Canvas.DrawLine(PointF(FPoint.X, FPoint.Y-5), PointF(FPoint.X, FPoint.Y+5), 1);
      end;
      mmUnCircle, mmUnCross:
      begin
        Canvas.ClearRect(RectF(FPoint.X-7, FPoint.Y-7, FPoint.X+7, FPoint.Y+7));
        DoRepaintCanvas; // Workarround! ClearRect löscht den ganzen Canvas anstatt das angegebene Rect
      end;
    end;
    Result := True;
  finally
    if UseScene then
    begin
      Canvas.EndScene;
      FLayer.Bitmap.BitmapChanged;
    end;
  end;
end;
Uwe
"Real programmers can write assembly code in any language." - Larry Wall
Delphi programming rocks

Geändert von Schorschi5566 ( 3. Jun 2012 um 16:59 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von BUG
BUG

Registriert seit: 4. Dez 2003
Ort: Cottbus
2.094 Beiträge
 
#2

AW: FMX Linie "wegzeichnen"

  Alt 3. Jun 2012, 17:45
klingt vielleicht trivial aber es gelingt mir derzeit nicht in einem FMX-TImage eine mit beispielsweise claRed gemalte Linie wieder rückstandsfrei zu entfernen.
Es ist so trivial wie es klingt: Wenn du eine nicht rückgängig machbare Änderung machst, kannst du es nicht rückgängig machen.
Wenn ein XOR anwendest, ist die Farb-Information noch da. Wenn du einfach Rot drüber malst, ist sie weg.
Intellekt ist das Verstehen von Wissen. Verstehen ist der wahre Pfad zu Einsicht. Einsicht ist der Schlüssel zu allem.
  Mit Zitat antworten Zitat
Schorschi5566

Registriert seit: 6. Feb 2006
197 Beiträge
 
Delphi 10.2 Tokyo Enterprise
 
#3

AW: FMX Linie "wegzeichnen"

  Alt 3. Jun 2012, 18:42
Warum sollte man einen DrawLine-Befehl nicht rückgängig machen können ohne den ganzen Canvas löschen zu müssen?

Und wozu ist Deiner Meinung nach die Funktion Canvas.ClearRect?
Im FMX-Code ist sie identisch zu Canvas.Clear, was ja wohl nicht im Sinne der Erfinder ist, oder?

Zitat:
Löscht einen rechteckigen Bereich aus einem TCanvas-Objekt.

ClearRect wird von TCanvas-Nachkommen implementiert, um einen rechteckigen Bereich aus einem TCanvas zu löschen und ihn mit einer angegebenen Farbe zu füllen.

Der Parameter ARect gibt den rechteckigen Bereich an, der gelöscht werden soll.

Der Parameter AColor gibt die Farbe an, mit der der in ARect angegebene Bereich gefüllt werden soll. Dieser Parameter ist optional und, wenn nicht angegeben, ist der in ARect angegebene Bereich transparent. Standarmäßig ist AColor auf 0 gesetzt.
Uwe
"Real programmers can write assembly code in any language." - Larry Wall
Delphi programming rocks

Geändert von Schorschi5566 ( 3. Jun 2012 um 18:45 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
10.993 Beiträge
 
Delphi 12 Athens
 
#4

AW: FMX Linie "wegzeichnen"

  Alt 3. Jun 2012, 21:32
Warum sollte man einen DrawLine-Befehl nicht rückgängig machen können ohne den ganzen Canvas löschen zu müssen?
Weil der DrawLine-Befehl einen Eintrag in einer DisplayList erzeugt. Da man aber an diese nicht so einfach heran kommt, ist die einzige Möglichkeit, den Befehl zu löschen, ein Neuaufbau der DisplayList ohne diesen Befehl => Canvas.Clear und neu zeichnen.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Schorschi5566

Registriert seit: 6. Feb 2006
197 Beiträge
 
Delphi 10.2 Tokyo Enterprise
 
#5

AW: FMX Linie "wegzeichnen"

  Alt 4. Jun 2012, 06:32
Hallo Uwe,

heißt das, dass ClearRect in anderen Situationen funktionieren würde? Wie gesagt, in den Sourcen sieht das derzeit so aus:

In FMX.Canvas.D2D:
Delphi-Quellcode:
procedure TCanvasD2D.Clear(const Color: TAlphaColor);
begin
  FTarget.Clear(D2Color(Color, 1));
end;

procedure TCanvasD2D.ClearRect(const ARect: TRectF; const AColor: TAlphaColor);
begin
  FTarget.Clear(D2Color(AColor, 1));
end;
Sieht für mich so aus als ob ClearRect bisher unvollständig implementiert wurde (ARect müsste doch FTarget verändern, oder so). Im Interface ist allerdings ClearRect nicht vorhanden (hier zu lesen), wodurch bei mir der Verdacht entsteht, dass es nichtmal Emba so ganz verstanden hat.

Die Frage ist eigentlich ob zu erwarten ist, dass ClearRect in einer kommenden Version der FMX-Implementierung wie angegeben funktionieren wird oder ob man sich besser selbst darum kümmert und zu löschende Objekte in einer eigenen Objektliste mit entsprechenden Canvas-Objekten selbst verwaltet. Ich wollte zwar eigentlich keine komplette Layerverwaltung einbauen, aber wenn's nicht anders geht...

So wie Canvas.ClearRect dokumentiert ist, scheint es jedenfalls nicht zu funktionieren, weshalb ich noch eine Meldung in der QC machen werde, wenn mir niemand widerspricht.

Grüße,
Uwe
Uwe
"Real programmers can write assembly code in any language." - Larry Wall
Delphi programming rocks
  Mit Zitat antworten Zitat
Medium

Registriert seit: 23. Jan 2008
3.679 Beiträge
 
Delphi 2007 Enterprise
 
#6

AW: FMX Linie "wegzeichnen"

  Alt 4. Jun 2012, 09:11
Ich kann mir gut vorstellen, dass ein ClearRect so wie auf den alten GDI Canvases überhaupt nicht funktionieren würde. Der einfachste Weg wäre da wohl ein Drüberzeichnen mit einem Rect, weil man für ein richtiges Clear potenziell ziemlich komplexe Geometrie-Bool'sche Operationen machen müsste. Ich nehme daher einfach mal an, dass die Methode ClearRect eher ein Relikt ist, dass jemand bei EMB eher unbedachterweise als Stub mit in den Code aufgenommen hatte, und sich nicht darüber im Klaren war, was das für einen Rattenschwanz nach sich ziehen könnte.

Letztlich ist es aber auch schon immer so gewesen: Der einzig "richtige" Weg gezeichnetes rückgängig zu machen ist, es erst überhaupt nicht zu zeichnen. XOR-Painting ist schon immer nur eine Krücke gewesen, die gerne aber aus Bequemlichkeit genutzt wurde, da es einem das Erstellen einer Painting-List erspart hat - oder zumindest eine History an Bitmaps für einfachstes Undo. Aber genau letztere sind der einzig richtige Weg wenn man die Funktion "zuvor gezeichnetes entfernen" braucht.
"When one person suffers from a delusion, it is called insanity. When a million people suffer from a delusion, it is called religion." (Richard Dawkins)
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
10.993 Beiträge
 
Delphi 12 Athens
 
#7

AW: FMX Linie "wegzeichnen"

  Alt 4. Jun 2012, 18:02
Sieht für mich so aus als ob ClearRect bisher unvollständig implementiert wurde (ARect müsste doch FTarget verändern, oder so). Im Interface ist allerdings ClearRect nicht vorhanden (hier zu lesen), wodurch bei mir der Verdacht entsteht, dass es nichtmal Emba so ganz verstanden hat.
Die GDI+ und die Quartz-Implementation für Mac machen da wohl schon was - insofern hat Emba das wohl doch verstanden. Da D2D aber kein ClearRect anbietet (und OpenGL wohl auch nicht), wird das da wohl schwer zu implementieren sein. Es ist halt bei unterschiedlichen Plattformen immer die Frage: kleinster gemeinsamer Nenner oder Fake-Implementierung nicht unterstützter Funktionen.

Die Grafikkarte sollte aber schon schnell genug sein, um ein Clear und Neuzeichnen halbwegs schnell hinzukriegen.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Schorschi5566

Registriert seit: 6. Feb 2006
197 Beiträge
 
Delphi 10.2 Tokyo Enterprise
 
#8

AW: FMX Linie "wegzeichnen"

  Alt 7. Jun 2012, 07:54
Ja, das geht schon flott genug, wenn man's halbwegs geschickt macht.

Vielen Dank für Eure Antworten. Hat, wie immer, weitergeholfen.


Grüße,
Uwe
Uwe
"Real programmers can write assembly code in any language." - Larry Wall
Delphi programming rocks
  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 20:32 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