Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Verständnisfrage Objektfreigabe (https://www.delphipraxis.net/135401-verstaendnisfrage-objektfreigabe.html)

WIng2005 10. Jun 2009 09:19


Verständnisfrage Objektfreigabe
 
Hallo Gemeinde,

ich habe ein Problem mit folgendem Code (grob gekürzt):

Delphi-Quellcode:
procedure TForm1.EditKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
var geraet:TGeraet;  
begin
try
  if (key=vk_return) or (key=vk_tab) then Begin
  try
    geraet:=Tgeraet.create(edit.Text);
  except
    //mach was
    exit;
  end;
//mach was
end;//if key
finally
freeandnil(geraet); //<- Zugriffsverletzung
end;
end;
Deklariere ich "geraet" global funktioniert es.

Delphi-Quellcode:

unit test;

interface

uses
  //

type
  TForm1 = class(TForm)
    //
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;


implementation
uses //
{$R *.dfm}

var geraet:TGeraet; //<- So funktioniert es


procedure TForm1.EditKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
Begin
//
end;
Hat irgendwer ne Idee, warum ich das lokal deklarierte geraet nicht freigeben kann?

DeddyH 10. Jun 2009 09:22

Re: Verständnisfrage Objektfreigabe
 
Wenn die If-Abfrage false liefert, wird das Objekt gar nicht erst erzeugt. Besser wäre es IMHO so:
Delphi-Quellcode:
procedure TForm1.EditKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
var geraet:TGeraet;  
begin
  if (key=vk_return) or (key=vk_tab) then Begin
  try
    geraet:=Tgeraet.create(edit.Text);
    try
      //machwas mit geraet
    finally
      freeandnil(geraet);
    end;
  except
    //mach was
    exit;
  end;
  //mach was
  end;//if key
end;

Muetze1 10. Jun 2009 09:25

Re: Verständnisfrage Objektfreigabe
 
Zitat:

Zitat von DeddyH
Wenn die If-Abfrage false liefert, wird das Objekt gar nicht erst erzeugt.

Und das Problem selbst wegen der AV kommt aber eigentlich eher daher, dass es eine lokale Variable ist und diese nicht intialisiert wird und dadurch ist die sehr sehr gross, dass die Variable nicht gerade nil ist.

DeddyH 10. Jun 2009 09:26

Re: Verständnisfrage Objektfreigabe
 
Stimmt, das vergaß ich noch zu erwähnen.

WIng2005 10. Jun 2009 09:37

Re: Verständnisfrage Objektfreigabe
 
Mmmh, ich ging davon aus, dass freeandnil prüft, ob es überhaupt etwas zum freigeben gibt und in dem Fall, dass die If-Abfrage false liefert eben nichts freigegeben wird.

DeddyH 10. Jun 2009 10:02

Re: Verständnisfrage Objektfreigabe
 
Ja, aber das setzt natürlich voraus, dass das Objekt mit nil initialisiert wird, was bei lokalen Variablen nicht der Fall ist (siehe Muetzes Post).

WIng2005 10. Jun 2009 10:13

Re: Verständnisfrage Objektfreigabe
 
Alles klar, das hilft mir weiter. Habt vielen Dank!!!


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