Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Fehler beim löschen von Objekten (https://www.delphipraxis.net/146986-fehler-beim-loeschen-von-objekten.html)

Delphi-Narr 30. Jan 2010 17:09


Fehler beim löschen von Objekten
 
Hallo, ich habe einen Mapeditor erstellt, der aus Shapes, die man auf die Form zieht, eine Karte erstellt.
Dazu werden die Objekte mit Namen, Left, Top, Width und Heigth in einer Liste (SL) gespeichert, um die Karte hinterher wieder laden zu können:

Inhalt SL:
Delphi-Quellcode:
Name //Zufällig erstellt
Left
Top
Width
Height
Dies geschieht beim MouseUp-Ereignis der Form.

Außerdem wird den erstellten Objekten ein OnMouseDown-Ereignis zugewiesen, die Prozedur Destroyer.

Diese sieht wie folgt aus:

(Bei "Objekt" handelt es sich um eine Variable des Typs TShape)

Delphi-Quellcode:
procedure TMap.Destroyer(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
var name:string;
    i:integer;
begin
     //Abfrage
     if MessageDLG('Objekt wirklich löschen?',mtcustom,[mbyes,mbno],0)=mrno then exit;
     Name:=(Sender as TShape).name;
     Objekt:=Findcomponent(name) as TShape;
     i:=0;
     //Aus Liste löschen
     while LowerCase(SL[i])<>LowerCase(name) do
     begin
          //Objektnamen suchen
          i:=i+1;
     end;
     //Alle 5 Eigenschaften aus der Liste löschen
     SL.Delete(i);
     SL.Delete(i);
     SL.Delete(i);
     SL.Delete(i);
     SL.Delete(i);

     //Objekt selber löschen
     Sender.Destroy;
end;
Bei Sender.destroy passiert jedoch folgendes: Es werden zusätzlich alle Shapes gelöscht, die nach diesem Shape erstellt wurden. Wo ist da der Fehler???

Liebe Grüße!

Luckie 30. Jan 2010 17:11

Re: Fehler beim löschen von Objekten
 
Wie wäre es mit
Delphi-Quellcode:
(Sender as TShape).Free

mkinzler 30. Jan 2010 17:13

Re: Fehler beim löschen von Objekten
 
Ich würde die Shapes selber in einer Objektliste verwalten und nicht ihre Eigenschaften in einer Stringliste

himitsu 30. Jan 2010 17:15

Re: Fehler beim löschen von Objekten
 
Jupp, Destroy sollte man möglichst nicht direkt aufrufen.

Zitat:

Bei Sender.destroy passiert jedoch folgendes: Es werden zusätzlich alle Shapes gelöscht, die nach diesem Shape erstellt wurden. Wo ist da der Fehler???
Hast du mal gedebuggt und geschaut, was beim Aufrif dieser Methode passiert?

Zitat:

Objekt:=Findcomponent(name) as TShape;
Sender ist schon das Objekt ... wozu also nochmal suchen?

Delphi-Quellcode:
while LowerCase(SL[i])<>LowerCase(name) do
Kennst du von einer StringList schon .IndexOf und seine Freunde?

Delphi-Narr 30. Jan 2010 17:18

Re: Fehler beim löschen von Objekten
 
@ luckie:Leider das gleiche Problem...

@mkinzler: Die Liste wird hinterher als Datei exportiert und so kann ich die wirklich wichtigen Eigenschaften in der Form speichern, wie ich sie hinterher brauche...

@ himitsu: Habe ich bisher noch nicht verwendet... Da ich von Sender die Eigenschaften nicht einfach auslesen kann, brauche ich es als definierten Typ, ein TShape. Anders hab ich auch schon versucht, klappt jedoch nicht...

mkinzler 30. Jan 2010 17:20

Re: Fehler beim löschen von Objekten
 
Zitat:

@mkinzler: Die Liste wird hinterher als Datei exportiert und so kann ich die wirklich wichtigen Eigenschaften in der Form speichern, wie ich sie hinterher brauche...
Kannt du doch beim Speic
hern direkt aus den Objekten auslesen
Zitat:

@ himitsu: Habe ich bisher noch nicht verwendet... Da ich von Sender die Eigenschaften nicht einfach auslesen kann, brauche ich es als definierten Typ, ein TShape. Anders hab ich auch schon versucht, klappt jedoch nicht...
Doch wenn du Sender nach TShape castest

himitsu 30. Jan 2010 17:32

Re: Fehler beim löschen von Objekten
 
Zitat:

Doch wenn du Sender nach TShape castest
Genau, denn was machst du, um an den Namen zu kommen
oder um ein TShape aus FindCompnent zu machen, welches ja ein TComponent liefert. :zwinker:

Zitat:

Bei Sender.destroy passiert jedoch folgendes: Es werden zusätzlich alle Shapes gelöscht, die nach diesem Shape erstellt wurden. Wo ist da der Fehler???
Wie erstellst du denn die Shapes?

Hab da soeinen Verdacht, den Owner betreffend. :stupid:

Delphi-Narr 30. Jan 2010 17:41

Re: Fehler beim löschen von Objekten
 
Dies ist die Art, wie ich sie erstelle (handelt sich hierbei um ein "Loch". Zufall wird beim Programmstart zufällig gesetzt, damit beim erneuten Laden keine doppelten Objekte vorhanden sind.

Delphi-Quellcode:

             Objekt:=TShape.Create(unit1.Objekt);
             Objekt.parent:=map;
             Objekt.Name:='Loch'+Zufall+IntTOStr(NummerL);
             Objekt.Shape:=stcircle;
             Objekt.Top:=Y;
             Objekt.Left:=X;
             Objekt.Width:=20;
             Objekt.Height:=20;
             Objekt.Brush.Color:=clblack;
             Objekt.OnMouseDown:=Destroyer;
             NummerL:=NummerL+1;
             exit;

mkinzler 30. Jan 2010 17:46

Re: Fehler beim löschen von Objekten
 
Delphi-Quellcode:
Objekt:=TShape.Create(unit1.Objekt);
Unit1.Objekt ist der Owner. Nimm besser das Formular

Delphi-Narr 30. Jan 2010 17:50

Re: Fehler beim löschen von Objekten
 
Ah, jetzt klappt es. Danke!
Und warum hat es nicht mit der anderen Variante geklappt?


Alle Zeitangaben in WEZ +1. Es ist jetzt 12:30 Uhr.
Seite 1 von 2  1 2      

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