Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Frage zu TFileStream (https://www.delphipraxis.net/117977-frage-zu-tfilestream.html)

franky.f 29. Jul 2008 13:23


Frage zu TFileStream
 
Hallo,

mich beschäftigt gerade folgende Frage:

Warum klappt folgendes nicht?
(Der Sinn sei einmal dahingestellt, es geht nur ums Prinzip ...)

Delphi-Quellcode:
procedure TForm1.TestFileStream;
var
  FFileStream1: TFileStream;
  FFileStream2: TFileStream;

begin
  // Die Datei ist vorhanden und weder schreib- noch sonst irgendwie geschützt, ganz normal eben
  FFileStream1 := TFileStream.Create('C:\TestDatei.txt', fmOpenRead, fmShareExclusive);

  // hier wird der eine Stream dem anderen zugewiesen,
  // also FFileStream1 und FFileStream2 müssten auf die selbe Speicheradresse zeigen
  FFileStream2 := FFileStream1;

  // hier wird FFileStream2 freigegeben, dann müsste doch eigentlich auch FFileStream1 NIL sein oder ?
  FreeAndNil(FFileStream2);

  if FFileStream1 <> nil then
  begin
    // und das hier dürfte niemals erreicht werden.
    FreeAndNil(FFileStream1);
    // tut es aber :-(
  end;
end;
Das ganze passiert in Delphi 7.

Danke und Gruß
Frank

alleinherrscher 29. Jul 2008 13:31

Re: Frage zu TFileStream
 
So jetzt aber:

Deine Variable FFilestream2 wird auf Nil gesetzt und der Speicher der hinter dem Pointer steckt, freigegeben.
Allerdings enthält FFilesStream1 immer noch den Pointer, also die Adresse auf den freigegebenen Speicherbereich. Wenn du jetzt mit FFilestream1 auf den Bereich zugreifen willst, gibts sicher ne Exception oder so...

Grüße

//edit: sorry, wegen den ganzes edit's ;)

chaosben 29. Jul 2008 13:33

Re: Frage zu TFileStream
 
Hi Frank! Herzlich Willkommen in der DP! :hi:

Du hast dir die Antwort schon fast selbst gegeben:
Delphi-Quellcode:
// hier wird der eine Stream dem anderen zugewiesen,
// also FFileStream1 und FFileStream2 müssten auf die selbe Speicheradresse zeigen
FFileStream2 := FFileStream1;
Durch FreeAndNil wird dann nur FileStream2 auf nil gesetzt während FileStream1 weiterhin auf einen Speicher zeigt. Daher ergibt die Abfrage FileStream1 = nil false.

DeddyH 29. Jul 2008 13:36

Re: Frage zu TFileStream
 
Du meinst false ;)

chaosben 29. Jul 2008 13:40

Re: Frage zu TFileStream
 
Zitat:

Zitat von DeddyH
Du meinst false ;)

Na klar ... danke fürs Aufpassen. :)

franky.f 29. Jul 2008 16:45

Re: Frage zu TFileStream
 
Hallo und DANKE,

jetzt blick ich, glaube ich, durch. :hello:

Gruß
Frank

DelphiManiac 30. Jul 2008 11:20

Re: Frage zu TFileStream
 
Hi franky, von mir auch nochmals ein Herzliches Willkommen!

Dein Problem wurde ja schon gelöst, habe nur noch einen kleinen Tipp für dich:

Delphi-Quellcode:
...
  if FFileStream1 <> nil then // kannst du auch mit "if Assigned(FFileStream1) then" prüfen, das macht intern auch den <> nil  Vegleich, ist nur eine Schönheitssache...
  begin
    // und das hier dürfte niemals erreicht werden.
    FreeAndNil(FFileStream1);
    // tut es aber :-( 
  end;
end;
Viele Grüße
DelphiManiac


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