AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

Dispose auf Objects einer TCheckListBox

Ein Thema von LeoDD · begonnen am 20. Okt 2008 · letzter Beitrag vom 20. Okt 2008
Antwort Antwort
LeoDD

Registriert seit: 30. Jul 2003
43 Beiträge
 
Delphi 2010 Professional
 
#1

Dispose auf Objects einer TCheckListBox

  Alt 20. Okt 2008, 10:16
Hallo,

und wieder eine Sache, bei der ich nicht weiterkomme und auch keine wirkliche Hilfe im Netz gefunden habe.

Ich verwende eine TCheckListBox und hänge an die Einträge noch Daten. Hier die Funktion, die die Checklistbox füllt. Die Daten dazu stammen aus einer abgeleiteten TList Klasse namens ASList:

Delphi-Quellcode:
procedure TASManForm.FillASListBox(ASList: TTC7AutoStart; FilterSet: TListFilter);
var
  i: integer;
  ASStruc: TTC7AutoStartStruc;
  ASPointer: PTTC7AutoStartStruc;
begin

  DisposeList(ListBox_AS); //<- hier kracht es beim zweiten Durchlauf, Procedure ist unten gelistet
  ListBox_AS.Clear;

  if ASList.Count>0 then begin
    ListBox_AS.Items.BeginUpdate;
    for i:=0 to ASList.Count-1 do begin
      ASPointer := ASList[i];
      ASStruc := ASPointer^;
      if ASStruc.AutoStartDangerLevel in FilterSet then begin
        ListBox_AS.Items.AddObject(ASStruc.FileData.FileName, TObject(ASPointer));
      end;
    end;
    ListBox_AS.Items.EndUpdate;
  end;

end;
Funktioniert wunderbar. Die Daten werden angelegt und in der Liste verankert.

Hier ist meine bisherige DisposeList Procedure:

Delphi-Quellcode:
//TCheckListBox
procedure DisposeList(List: TCheckListBox);
var
  c: integer;
  i: integer;
  ASPointer: PTTC7AutoStartStruc;
begin
  c := List.Items.Count;

  if c>0 then begin
    for i:=0 to c-1 do begin
      if Assigned(List.Items.Objects[i]) then begin
// ASPointer := PTTC7AutoStartStruc(List.Items.Objects[i]);
        Dispose(PTTC7AutoStartStruc(List.Items.Objects[i])); //<- hier kracht es
      end;
    end;
  end;
end;
Ich hab es schon mit verschiedenen Typecasts (TObject, PTTC7AutoStartStruc) probiert, keine Chance.

Habt ihr eine Ahnung, wo ich noch einen Denkfehler habe? Laut Debugger ist jeder Pointer assigned und ich kann auch noch die Daten auslesen, bis zum Dispose. Führe ich dann die Disposezeile auf gibts eine schicke EInvalidPointer Exception
Erst wenn man dreimal auf Holz klopfen will, stellt man fest, dass die Welt nur noch aus Plastik und Aluminium besteht.
  Mit Zitat antworten Zitat
shmia

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

Re: Dispose auf Objects einer TCheckListBox

  Alt 20. Okt 2008, 11:08
Willst du deine Daten nicht lieber in ein Objekt packen?
In diesem Fall sieht das freigeben so aus:
Delphi-Quellcode:
procedure TStringsFreeObjects(sl: TStrings);
var
   i: Integer;
   o: TObject;
begin
   for i := sl.Count-1 downto 0 do
   begin
      o := sl.Objects[i];
      if Assigned(o) then
      begin
         o.Free;
         sl.Objects[i] := nil; // merken, dass Objekt freigegeben wurde
      end;
   end;
end;
...
TStringsFreeObjects(CheckListBox1.Items);
In deiner procedure DisposeList hast du übrigens vergessen, die Objekt-Zeiger auf nil zu setzen.
Dadurch besteht eine Chance, dass du die Daten nochmals freigibst.
Andreas
  Mit Zitat antworten Zitat
LeoDD

Registriert seit: 30. Jul 2003
43 Beiträge
 
Delphi 2010 Professional
 
#3

Re: Dispose auf Objects einer TCheckListBox

  Alt 20. Okt 2008, 11:50
OK, das mit dem nil hab ich noch hinzugefügt. Geht dennoch nicht.

Gibt es noch andere Lösungsmöglichkeiten? Die Einträge in Objekte zu verwandeln stelle ich mir recht schwierig vor.

Edith hat mich da auf was aufmerksam gemacht...
Ich Depp hab vergessen, beim Füllen der Objektliste ein New einzubauen, da kanner natürlich nur wenig disposen...

Danke an alle, das Problem ist gelöst und ich kann wieder ruhig schlafen
Erst wenn man dreimal auf Holz klopfen will, stellt man fest, dass die Welt nur noch aus Plastik und Aluminium besteht.
  Mit Zitat antworten Zitat
Roachford
(Gast)

n/a Beiträge
 
#4

Re: Dispose auf Objects einer TCheckListBox

  Alt 20. Okt 2008, 11:53
1. Du gibst Elemente mit Dispose() frei, aber ich sehe nirgendwo eine Codestelle wo du dazu auch das Gegenstück ausführst, also New() vor dem hinzufügen
2. Ich sehe bisher nur, dass du die Zeiger aus einer anderen Liste nimmst und mit in die Objects[] Eigenschaft legst. Wenn du dann diese Zeiger freigibst, dann zeigt die andere Liste genauso ins Datennirwana.
  Mit Zitat antworten Zitat
LeoDD

Registriert seit: 30. Jul 2003
43 Beiträge
 
Delphi 2010 Professional
 
#5

Re: Dispose auf Objects einer TCheckListBox

  Alt 20. Okt 2008, 12:00
Wie gesagt ist das Problem tatsächlich ein fehlendes New() gewesen.

Mich würde dennoch interessieren, wieso die Daten trotzdem "accessible" waren und ausgelesen wurden, obwohl das New() fehlte.

Die neue Proc sieht nun so aus:

Delphi-Quellcode:
procedure TASManForm.FillASListBox(ASList: TTC7AutoStart; FilterSet: TListFilter);
var
  i: integer;
  ASStruc: TTC7AutoStartStruc;
  ASPointer: PTTC7AutoStartStruc;
begin

  DisposeList(ListBox_AS);
  ListBox_AS.Clear;

  if ASList.Count>0 then begin
    ListBox_AS.Items.BeginUpdate;
    for i:=0 to ASList.Count-1 do begin
      New(ASPointer); //<- hrhr
      ASPointer := ASList[i];
      ASStruc := ASPointer^;
      if ASStruc.AutoStartDangerLevel in FilterSet then begin
        ListBox_AS.Items.AddObject(ASStruc.FileData.FileName, TObject(ASPointer));
      end;
    end;
    ListBox_AS.Items.EndUpdate;
  end;

end;
Erst wenn man dreimal auf Holz klopfen will, stellt man fest, dass die Welt nur noch aus Plastik und Aluminium besteht.
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 16:21 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