Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Object.Free (https://www.delphipraxis.net/36005-object-free.html)

Alter Mann 14. Dez 2004 16:11


Object.Free
 
Hallo,

abhängig von einem Suchbegriff wird ein Objekt in einer Liste gespeichert.

Delphi-Quellcode:
  if POS('DISK', DStr) <> 0 then Result := TIDEDrive.Create(DeviceID)
  else
  if POS('CDROM', DStr) <> 0 then Result := TCDROMDrive.Create(DeviceID)
  else Result := nil;
Sowohl TIDEDrive als auch TCDROMDrive sind beide von TObject abgeleitet.
Result wird, wie geschrieben in eine Liste vom Typ TList gespeichert;
Beim Freigeben kommt es jedoch zur ZV, da ich nicht weiss hinter welchen
Eintrag sich welches Objekt verbirgt.

Delphi-Quellcode:
destructor TxxxXXXXX.Destroy;
var
  I : Integer;
begin
  for I := FList.Count -1 downto 0 do
  begin
    TObject(FList.Items[I]^).Free;
    FList.Delete(I);
  end;
  FList.Free;
  inherited Destroy;
end;
Auch der is-operator hilft nicht weiter. Muss ich die Zuweisung anders gestallten, so in der Art

Result := Ptr(TIDEDrive.Create(DeviceID)) ???

Bin für jede Antwort dankbar.

mirage228 14. Dez 2004 16:17

Re: Object.Free
 
Hi,

verwende doch die Klasse Delphi-Referenz durchsuchenTObjectList aus der Unit Delphi-Referenz durchsuchenContnrs. Die nimmt Dir einiges an Arbeit ab.

mfG
mirgae228

jim_raynor 14. Dez 2004 17:48

Re: Object.Free
 
Zitat:

Zitat von Alter Mann
Hallo,

abhängig von einem Suchbegriff wird ein Objekt in einer Liste gespeichert.

Delphi-Quellcode:
  if POS('DISK', DStr) <> 0 then Result := TIDEDrive.Create(DeviceID)
  else
  if POS('CDROM', DStr) <> 0 then Result := TCDROMDrive.Create(DeviceID)
  else Result := nil;
Sowohl TIDEDrive als auch TCDROMDrive sind beide von TObject abgeleitet.
Result wird, wie geschrieben in eine Liste vom Typ TList gespeichert;
Beim Freigeben kommt es jedoch zur ZV, da ich nicht weiss hinter welchen
Eintrag sich welches Objekt verbirgt.

Delphi-Quellcode:
destructor TxxxXXXXX.Destroy;
var
  I : Integer;
begin
  for I := FList.Count -1 downto 0 do
  begin
    TObject(FList.Items[I]^).Free;
    FList.Delete(I);
  end;
  FList.Free;
  inherited Destroy;
end;
Auch der is-operator hilft nicht weiter. Muss ich die Zuweisung anders gestallten, so in der Art

Result := Ptr(TIDEDrive.Create(DeviceID)) ???

Bin für jede Antwort dankbar.

Wenn du eine ganz normale TList verwendest (wovon ich jetzt ausgehe) darfst du nicht mit ^ dereferenzieren. Ein Objekt ist nur ein Pointer. Eine derefenzierung wirkt sich daher fatal aus.


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