Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi teile in canvas löschen (https://www.delphipraxis.net/65077-teile-canvas-loeschen.html)

Mr. Pink 11. Mär 2006 23:11


teile in canvas löschen
 
hallo, ich habe (mal wieder ;)) eine frage zu canvas:

gibt es eine möglichkeit bestimmte stellen in einer paintbox zu löschen, oder z.b die letzte linie, die gezeichnet wurde wieder zu löschen?

ich habe nen funktionsplotter, und würde gerne einige graphen wieder löschen, andere aber beibehalten; is das machbar, ohne einen riesen aufwand zu betreiben??

btw, bin relativ neu bei delphi und kenn mich noch nicht so gut aus... :pale:

Der_Unwissende 12. Mär 2006 10:31

Re: teile in canvas löschen
 
Hi,
ein Canvas ist eine sehr einfache Zeichenfläche. Du kannst da beliebig raufzeichnen, aber du überzeichnest rücksichtslos (vom Canvas aus gesehen), mehr Möglichkeiten gibt es erstmal nicht. Das heißt natürlich, dass es keine Ebenen und ähnliches direkt gibt und somit kannst du nicht einfach etwas löschen.
Wenn du einen Canvas wieder löschen willst, dann füllst du einfach die gesamte Fläche mit der Hintergrundfarbe. Wenn du nun einen Funktionsgraphen löschen möchtest, dann kannst du einfach diesen Graphen aus der Liste (von allem was gezeichnet werden soll) löschen, den Canvas mit Hintergrundfarbe überzeichnen und alles was noch in der Liste steht neu zeichnen.

Eine Alternative ist es noch, dem Stift als Stil psXOR bzw. psNotXOR zuzuweisen. Hierbei wird jedes Pixel dass du mit dem Stift bearbeitest XOR verknüpft mit der Stiftfarbe. Der Vollständigkeit halber erwähne ich hier nochmal, XOR ist immer dann wahr, wenn zwei Bits unterschiedlich sind, sonst falsch. Wenn du nun also einen weißen Hintergrund hast ($FF) und du den mit einem weißen Stift XOR verknüpfst, dann kämst du zu $FF XOR $FF = $00 (schwarz). Zeichnest du mit dem gleichen Stift wiederum die gleiche Linie, so verknüpfst du $00 XOR $FF = $FF (weiß). Damit löscht du also auch gezeichnete Linien. Das Problem bei Funktionsgraphen ist, dass du natürlich auch alle Schnittpunkte mit anderen Graphen löscht (darum müsstest du dich dann wieder kümmern)

Gruß Der Unwissende

Mr. Pink 12. Mär 2006 14:18

Re: teile in canvas löschen
 
danke erstmal für die umfassende antwort! :corky:

an die erste methode die, du erklärt hast, habe ich auch schon gedacht, ist aber mit einem verhältnismäßig großen aufwand verbunden, da ich dann meinen funktionsplotter grundlegend umschreiben müsste :( .
werd mal schaun ob ichs irgendwie reinbekomme..
aber ersteinmal danke für einen weiteren denkanstoß

Nikolas 12. Mär 2006 14:45

Re: teile in canvas löschen
 
Zum Löschen des Canvas kannst du auch einfach
Delphi-Quellcode:
canvas.picture := nil;
schreiben. Dass ist deutlich einfacher und eleganter, als die Canvas zu übermalen.

Der_Unwissende 12. Mär 2006 19:02

Re: teile in canvas löschen
 
Zitat:

Zitat von Toxman
Zum Löschen des Canvas kannst du auch einfach
Delphi-Quellcode:
canvas.picture := nil;
schreiben. Dass ist deutlich einfacher und eleganter, als die Canvas zu übermalen.

Das führt dich nur leider zu dem Problem, dass ein Canvas keine Eigenschaft Picture hat. Ein Image mag diese Eigenschaften noch haben, aber da du mit einer Paintbox und/oder direkt mit einem Zeichencanvas arbeitest, steht dir diese Möglichkeit erst gar nicth zur Verfügung. Genauer gesagt ist es wohl leichter deinen Plotter als TCanvas umzuschreiben.

An sich lohnt sich immer ein recht modularer Aufbau (wobei dass weit genug vorraus schauende Planen nicht unbedingt trivial ist). Aber gerade bei einem Funktionsplotter, solltest du die Funktionen zum Zeichnen einzelner Funktionsgraphen in einer eigenen Methode auslagern. Wenn du dann noch in einem Array oder einer Liste alles das speicherst, was du benötigst um alle Funktionen zu speichern, sollte es für dich leicht sein, nach dem entfernen einfach alles neu zu zeichnen (was noch aktuell ist).

Gruß Der Unwissende

Nikolas 12. Mär 2006 19:12

Re: teile in canvas löschen
 
Oh. Da muss ich mich entschuldigen. Bis jetzt waren alle Canvases die ich hatte, auf einem Image und da muss ich was verwechselt haben. :duck:


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