Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Speicherfrage dynamische ListView (https://www.delphipraxis.net/68215-speicherfrage-dynamische-listview.html)

ranftl 26. Apr 2006 13:16


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

marabu 26. Apr 2006 13:25

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

Der_Unwissende 26. Apr 2006 13:29

Re: Speicherfrage dynamische ListView
 
Zitat:

Zitat von ranftl
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

Hi,
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:
TListView.Create(Form1)
eine Listview erzeugen, würde diese nicht das Ende von Form1 überdauern (im Speicher). In dem Fall musst du dich um nichts kümmern

Zitat:

Zitat von ranftl
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.

Dazu kannst du einfach als Owner nil übergeben. Die Listview ganz normal anlegen, mittels
Delphi-Quellcode:
Form1.InsertControl(Listview)
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)

Gruß Der Unwissende

Sharky 26. Apr 2006 13:31

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:
  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;
Wichtig ist dabei auch das man nicht vergisst den Speicher wieder freizugeben welchen man eventuell Reserviert hat um z.B. einen Record über die Delphi-Referenz durchsuchen.Data Eigenschaft eines TListItems an ein Item zu binden.

ranftl 26. Apr 2006 15:21

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

jim_raynor 26. Apr 2006 15:33

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?

marabu 26. Apr 2006 17:42

Re: Speicherfrage dynamische ListView
 
Richtig:

Delphi-Quellcode:
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;
Grüße vom marabu


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