Thema: Delphi FMX Linie "wegzeichnen"

Einzelnen Beitrag anzeigen

Schorschi5566

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

FMX Linie "wegzeichnen"

  Alt 3. Jun 2012, 10: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 17:59 Uhr)
  Mit Zitat antworten Zitat