Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Paintbox Draw, bereits gezeichnete löschen (https://www.delphipraxis.net/198627-paintbox-draw-bereits-gezeichnete-loeschen.html)

Trafel21 20. Nov 2018 07:32

Paintbox Draw, bereits gezeichnete löschen
 
Hallo zusammen,

ich kann über die Funktion Draw einer Paintbox ein Image zuweißen und zeichnen lassen.

BalyDataModule.ImageListChildSmall.Draw(PaintBox1. Canvas, lDrawPointX, lDrawPointY, lIndex);

ist es irgendwie möglich das gezeichnete auch wieder zu löschen, bzw zurückzunehmen? Zum beispiel einfach per Buttonclick.

uligerhardt 20. Nov 2018 07:42

AW: Paintbox Draw, bereits gezeichnete löschen
 
Zitat:

Zitat von Trafel21 (Beitrag 1418501)
Hallo zusammen,

ich kann über die Funktion Draw einer Paintbox ein Image zuweißen und zeichnen lassen.

BalyDataModule.ImageListChildSmall.Draw(PaintBox1. Canvas, lDrawPointX, lDrawPointY, lIndex);

ist es irgendwie möglich das gezeichnete auch wieder zu löschen, bzw zurückzunehmen? Zum beispiel einfach per Buttonclick.

Du kannst TCanvas.FillRectangle aufrufen, um alles mit der aktuellen Brush-Farbe einzufärben.
Oder meinst du eine Undo-Funktionalität für einzelne Striche oder so?

Ich kann jetzt auch nicht erkennen, wo du die obige Zeile aufrufst. Richtig wäre im OnPaint der PaintBox, nicht in einem Button-Click-Handler.

Trafel21 20. Nov 2018 07:54

AW: Paintbox Draw, bereits gezeichnete löschen
 
Liste der Anhänge anzeigen (Anzahl: 2)
Ja, hatte ich vergessen. in OnPaint wird das aufgerufen.

Code:
procedure TKontakte_Frame.PaintBox3Paint(Sender: TObject);
var
  lDrawPointX: Integer;
  lDrawPointY: Integer;
  lIndex: Integer;
begin
  inherited;
  //Imagegröße in Bezug auf Größer der Paintbox festlegen(75%)
  DataModule.ImageListChildSmall.Width := round(PaintBox3.Width * 0.5);
  DataModule.ImageListChildSmall.Height := round(PaintBox3.Height * 0.5);

  // Zeichenpunkt festlegen
  lDrawPointX := round(PaintBox3.Width * 0.25);
  lDrawPointY := round(PaintBox3.Height * 0.25);

  // Bild Index Setzen, abhängig vom Contact_Typ
  case IB_CONTACTCONTACTTYPE_INCKEY.AsInteger of
    100 : lIndex := 19; //Telefon
    150 : lIndex := -1; //Fax
    200 : lIndex := 19; //EMail
    300 : lIndex := 19; //Ansprechpartner
    400 : lIndex := -1; //Website
    500 : lIndex := -1; //Geburtstag
  else
    lIndex:=-1;
  end;

  if lIndex>-1 then
    Module.ImageListChildSmall.Draw(PaintBox3.Canvas, lDrawPointX, lDrawPointY, lIndex);
end;
Ich hab das alles in einem CtrlGrid (Siehe Bild1). Momentan funktioniert es. Mit + füge ich einen weiteren Datensatz hinzu.

Ich möchte nur implementieren das, wenn ich einen weiteren Datensatz hinzufüge, das aktuelle gezeichnete + gelöscht wird und bei dem neuen Datensatz (Bspw. Telefon) gezeichnet wird.
Siehe Unterschied Bild3 Beispiel Telefon.

Eigentlich muss ich nur das gezeichnete Bild zurücksetzen und beim neuen Datensatz setzen, oder?

uligerhardt 20. Nov 2018 08:01

AW: Paintbox Draw, bereits gezeichnete löschen
 
Das "normale" Vorgehen ist, in einem Button-Klick o.ä. die internen Datenstrukturen (Arrays, DB, ...) zu bearbeiten und danach PaintBox.Invalidate aufzurufen. Im OnPaint zeichnest du einfach alles neu. Also nix mit rückgängig machen oder so.

Wenn das zu langsam ist oder flackert, kannst du statt PaintBox.Invalidate mit InvalidateRect experimentieren, um das Neuzeichnen zu minimieren.

Edit: Also in deinem Fall sollte reichen, jeweils ein InvalidateRect auf die Stelle loszulassen, wo das Plus vorher war, und dort, wo es jetzt ist. Oder vielleicht jeweils auf die ganzen Zeilen, wenn das einfacher ist oder sowieso mehr Icons betroffen sind.

Noch ne Edit:Kannst du nicht Speedbuttons o.ä. verwenden, statt alles selber zu malen?

Trafel21 20. Nov 2018 08:11

AW: Paintbox Draw, bereits gezeichnete löschen
 
Danke für deinen Tipp, ich werde mir die Function anschauen.

Das mit dem Button war ein, von mir wohl schlecht gewähltes, Beispiel. ^^, Ein Datensatz wird bei mir automatisch gelöscht (auch DBCTRLGRID) wenn das Feld bei editieren leer ('') wird.


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:19 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