![]() |
Speicherfrage dynamische ListView
Hallo Leute!
Ich habe einmal eine grundsätzliche Frage zu dem dynamischen erstellen von Controls. In meinen Programm erstelle ich dynamisch eine ListView, wenn in der ersten bereits so viele Daten sind das es unübersichtlich wird. Ich erstelle die Listviews mit Form1(TForm) als Parent. Ein paar Buttons werden auch noch dynamisch erzeugt ebeanfalls Form1(TForm) als Parent. Meine Frage: 1.) Wann werden die Buttons und die ListView die dynamisch erstellt wurden wieder gelöscht bzw. deren Speicher freigegeben. Muss ich mich manuell darum kümmern oder erledigt sich das automatisch beim zerstören der Form1 2.) Wie kann ich eine Listview ohne die Form1 zu zerstören wieder loswerden z.B.: die Daten werden wieder weniger also wird die zweite Listview nicht mehr benötigt. Danke lg christian |
Re: Speicherfrage dynamische ListView
Hallo Christian,
der Owner ist für das Zerstören deiner Controls verantwortlich. Hast du den auf NIL gesetzt, dann bist du verantwortlich. Wenn du das Control in deinem Code vorzeitig zerstören willst, dann tue es einfach. Grüße vom marabu |
Re: Speicherfrage dynamische ListView
Zitat:
wenn du einen Owner festlegst (am einfachsten ist dies in der Regel im Konstruktor möglich), dann wird alles zu diesem Owner gehörende mit ihm gelöscht. Würdest du also mit
Delphi-Quellcode:
eine Listview erzeugen, würde diese nicht das Ende von Form1 überdauern (im Speicher). In dem Fall musst du dich um nichts kümmern
TListView.Create(Form1)
Zitat:
Delphi-Quellcode:
dem Form hinzufügen und analog das Element mit RemoveControl aus der Liste aller Controls von Form1 entfernen, bevor du es mit Free wieder freigibst. (hier musst du dich halt komplett und immer um die Freigabe kümmern)
Form1.InsertControl(Listview)
Gruß Der Unwissende |
Re: Speicherfrage dynamische ListView
Als Ergänzung zu marabus Betrag:
Ich persönlich mache es immer so das ich grundsätzlich den Speicher den ich zur Laufzeit "angefordert" (um z.B. eine Klasse zu erzeugen) auch selber wieder freigebe. Unabhängig davon ob dies durch den Owner geschehen würde.
Delphi-Quellcode:
Wichtig ist dabei auch das man nicht vergisst den Speicher wieder freizugeben welchen man eventuell Reserviert hat um z.B. einen Record über die
private
myListView : TListView; public { Public-Deklarationen } end; var DemoForm: TDemoForm; implementation {$R *.dfm} procedure TDemoForm.Button1Click(Sender: TObject); begin myListView := TListView.Create(self); end; procedure TDemoForm.FormDestroy(Sender: TObject); begin if (Assigned(myListView)) then begin FreeAndNil(myListView); end; end; ![]() |
Re: Speicherfrage dynamische ListView
Hallo nochmal!
Danke für die schnellen Antworten. Jetzt habe ich noch eine letzte Frage? Ist es irgendwie möglich einen TSplitter dynamisch zu erzeugen bzw. so das er funktioniert ;) Folgendes Problem: Ich habe es nun endlich geschaft meine ListViews dynamisch zu erzeugen besser gesagt eine ist fix vorhanden und die zweite wird zu Laufzeit hinzugefügt. Damit sich die beiden den Platz auf den Formular aufteilen wollte ich noch dynamisch einen Splitter einfügen. Dies klappt allesdrings nicht so recht. Ich kann ihn zwar erstellen und auch anzeigen doch leider kann man ihn nicht bewegen oder sonst etwas. Ist derzeit eigentlich nur ein Strich der weder richtig verteilt noch lässt er es zu das man das manuell erledigt. Danke Liebe Grüße Christian |
Re: Speicherfrage dynamische ListView
Mmh. Bei den Splittern und bei den Komponenten muss auf jeden Fall die Eigenschaft Align korrekt gesetzt werden ... Hast du daran gedacht?
|
Re: Speicherfrage dynamische ListView
Richtig:
Delphi-Quellcode:
Grüße vom marabu
type
TDemoForm = class(TForm) ListView: TListView; TopActionPanel: TPanel; StatusBar: TStatusBar; AddButton: TButton; RemoveButton: TButton; procedure AddButtonClick(Sender: TObject); procedure RemoveButtonClick(Sender: TObject); procedure FormCreate(Sender: TObject); private MoreView: TListView; Splitter: TSplitter; public end; var DemoForm: TDemoForm; implementation {$R *.dfm} procedure TDemoForm.AddButtonClick(Sender: TObject); begin MoreView := TListView.Create(self); with MoreView do begin Align := alRight; Width := self.Width shr 1; Parent := self; end; Splitter := TSplitter.Create(self); with Splitter do begin Align := alRight; Parent := self; end; end; procedure TDemoForm.RemoveButtonClick(Sender: TObject); begin FreeAndNil(MoreView); FreeAndNil(Splitter); end; procedure TDemoForm.FormCreate(Sender: TObject); begin ListView.Align := alClient; end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 15:32 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