![]() |
erzeugts IImage Löschen?
Hallo Alle!
Wenn ich so ein TImage erzeuge:
Delphi-Quellcode:
Wie kann ich es dann wider löschen?
I := I + 1;
Mein_Bild[I] := TImage.Create(Form1); With Mein_Bild[I] do begin Parent := Form1; ...... Mit z.B.
Delphi-Quellcode:
bekomme ich eine Fehlermeldung: Zugriffsverletzung bei Adresse ...
Mein_Bild[0].Free
Gruß Heike |
Re: erzeugts IImage Löschen?
Hi,
Also normalerweise dürfte das kein Problem sein. Zeig mal bisschen Code. Folgendes funktioniert nämlich ohne Probleme...
Delphi-Quellcode:
var
Test: Array[0..1] of TImage; procedure TForm1.Button1Click(Sender: TObject); var i: Integer; begin for i:= 0 to 1 do begin Test[i] := TImage.Create(Self); with Test[i] do begin Parent := Self; Picture.Bitmap := ABitmap; Left := i* 100; end; end; end; procedure TForm1.Button2Click(Sender: TObject); var i: Integer; begin for i:= 0 to 1 do Test[i].Free end; |
Re: erzeugts IImage Löschen?
Mein_Bild[0].Free - i wird wohl bei 0 anfangen schätz Ich mal dann gibt es 0 nicht Mein_Bild[1].Free.
|
Re: erzeugts IImage Löschen?
Hi.
Ich erzeuge (wie oben) z.B. 10 TImages (von 0 bis 9). Also: Mein_Bild[0] Mein_Bild[1] Mein_Bild[2] Mein_Bild[3] ..... Dann möchte ich z.B. Mein_Bild[2] löschen. Und genau das klappt nicht? Gruß Heike |
Re: erzeugts IImage Löschen?
Mit welchem Wert wird I initialisiert?
Wenn 0, dann fängt er erst bei 1 an Bilder zu erzeugen, weil ja vorher I erhöht wird. Zeig mal ein wenig mehr Code. |
Re: erzeugts IImage Löschen?
Hi.
So erzeuge ich die Images:
Delphi-Quellcode:
Wenn ich mit der Maus auf dem entsprechende Bild klicke soll es löschen:
Var I:Integer;
... I := 0; ... I := I + 1; Mein_Bild[I] := TImage.Create(Form1); With Mein_Bild[I] do begin Parent := Form1; Width := Bild.Width div 5; Height := Bild.Height div 5; Tag := I; Stretch := True; Picture.Bitmap := Bild; OnClick := LosClick; end;
Delphi-Quellcode:
Gruß
procedure TForm1.LosClick(Sender: TObject);
begin Mein_Bild[TImage(Sender).Tag].Free; end; Heike |
Re: erzeugts IImage Löschen?
Zum löschen: Warum so kompliziert? Gib doch direkt den Sender frei.
Zu deinem Problem: Mein_Bild[0] wird nie erzeugt, das erste erzeugte Bild ist Mein_bild[1] |
Re: erzeugts IImage Löschen?
Und das zum Dritten mal. :wink:
|
Re: erzeugts IImage Löschen?
Hi!
Zitat:
Zitat:
der richtge Sender übergeben. Trozdem bekomme ich die Fehlermeldung. Da komme ich einfach nicht dahinter. Gruß Heike |
Re: erzeugts IImage Löschen?
Hallo,
sehe ich das richtig, dass Du in der Click-Methode eines TImage selbiges freigeben möchtest? Das kann nicht funktionieren. Nachdem die Routine fertig ist, geht es ja zurück in den Code von TImage. Leider existiert das TImage aber jetzt nicht mehr. Also krachts. Gruß xaromz |
Re: erzeugts IImage Löschen?
Zitat:
Gruß Heike |
Re: erzeugts IImage Löschen?
Du könntest das Image im .onClick nur markieren bzw deren Index wegschreiben und dann aüßerhalb des Images freigeben.
|
Re: erzeugts IImage Löschen?
Hallo,
die Freigabe einer visuellen Komponente im OnClick() ist für sich genommen kein Problem. Vielleicht liegt der Fehler an einer anderen Stelle? Freundliche Grüße |
Re: erzeugts IImage Löschen?
Hallo,
Zitat:
Delphi-Quellcode:
Gruß
procedure TControl.Click; (vereinfacht)
begin if Assigned(FOnClick) then FOnClick(Self); // OnClick aufrufen, Self wird freigegeben // Jetzt sind wir hier, in einem nicht mehr existirenden Objekt. Irgendwie blöd, oder? end; // Zurück nach TControl.WMLButtonUp -> Upps, AV! xaromz |
Re: erzeugts IImage Löschen?
Hallo Martin,
es wird nichts passieren, solange kein Zugriff auf Daten des freigegebenen Objektes erfolgt. Ziehe TImage-Komponenten auf eine Form und verwende diesen gemeinsamen event handler:
Delphi-Quellcode:
Es funktioniert, aber Borland (D7 VCL) warnt pauschal vor einer solchen Vorgehensweise.
procedure TDemoForm.ImageClick(Sender: TObject);
begin with Sender as TComponent do Free; end; Um auch einmal dieses wundervolle Wort zu verwenden: Grundsätzlich würde ich es ganz anders machen. Ich habe schon mit der von Markus erwähnten Vormerkung gearbeitet und im Event OnIdle() die Komponenten freigegeben, aber besser noch gefällt mir der Ansatz über eine eigene application message (PostMessage) und einen speziellen message handler. Freundliche Grüße |
Re: erzeugts IImage Löschen?
Hallo,
Zitat:
Versuche mal folgendes:
Delphi-Quellcode:
Das ist jetzt zwar konstruiert, aber wenn zufälllig ein neues Objekt erzeugt wird, das den Speicher des zerstörten verwendet (moderne Speichermanager machen sowas gerne), dann hast Du ein Problem.
procedure TForm1.Image1Click(Sender: TObject);
var P: Pointer; begin P := Pointer(Sender); TControl(Sender).Free; FillChar(P^, 4, 0); // Objektspeicher überschreiben end; Zitat:
Gruß xaromz |
Re: erzeugts IImage Löschen?
Hi xaromz!
Zitat:
Gruß Heike |
Re: erzeugts IImage Löschen?
Hallo Heike,
in ![]() Gruß Hawkeye |
Re: erzeugts IImage Löschen?
Zitat:
Klappt wunderbar und vorallen ohne Fehler ;-) Gruß Heike |
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:36 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