Stefan Koschke
2011-04-01 06:19:32 UTC
Hallo zusammen,
schlechter Betreff, ich weiß ;-)
Folgendes Problem:
Ich habe eigene Klassen für den Zugriff auf Datenbanktabellen
geschaffen, die sehen skizziert etwa so aus:
unit class_tabports;
interface
uses DB, ADODB, Forms, SysUtils, Variants;
type
TTabports = class(TObject)
private
{ private-Deklarationen }
query: TAdoQuery;
protected
{ protected-Deklarationen }
public
{ public-Deklarationen }
constructor Create;
destructor Destroy; override;
procedure Update;
...
// published
{ published-Deklarationen }
end;
implementation
constructor TTabports.Create;
var
dbn: string;
begin
inherited Create;
query := TAdoQuery.Create(Nil);
... query verbinden
end;
destructor TTabports.Destroy;
begin
if query.Active = true then
query.Close;
if query <> Nil then
query.Free;
inherited;
end;
procedure TTabports.Update;
begin
query.requery;
end;
...
Diese Klasse wird im Programm irgendwomit .Create erzeugt und nach
Benutzungsende wieder mit .Free zerstört.
Unter bestimmten Umständen kann es aber vorkommen, daß das .Free doppelt
aufgerufen wird, daher hatte ich eine Abfrage vorgeschaltet
if meineKlasse <> Nil then
meineKlasse.free;
Leider funktioniert das nicht, weil die Klasse trotz .Free nicht Nil ist
und der nächste Zerstörungsversuch einen Laufzeitfehler erzeugt.
Ich könnte nun überall FreeAndNil(meineKlasse) verwenden, richtig?
Oder mach ich da generell was falsch?
Ciao
Stefan
schlechter Betreff, ich weiß ;-)
Folgendes Problem:
Ich habe eigene Klassen für den Zugriff auf Datenbanktabellen
geschaffen, die sehen skizziert etwa so aus:
unit class_tabports;
interface
uses DB, ADODB, Forms, SysUtils, Variants;
type
TTabports = class(TObject)
private
{ private-Deklarationen }
query: TAdoQuery;
protected
{ protected-Deklarationen }
public
{ public-Deklarationen }
constructor Create;
destructor Destroy; override;
procedure Update;
...
// published
{ published-Deklarationen }
end;
implementation
constructor TTabports.Create;
var
dbn: string;
begin
inherited Create;
query := TAdoQuery.Create(Nil);
... query verbinden
end;
destructor TTabports.Destroy;
begin
if query.Active = true then
query.Close;
if query <> Nil then
query.Free;
inherited;
end;
procedure TTabports.Update;
begin
query.requery;
end;
...
Diese Klasse wird im Programm irgendwomit .Create erzeugt und nach
Benutzungsende wieder mit .Free zerstört.
Unter bestimmten Umständen kann es aber vorkommen, daß das .Free doppelt
aufgerufen wird, daher hatte ich eine Abfrage vorgeschaltet
if meineKlasse <> Nil then
meineKlasse.free;
Leider funktioniert das nicht, weil die Klasse trotz .Free nicht Nil ist
und der nächste Zerstörungsversuch einen Laufzeitfehler erzeugt.
Ich könnte nun überall FreeAndNil(meineKlasse) verwenden, richtig?
Oder mach ich da generell was falsch?
Ciao
Stefan