![]() |
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:
Das Image, das das Popupmenü geöffnet hat, soll entfernt werden.
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; Zumindest hab ich mir das so vorgestellt :( |
Re: Problem mit Komponente entfernen
|
Re: Problem mit Komponente entfernen
genau das hab ich gebraucht
danke :!: |
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.
|
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: |
Re: Problem mit Komponente entfernen
Probier mal
Delphi-Quellcode:
oder
FreeAndNil(PopupMenu.PopupComponent);
Delphi-Quellcode:
PopupMenu.PopupComponent.Free;
PopupMenu.PopupComponent := nil; |
Re: Problem mit Komponente entfernen
Zitat:
Gruß Hawkeye |
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 ^^ |
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? |
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: |
Re: Problem mit Komponente entfernen
Durch das
Delphi-Quellcode:
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.
imgnew:=TImage.Create(self);
Abhilfe wurde ja bereits beschrieben:
Delphi-Quellcode:
PopupMenu.PopupComponent.Free;
PopupMenu.PopupComponent := nil; |
Re: Problem mit Komponente entfernen
Hab ich versucht, funktioniert allerdings nicht
|
Re: Problem mit Komponente entfernen
Durch
Delphi-Quellcode:
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
PopupMenu.PopupComponent := nil;
Delphi-Quellcode:
eine Komponente freizugeben, die bereits über das Popupmenü gelöscht wurde, dann knallt es.
imgnew.Free;
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 |
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:
anstelle von
imgnew := TImage.Create(nil);
Delphi-Quellcode:
imgnew := TImage.Create(self);
|
Re: Problem mit Komponente entfernen
So, nun funktionierts! :thumb:
Danke für die Hilfe :!: |
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:31 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