Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Problem mit Komponente entfernen (https://www.delphipraxis.net/68692-problem-mit-komponente-entfernen.html)

made in Germany 3. Mai 2006 22:21


Problem mit Komponente entfernen
 
Hi!

Ich komm wieder mal nicht weiter,
ich hoffe ihr könnt mir helfen:


Ich möchte die hier zur Laufzeit erstellte Kompnente wieder entfernen.

Delphi-Quellcode:
var
imgnew:TImage;  
x1,y1,imganz: Integer;


procedure TForm1.Button1Click(Sender: TObject);
   begin
        imgnew:=TImage.Create(self);
        imgnew.Parent:= SDIAppForm;
        imgnew.Show;
        imgnew.Canvas.Brush.Color:=clred;
        imgnew.PopupMenu:=Popupmenu1;
        imgnew.Canvas.Rectangle(x1,y1,x1+100,y1+100);

        imgnew.Name:='Image'+IntToStr(imganz);             // Namen ändern
        imganz:=imganz+1;

        x1:=x1+5;                  //neue Koordinaten
        y1:=y1+5;
   end;




procedure TForm1.lschen1Click(Sender: TObject);
begin

TImage().Free; // Hier sollte nacher die ausgewählte Kompnente irgendwie wieder entfernt werden

end;
Das Image, das das Popupmenü geöffnet hat, soll entfernt werden.

Zumindest hab ich mir das so vorgestellt :(

Hawkeye219 3. Mai 2006 22:25

Re: Problem mit Komponente entfernen
 
Hallo,

die Eigenschaft Delphi-Referenz durchsuchenTPopupMenu.PopupComponent ist wohl das, was du suchst.

Gruß Hawkeye

made in Germany 3. Mai 2006 22:32

Re: Problem mit Komponente entfernen
 
genau das hab ich gebraucht

danke :!:

Muetze1 4. Mai 2006 08:49

Re: Problem mit Komponente entfernen
 
Frage: Warum legst du dir eine globale Variable für die Image Instanz an? Das ist total unsinnig, da du schliesslich mehr als eine Instanz anlegst und somit die anderen, alten Instanzen verlierst.

made in Germany 4. Mai 2006 17:02

Re: Problem mit Komponente entfernen
 
gut, okay. Hab ich geändert.

Wenn ich aber dann

PopupMenu.popupcomponent.free;

verwende, bekomme ich beim Schließen meines Programmes eine Fehlermeldung.
Woran liegt das?
:gruebel:

himitsu 4. Mai 2006 17:34

Re: Problem mit Komponente entfernen
 
Probier mal
Delphi-Quellcode:
FreeAndNil(PopupMenu.PopupComponent);
oder
Delphi-Quellcode:
PopupMenu.PopupComponent.Free;
PopupMenu.PopupComponent := nil;

Hawkeye219 4. Mai 2006 17:41

Re: Problem mit Komponente entfernen
 
Zitat:

Zitat von himitsu
Delphi-Quellcode:
FreeAndNil(PopupMenu.PopupComponent);

Damit wird der Compiler wohl nicht einverstanden sein. "PopupComponent" ist ein Property. :wink:

Gruß Hawkeye

himitsu 4. Mai 2006 18:19

Re: Problem mit Komponente entfernen
 
Dann halt die zweite Variante ;)

Es ist ja nur 'ne Vermutung, aber eventuell versucht dann ja irgendwas aus das Objekt zuzugreifen, welches in PopupComponent gespeichert ist und dann wirdja ein Fehler passieren, wenn da ein nicht mehr existierened Objekt drinsteht ^^

made in Germany 4. Mai 2006 20:11

Re: Problem mit Komponente entfernen
 
Funktioniert nicht


FEHLER:

Access violation at address 00000001. Read of address 00000001.


Kann mir mal jemand sagen, was das bedeutet?

made in Germany 4. Mai 2006 20:19

Re: Problem mit Komponente entfernen
 
Wenn ich jedoch bei der Prozedur TSDIAppForm.close folgendes eingebe:

Delphi-Quellcode:
imgnew:=TImage.Create(self);

Dann lässt sich das Programm ohne Fehler schließen
:gruebel:

tigerman33 4. Mai 2006 20:24

Re: Problem mit Komponente entfernen
 
Durch das
Delphi-Quellcode:
imgnew:=TImage.Create(self);
fühlt sich das Formular Form1 für das neue Image "verantwortlich". Da--wie bereits beschrieben--durch imgnew.Free der Instanzenzeiger nicht auf nil gesetzt wird, versucht deshalb das Form1, wenn es selbst freigegeben wird, imgnew erneut freizugeben. Und das funktioniert natürlich nicht.

Abhilfe wurde ja bereits beschrieben:
Delphi-Quellcode:
PopupMenu.PopupComponent.Free;
PopupMenu.PopupComponent := nil;

made in Germany 4. Mai 2006 20:33

Re: Problem mit Komponente entfernen
 
Hab ich versucht, funktioniert allerdings nicht

Hawkeye219 4. Mai 2006 20:37

Re: Problem mit Komponente entfernen
 
Durch

Delphi-Quellcode:
PopupMenu.PopupComponent := nil;
wird lediglich der Verweis in der Popupmenü-Komponente gelöscht, aber nicht die globale Variable imgnew. Wenn nun beim Schließen des Programms versucht wird, über

Delphi-Quellcode:
imgnew.Free;
eine Komponente freizugeben, die bereits über das Popupmenü gelöscht wurde, dann knallt es.

Ich würde in diesem Fall die globale Variable durch eine lokale Variable in der Prozedur Button1Click ersetzen. Die TImage-Komponenten erhalten ja einen Owner (self), somit werden nicht gelöschte Bilder automatisch von diesem Owner freigegeben.

Gruß Hawkeye

tigerman33 4. Mai 2006 20:39

Re: Problem mit Komponente entfernen
 
Okay, das war natürlich auch Blödsinn. Davon weiß natürlich Form1 immer noch nicht, dass die Komponente schon freigegeben ist. :oops:

Ich mag mich irren, aber eigentlich müsste Form1 beim Beenden das Image automatisch mit freigeben. Meine da mal was in der Hilfe gelesen zu haben... :stupid: Berichtigt mich wenn ich falsch liege. D.h. um das Free müsstest du dich in dem Fall gar nicht mehr kümmern.

Alternativ müsste eigentlich auch gehen:
Delphi-Quellcode:
imgnew := TImage.Create(nil);
anstelle von
Delphi-Quellcode:
imgnew := TImage.Create(self);

made in Germany 4. Mai 2006 20:47

Re: Problem mit Komponente entfernen
 
So, nun funktionierts! :thumb:

Danke für die Hilfe :!:


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