Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Einzelne Objekte im Canvas löschen (https://www.delphipraxis.net/160692-einzelne-objekte-im-canvas-loeschen.html)

mariking2 26. Mai 2011 13:31


Einzelne Objekte im Canvas löschen
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo Miteinander,
ich sitze im Moment an einem Minipaintprogramm und habe folgendes Problem: Ich soll jedes einzelne Objekt auf dem Canvas(also jede Linie, jede Ellipse etc.) einzeln löschen können, ohne dass die anderen Objekte dabei beschädigt werden.
Im Internet habe ich schon einiges über ähnlich Funktionen gelesen, aber keines war irgendwie übertragbar. Ich habe zum Beispiel an eine Liste gedacht, die jeden Schritt in einem neuen Canvas speichert(Imag1.Canvas.Create)speichert(ähnlich Photoshop-Protokoll) und wenn ich eine Ebene in der Liste anklicke, soll der dazugehörige Canvas gelöscht/unsichtbar gemacht werden.
Ich weiß aber nicht, wie man dann dem String jeweils ein Canvas o.ä. zuweisen kann.

Bzw. gibt es andere Möglichkeiten?

//Das Programm ist angehängt, allerdings ohne jegliche Löschfunktion o.ä.

Coffeecoder 26. Mai 2011 13:36

AW: Einzelne Objekte im Canvas löschen
 
Hi,

Mein spontaner Vorschlag wäre, die Objekte die gezeichnet werden in einer Liste ja zu speichern.
Wenn du ein löschen willst dann wird es aus der Liste entfernt und wird dann nicht mehr neugezeichnet.
Neugezeichnet wird nur was in der Liste ist mit der Repaint-Methode.

Ich hoffe es hilft dir weiter.

mariking2 26. Mai 2011 13:38

AW: Einzelne Objekte im Canvas löschen
 
Aber wie speicher ich die Zeichnungen in einer Liste, denn ich kenne nur StringLists und die helfen mir beim Zeichnen nicht wirklich weiter, oder?

Coffeecoder 26. Mai 2011 13:45

AW: Einzelne Objekte im Canvas löschen
 
Ich würde so vorgehen:

Koordinaten der Objekte (X1,X2,Y1,Y2) und die "Form" (Ellipse,...) in einer Listbox speichern.
Die Repaint-Methode läuft durch die Liste und zeichnet das neu.
So wenn du ein Objekt nicht mehr haben willst, löschte den entsprechenden Eintrag aus der Listbox.
Dann rufst du nochmal die Paint-Methode auf und das "gelöschte" Objekt wird nicht mehr neugezeichnet.

mariking2 26. Mai 2011 13:48

AW: Einzelne Objekte im Canvas löschen
 
Soweit verstanden. Eine (vielleicht blöde Frage): Wie lösche ich ein Item aus einer Liste?

Könntest Du mir bitte mal den Code für eine Prozedur geben, die alle Ereignisse aus der Liste aufruft und zeichnet. Denn ein String ist ja nicht gleich ein Befehl.

DeddyH 26. Mai 2011 14:00

AW: Einzelne Objekte im Canvas löschen
 
Nimm statt einer Stringliste eine TObjectList und lege Deine Zeichenobjekte darin ab. Löschen kannst Du es dann mit ObjectList.Delete(Index Deines Objekts).

mariking2 26. Mai 2011 14:25

AW: Einzelne Objekte im Canvas löschen
 
Wenn ich schreibe:
Code:
var
liste: TObjectList;
zeigt er mir an, dass TObjectList ein undefinierter Bezeichner ist.

DeddyH 26. Mai 2011 14:29

AW: Einzelne Objekte im Canvas löschen
 
Du musst die Unit Contnrs einbinden.

mariking2 26. Mai 2011 14:35

AW: Einzelne Objekte im Canvas löschen
 
Also die Liste hätte ich erstellt, wie speicher ich jetzt z.B. eine Ellipse ab?
Denn es muss auch Vordergrundfarbe, Füllfarbe, Stiftdicke und Brush-Style beachtet werden.

DeddyH 26. Mai 2011 14:42

AW: Einzelne Objekte im Canvas löschen
 
Erstell Dir eine Klasse mit den benötigten Attributen. Von dieser Klasse erstellst Du dann eine Instanz, die auf die gewünschte Zeichenfläche malt und speicherst sie (die Instanz) in der Liste. Wird nun eine Instanz aus der Liste gelöscht, gehst Du die Liste von vorn nach hinten durch und lässt alle noch verbleibenden Objekte neu zeichnen.

mariking2 26. Mai 2011 14:58

AW: Einzelne Objekte im Canvas löschen
 
Danke erstmal, eien Frage hätte ich (erstmal) noch:
Ich habe schon mehrere Klassen, wenn ich meine eigene Klasse hinzufüge, steht dort,
ich soll Sie nicht TObjekte = class nennen, sonern TObjekte : class
Also hab ich die vorgefertigte Form-Klasse mit end; beendet. Funktioniert auch nicht,
wie starte ich jetzt die neue Klasse??

Code:
  private
   TObjekt = class
    oldx, oldy, newx, newy, thickness: Integer;
    vgf, hgf: Tcolor; //Vordergrundfarbe, Hintergrundfarbe
    bstyle: TBrushstyle; //Brushstyle;
    procedure saveobjekt(oldx, oldy, newx, newy, thickness: integer; vgf, hgf: TColor; bstyle: TBrushStyle );

Deep-Sea 26. Mai 2011 15:02

AW: Einzelne Objekte im Canvas löschen
 
Vlt. solltest du dir mal ein Grundlagentutorial ansehen?! ...

stahli 26. Mai 2011 15:04

AW: Einzelne Objekte im Canvas löschen
 
Mein Vorschlag: Teste Dich langsam heran.

Erstelle am besten erst einmal eine eigene Klasse (z.B. Ableitung von einem Panel). TPanelKreis, TPanelLine etc.
Da ersetzt Du einfach die Paint-Methode und lässt etwas passendes auf dessen Canvas zeichnen. Mit Left und Top kannst Du die Objekte positionieren.
Dann hast Du erst mal "richtige Objekte zum anfassen". (Das hat Vor- und Nachteile).

Wenn Du soweit mit Objektentwicklung vertraut bist, kannst Du die Objekte später auch ändern und dann direkt auf die eigentliche Zeichenfläche zeichnen lassen.

Das Problem, das dann zu lösen ist: Du kannst dann die "Objekte" nicht mehr (so ohne Weiteres) mit der Maus selektieren, da Du ja dann nur noch ein großes Gesamtbild darstellst. Die Objekte haben dann kein eigenes Handle, das z.B. Mausereignisse abfangen kann.

mariking2 26. Mai 2011 15:05

AW: Einzelne Objekte im Canvas löschen
 
Mach ich gerade, hab das Problem auch schon gefunden. Trotzdem danke.
Wie gesagt, ich habe seit diesem Schuljahr erst Informatik in der Schule, zwei Stunden in der Woche
und ich bin noch der Beste aus unserem Kurs, die Anderen sind gerade an den ersten Zeichenfunktionen ihres "Paint"-Programms

scrat1979 26. Mai 2011 16:00

AW: Einzelne Objekte im Canvas löschen
 
Zitat:

Zitat von DeddyH (Beitrag 1103066)
Erstell Dir eine Klasse mit den benötigten Attributen. Von dieser Klasse erstellst Du dann eine Instanz, die auf die gewünschte Zeichenfläche malt und speicherst sie (die Instanz) in der Liste. Wird nun eine Instanz aus der Liste gelöscht, gehst Du die Liste von vorn nach hinten durch und lässt alle noch verbleibenden Objekte neu zeichnen.

Bevor die Frage aufkommen sollte, warum die Liste von hinten durchlaufen: Durch das Löschen eines Elementes würden sich die Indices der "darunter" liegenden Items ändern... :)

Deep-Sea 26. Mai 2011 16:09

AW: Einzelne Objekte im Canvas löschen
 
@scrat1979:
Lies nochmal genau, was DeddyH geschrieben hat. Da steht nichts über "von hinten nach vorne". Das wäre nur wichtig, wenn man die Schleife abarbeitetet und dazu auch noch etwas löscht. Aber nicht, wenn man erst löscht und dann die Liste durchgeht.

DeddyH 26. Mai 2011 16:33

AW: Einzelne Objekte im Canvas löschen
 
Ich gehe ja davon aus, dass ein neues Objekt zeichnet und sich ans Ende der Liste gesellt. D.h. das erste Objekt steht auch am Anfang der Liste, also muss auch in der Reihenfolge erneut gezeichnet werden.

mariking2 27. Mai 2011 20:28

AW: Einzelne Objekte im Canvas löschen
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo nochmal. Ich habe jetzt die ganze Zeit versucht, die gezeichneten Objekte
in eine ObjectList einzufügen.
Ich bin gerade bei der ersten Zeichenfunktion, den Linien(Z. 432-446).
Ich erstelle eine Variable "Element" und nach dem er die Linie gezeichnet hat,
deklariert er in dieser Variable die Koordinaten und die Art.
Mit der Funktion ObjectList.Add(Element) sollte ja das Element jetzt auch der ObjectList hinzugefügt werden,
allerdings wenn ich das Programm starte, beendet er es wieder, zeigt mir in Delphi so eine Fehlermeldung an:
Im Projekt Minipaint2.exe ist eine Exception der Klasse EAccesViloation...
Aber eine Fehlermeldung im Sinne von: "=" gefunden, aber ":" erwartet
bleibt aus. Könnte Sich jemand vielleicht das Programm mal anschauen, wäre echt nett.
Danke

hoika 27. Mai 2011 21:06

AW: Einzelne Objekte im Canvas löschen
 
Hallo,

Zitat:

ObjectList.Create;
Der üblige Fehler ...


var
ObjectList: TXXX;


ObjectList:= TXXX.Create;


Heiko

mariking2 27. Mai 2011 21:20

AW: Einzelne Objekte im Canvas löschen
 
Danke, ich hasse so doofe Fehler.

Habe gerade ausprobiert und soweit funktioniert es auch, aber:
Wenn ich das Programm wieder schließe, kommt der selbe Fehler?
Muss ich die Liste vorher löschen oder so?

stahli 27. Mai 2011 21:23

AW: Einzelne Objekte im Canvas löschen
 
Kleiner Tipp: Immer die Fehlermeldungen GENAU lesen. I.d.R. steht der Cursor dann auch an der entsprechenden Quelltextstelle.
Mit etwas Überlegung kommt man dann meist noch auf die Ursache. Das geht dann schneller, als auf eine Forenantwort zu warten :-)

mariking2 27. Mai 2011 22:42

AW: Einzelne Objekte im Canvas löschen
 
Also die Fehlermeldung gab nichts her, ich hab den Fehler aber gefunden.

Aphton 28. Mai 2011 09:47

AW: Einzelne Objekte im Canvas löschen
 
Sag mal, welche Delphiversion benutzt du?

mariking2 30. Mai 2011 14:21

AW: Einzelne Objekte im Canvas löschen
 
Also wir benutzen Delphi 5,
Ich habe mit meinem Informatiklehrer gesprochen
und der meinte, es gehe viel leichter ohne ObjectList.
Angeblich soll es einen Pen Mode, der im prinzip eine neue Ebene erstellt, aber wie sollen die deklariert, bzw. aufgerufen werden sollen?
Irgendjemand ne Idee?

DeddyH 30. Mai 2011 14:25

AW: Einzelne Objekte im Canvas löschen
 
Was jetzt der TPenMode mit dem Löschen von Objekten zu tun haben soll, das würde ich gern wissen :gruebel:

stahli 30. Mai 2011 14:26

AW: Einzelne Objekte im Canvas löschen
 
Nein, ein Canvas hat keine Ebenen.
Du kannst aber mehrere Canvas übereinander legen. Wie z.B. ein Panel auf eine Form und auf das Panel einen Button.
Das ganze dann aber transparent zu machen ist nicht so unkompliziert, wie man vielleicht denkt.


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