AGB  ·  Datenschutz  ·  Impressum  







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

TCheckListbox Auto-Destroy Objects

Offene Frage von "Sereby"
Ein Thema von Sereby · begonnen am 22. Jun 2009 · letzter Beitrag vom 23. Jun 2009
Antwort Antwort
Sereby

Registriert seit: 31. Mär 2008
91 Beiträge
 
#1

TCheckListbox Auto-Destroy Objects

  Alt 22. Jun 2009, 09:48
Hiho,

Verwende: Delphi 2009

ich habe bei meiner TCheckListBox per AddItem auch ein RecordObject hinzugefügt.
Dieses enthält 2 String Variablen!

Und nun versuche ich, leider vergeblich bisher, diese Objekte bei destroy freizugeben mit folgendem Code

Code:
  TCheckListBox = class(CheckLst.TCheckListBox)
  public
    destructor Destroy; override;
  end;

destructor TCheckListBox.Destroy;
var
  I: Integer;
  O: TObject;
begin
  for I := 0 to Items.Count - 1 do
  begin
    O := Items.Objects[I];
    if Assigned(O) then FreeAndNil(O);
  end;

  inherited Destroy;
end;
das problem an dem Code ist, dass er bei Items.Count schon eine Exception wirft die folgendes besagt:
"Element ... hat kein übergeordnetes Fenster"

so.. nun bitte ich euch mir zu helfen und zu sagen, wie ich es erreiche dass er automatisch bei Destroy die hinzugefügten Objekte aus dem Speicher entfernt?!

MfG Sereby
  Mit Zitat antworten Zitat
shmia

Registriert seit: 2. Mär 2004
5.508 Beiträge
 
Delphi 5 Professional
 
#2

Re: TCheckListbox Auto-Destroy Objects

  Alt 22. Jun 2009, 11:04
1. )
Wenn du den Speicherplatz für den Record mit new angelegt hast, dann musst du ihn auch per dispose freigeben.
FreAndNil ist nur bei Objekten erlaubt.
2.)
Ich würde nicht TCheckListBox ableiten sondern das Freigeben im Event OnDestroy des Formulars ausführen:
Delphi-Quellcode:
procedure DisposeTStrings(sl: TStrings);
var
   i: Integer;
   p :Pointer;
begin
   for i := sl.Count-1 downto 0 do
   begin
      p := Pointer(sl.Objects[i]);
      if Assigned(p) then
      begin
         Dispose p;
         sl.Objects[i] := nil; // kann man sich auch schenken, soll doppelte Freigabe verhindern
      end;
   end;
end;
Andreas
  Mit Zitat antworten Zitat
Sereby

Registriert seit: 31. Mär 2008
91 Beiträge
 
#3

Re: TCheckListbox Auto-Destroy Objects

  Alt 22. Jun 2009, 11:19
wenn ich das aber bei ondestroy mache, dann muss ich der procedure von jeder checkedlistbox die eigenschaft items übergeben.
aber genau das will ich automatisiert haben, sodass ich das nicht bei jeder checklistbox machen muss.
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#4

Re: TCheckListbox Auto-Destroy Objects

  Alt 22. Jun 2009, 13:21
1. ist es immer der selbe Record auf den gezeigt wird?
2. Beachtest du die Laufrichtung der Schleife? Shmia hat diese leise bei sich richtig herum gemacht?
3. Beachtest du, dass der Pointer Typ deinem Datentyp-Zeiger entsprechen muss für das Dispose?
  Mit Zitat antworten Zitat
Sereby

Registriert seit: 31. Mär 2008
91 Beiträge
 
#5

Re: TCheckListbox Auto-Destroy Objects

  Alt 22. Jun 2009, 13:29
1. ja es ist immer das selbe record
2. wär mir spätestens beim testen aufgefallen ^^
3. hmm.. wieso musser das denn?
  Mit Zitat antworten Zitat
shmia

Registriert seit: 2. Mär 2004
5.508 Beiträge
 
Delphi 5 Professional
 
#6

Re: TCheckListbox Auto-Destroy Objects

  Alt 23. Jun 2009, 09:06
Zitat von Sereby:
wenn ich das aber bei ondestroy mache, dann muss ich der procedure von jeder checkedlistbox die eigenschaft items übergeben.
aber genau das will ich automatisiert haben, sodass ich das nicht bei jeder checklistbox machen muss.
Ja schon, aber schau mal du hast jetzt das Reservieren von Speicher und das Freigeben an zwei unterschiedlichen Stellen.
Es geht die Checklistbox doch gar nix an, was in Items.Objects[] gespeichert ist.
Wenn du 4 Checklistboxen auf diese Weise benützt, dann steht halt im OnDestroy ungefähr das:
Delphi-Quellcode:
procedure TForm1.FormDestroy(Sender:TObject);
begin
  DisposeTStrings(Checklistbox1.Items);
  DisposeTStrings(Checklistbox2.Items);
  DisposeTStrings(Checklistbox3.Items);
  DisposeTStrings(Checklistbox4.Items);
  ...
end;
Das ist eine saubere und klare Sache. Vielleicht willst du auch mal statt Records richtige Objekte in Items.Objects[] ablegt - dann kommst du mit destructor TCheckListBox.Destroy aber ins Schleudern.
Andreas
  Mit Zitat antworten Zitat
Blup

Registriert seit: 7. Aug 2008
Ort: Brandenburg
1.429 Beiträge
 
Delphi 10.4 Sydney
 
#7

Re: TCheckListbox Auto-Destroy Objects

  Alt 23. Jun 2009, 09:36
Soll sich die Checklistbox doch selbst um die Freigabe kümmern, dafür sind Komponenten da.
Delphi-Quellcode:
TZusatzDaten = class(TComponent)
  constructor Create(AOwner: TComponent; AS1, AS2: string); reintroduce;
private
  FS1: string;
  FS2: string;
public
  property S1: string read FS1 write FS1;
  property S2: string read FS2 write FS2;
end;

constructor TZusatzDaten.Create(AOwner: TComponent; AS1, AS2: string);
begin
  inherited Create(AOwner);
  FS1 := AS1;
  FS2 := AS2;
end;

ChecklistBox.AddItem('ItemA', TZusatzDaten.Create(CheckListBox, 'Text1', 'Text2'));
  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 21:46 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