![]() |
TObjectList Object soll sich selbst löschen
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo liebe DP-Gemeinde,
Seit einiger Zeit verzweifle ich nun schon an folgendem Problem: Ich habe eine Scrollbox, die zur Laufzeit mit Panels gefüllt wird. Auf jedem Panel befindet sich ein Button, der das entsprechende Panel wieder aus der Scrollbox herrauslöscht. Das Ganze ist also wie eine Listbox, bei der jedes Panel einem Item entspricht und über einen Löschen-Button verfügt. (Siehe Bild im Anhang) Die Panels und die Buttons befinden in jeweils einer ObjectListe (TObjectList). Drückt man nun auf den Button, um das entsprechende Item zu löschen, so bekomme ich eine Zugriffsverletzung. Über das OnClick-Ereignis des Buttons kann man zwar das Panel löschen, der Button kann sich aber scheinbar nicht aus seiner eigenen ObjectListe herrauslöschen. Die Zeile
Code:
im OnClick-Ereignis der Button funktioniert leider genauso wenig.
(Sender as TButton).Free;
Der Owner der Panels und Buttons ist die Scrollbox. Nun ist meine Frage, was ich falsch mache, oder ob es noch eine Möglichkeit gibt soewtwas zu realisieren. Danke im Voraus! |
AW: TObjectList Object soll sich selbst löschen
Delphi-Quellcode:
oder einfach nur
(Sender as TButton).Free;
Delphi-Quellcode:
funktioniert und gibt das Objekt erfolgreich frei, auch wenn es am Ende eines Button-OnClick aufgerufen wird.
Sender.Free;
Der Button kennt aber die ObjektListe nicht, bzw. er weiß garnicht daß er in einer Drinsteckt, also kann er sich auch nicht selber aus soeiner Liste rauslöschen. Das Entfernen aus der Objekliste mußt du also selber machen. Du könntest dir auch eine eigene komponente von TButton ableiten, den Destructor überschreiben und darin den Button aus der entsprechenden Objektliste entfernen. So oder so, wenn ein Objekt sich irgendwo rauslöschen soll, sobald es freigegeben wird, dann mußt du diesem die Objektliste bekannt machen (diese in einem Feld in dem Objekt speichern) und beim Freigeben des Objektes prüfen, ob da eine Objektliste eingetragen ist und wenn ja, dann wird das Objekt aus dieser Liste entfernt. Im Gegenzug muß natürlich auch der Eintrag zurückgesetzt werden, wenn das Objekt aus der Liste entfernt wird, ohne es freizugeben. |
AW: TObjectList Object soll sich selbst löschen
Folgender Satz beschreibt dein Problem:
Zitat:
Das Free muss "außerhalb" erfolgen. Möchte man dieses Event-basiert haben, dann bleibt nur die Verwendung von ![]() |
AW: TObjectList Object soll sich selbst löschen
Uffa,
also dass der Button die Objektliste nicht kennt und er sich nicht direkt selbst löschen kann erscheint mir einleuchtend. Allerdings verstehe ich nicht so ganz, wie ich das "free" außerhalb platzieren soll. Reicht es denn, wenn ich z.b. TButton ableite und im Destructor den Button aus der Objektliste entferne? So z.b.:
Code:
Denn eigentlich weiß der Button doch immer noch nicht, dass die Objektliste existiert...
destructor TMyButton.Destroy;
begin objektliste.DeleteItem(index); inherited; end; |
AW: TObjectList Object soll sich selbst löschen
Zitat:
![]() |
AW: TObjectList Object soll sich selbst löschen
Okay vielen Dank an alle! Habs mit Hilfe von Postmessage und dem Link von shmia gemacht und jetzt klappts wunderbar.:)
|
AW: TObjectList Object soll sich selbst löschen
Zitat:
OnClick wird von ![]() Nach dem Ausführen von OnClick wird nicht nochmal auf den Sender zugegriffen. Darum "kann" man, in diesem Fall, den Sender auch löschen, da man quasi auf einem anderem Ast sitzt. Zitat:
Zitat:
Oder es gibt nur eine "globale" Liste, wo er sich dann rauslöscht. |
AW: TObjectList Object soll sich selbst löschen
Zitat:
Bei mir sieht das so aus: Zitat:
|
AW: TObjectList Object soll sich selbst löschen
Nachfolgendes Projekt macht bei mir keine Probleme.
Wichtig ist wohl nur, ob der Komponentencode nochmal auf "Self" zugreift. Wenn nicht, gibt es keine Probleme.
Delphi-Quellcode:
unit fFreeTest;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) Button1: TButton; Button2: TButton; Button3: TButton; Button4: TButton; Button5: TButton; Button6: TButton; Button7: TButton; Button8: TButton; Button9: TButton; Button10: TButton; procedure ButtonClick(Sender: TObject); private { Private-Deklarationen } public { Public-Deklarationen } end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.ButtonClick(Sender: TObject); begin FreeAndNil(Sender); end; end. |
AW: TObjectList Object soll sich selbst löschen
Zitat:
Zitat:
PS: In Ereignisprozedur wie OnClose die Form freizugeben ist da schon schwerer. Zitat:
Delphi-Quellcode:
(siehe .dpr), bzw. genauer die
Application.Run;
Delphi-Quellcode:
behandelt die Window-Messages, und von dort aus wird letztendlich dein
TApplication.ProcessMessage
Delphi-Quellcode:
aufgerufen.
procedure WMLButtonUp(var Message: TWMLButtonUp); message WM_LBUTTONUP;
Wie gesagt, einen Button in seinem OnClick freizugeben ist kein Problem. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:56 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