AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Speicherfrage dynamische ListView

Ein Thema von ranftl · begonnen am 26. Apr 2006 · letzter Beitrag vom 26. Apr 2006
Antwort Antwort
ranftl

Registriert seit: 15. Mär 2006
23 Beiträge
 
#1

Speicherfrage dynamische ListView

  Alt 26. Apr 2006, 14:16
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
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#2

Re: Speicherfrage dynamische ListView

  Alt 26. Apr 2006, 14:25
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
  Mit Zitat antworten Zitat
Der_Unwissende

Registriert seit: 13. Dez 2003
Ort: Berlin
1.756 Beiträge
 
#3

Re: Speicherfrage dynamische ListView

  Alt 26. Apr 2006, 14:29
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 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 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 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
  Mit Zitat antworten Zitat
Benutzerbild von Sharky
Sharky

Registriert seit: 29. Mai 2002
Ort: Frankfurt
8.252 Beiträge
 
Delphi 2006 Professional
 
#4

Re: Speicherfrage dynamische ListView

  Alt 26. Apr 2006, 14:31
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.
Stephan B.
  Mit Zitat antworten Zitat
ranftl

Registriert seit: 15. Mär 2006
23 Beiträge
 
#5

Re: Speicherfrage dynamische ListView

  Alt 26. Apr 2006, 16:21
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
  Mit Zitat antworten Zitat
Benutzerbild von jim_raynor
jim_raynor

Registriert seit: 17. Okt 2004
Ort: Berlin
1.251 Beiträge
 
Delphi 5 Standard
 
#6

Re: Speicherfrage dynamische ListView

  Alt 26. Apr 2006, 16:33
Mmh. Bei den Splittern und bei den Komponenten muss auf jeden Fall die Eigenschaft Align korrekt gesetzt werden ... Hast du daran gedacht?
Christian Reich
Schaut euch mein X-COM Remake X-Force: Fight For Destiny ( http://www.xforce-online.de ) an.
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#7

Re: Speicherfrage dynamische ListView

  Alt 26. Apr 2006, 18:42
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
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:33 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