![]() |
FMX Linie "wegzeichnen"
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 :lol:) 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. :roll: 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; |
AW: FMX Linie "wegzeichnen"
Zitat:
Wenn ein XOR anwendest, ist die Farb-Information noch da. Wenn du einfach Rot drüber malst, ist sie weg. |
AW: FMX Linie "wegzeichnen"
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:
|
AW: FMX Linie "wegzeichnen"
Zitat:
|
AW: FMX Linie "wegzeichnen"
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:
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 (
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; ![]() 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 |
AW: FMX Linie "wegzeichnen"
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. |
AW: FMX Linie "wegzeichnen"
Zitat:
Die Grafikkarte sollte aber schon schnell genug sein, um ein Clear und Neuzeichnen halbwegs schnell hinzukriegen. |
AW: FMX Linie "wegzeichnen"
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 |
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:49 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz