Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   AssignFile -> simples prinzip aber ich stolper trotzdem... (https://www.delphipraxis.net/160165-assignfile-simples-prinzip-aber-ich-stolper-trotzdem.html)

DerTobi 30. Apr 2011 11:38

Delphi-Version: 2010

AssignFile -> simples prinzip aber ich stolper trotzdem...
 
Hallo zusammen,

mir ist es schon fast peinlich das Problem zu schildern, da a.)es mein erster Post ist und b.) AssignFile eigentlich simpel genug sein sollte.

Bei folgendem Abschnitt schmeisst er mir eine Exception sobald das AssignFile aufgerufen wird. FLogFile ist dabei vom Typ TextFile. Der Pfad der in xLogFile steht ist auch vorhanden. Das ganze auf Windows 7. Sehe ich den Wald vor lauter Bäumen nicht? Vielen Dank schoneinmal fürs Lesen und evtl. wenn jemand eine Lösung hat, dann auch für eben jene :)

Delphi-Quellcode:
constructor TFileLogObject.Create;
var xLogFile: String;
begin
  inherited Create;

  xLogFile := GetCurrentDir + '\' + gcLogFileDir + FormatDateTime('yyyy-mm-dd', now) + gcLogFileExtension;
  AssignFile(FLogFile, xLogFile);

  if not FileExists(xLogFile) then
    Rewrite(FLogFile)
  else
    Append(FLogFile);
end;

himitsu 30. Apr 2011 11:45

AW: AssignFile -> simples prinzip aber ich stolper trotzdem...
 
In AssignFile passiert eigentlich noch garnichts mit der Datei.
Dort wird nur der Dateiname gespeichert (welcher dann bei Append/Rewrite gnutzt wird) und die Dateivariable initialisiert, so daß es dort eigentlich fast nie zu einer Exception kommen kann (außer, wenn mit der Dateivariable etwas nicht stimmt).

Wie/Wo ist FLogFile deklariert
und wie wird deine Klasse erstellt?

Und bist du sicher, daß die Exception bei AssignFile und nicht schon bei
Delphi-Quellcode:
xLogFile := ...
oder im
Delphi-Quellcode:
inherited Create;
auftritt?

Luckie 30. Apr 2011 11:45

AW: AssignFile -> simples prinzip aber ich stolper trotzdem...
 
Das wichtigste hast du vergessen. Was für eine Exception bekommst du?

DerTobi 30. Apr 2011 12:00

AW: AssignFile -> simples prinzip aber ich stolper trotzdem...
 
Hossa das ging fix :)

Oh peinlich, wird sofort nachgereicht. Exception ist eine EAccessViolation. Eigentlich ein klarer Indikator aber mir wills einfach nicht aufgehen.

Deklaration sieht wie folgt aus:

Delphi-Quellcode:
  TFileLogObject = Class(TObject)
  private
    FLogFile: TextFile;
    function FormatTimeStampForLog: String;
  public
    constructor Create;overload;
    destructor Destroy;override;

    procedure AddLogEntry(aMessage: String);
  end;
Der Einzelschritt sagt mir es knallt beim AssignFile. Mich wundert es ja auch das es da knallt. Es wird ja nur der Handle erzeugt. Wenn der Handle ins nichts zeigt beim aufruf Ok aber so? Wie gesagt, ich übersehe bestimmt wieder mal eine popelige Kleinigkeit.

Das TFileLogObject wird in einer Get Methode des Globalen Log Objects instantiiert(bei bedarf).

Luckie 30. Apr 2011 12:03

AW: AssignFile -> simples prinzip aber ich stolper trotzdem...
 
Wird denn eine Instanz der Klasse erzeugt?

himitsu 30. Apr 2011 12:03

AW: AssignFile -> simples prinzip aber ich stolper trotzdem...
 
Also nocheinmal:
Wie wird dein Objekt von TFileLogObject erzeugt?

Ich bin mir fast sicher, daß spätestens dort der Fehler liegt. :glaskugel:

[edit]
mist, zu spät :lol:

DerTobi 30. Apr 2011 12:08

AW: AssignFile -> simples prinzip aber ich stolper trotzdem...
 
'Doh!

Ich wollte gerade die Get Methode posten und da renne ich über den Fehler.
Der ist schon zu peinlich zum posten!

Ich bitte vielmals um Entschuldigung das ich eure Zeit verschwendet habe! Trotzdem vielen vielen Dank für die Mühe!

himitsu 30. Apr 2011 12:29

AW: AssignFile -> simples prinzip aber ich stolper trotzdem...
 
Dennoch wäre es gut, wenn man seine Erkenntnis mit anderen Teil,
denn davon lebt ein Forum.
Denn was passiert, wenn jemand Anderes auch irgendwann mal das gleiche Problem hat und niemand seine Lösungen veröffentlicht?

DerTobi 30. Apr 2011 13:19

AW: AssignFile -> simples prinzip aber ich stolper trotzdem...
 
Stimmt auch wieder... nagut, dann poste ich den Anfängerfehler mal ^^

So sah die Get Methode aus:

Delphi-Quellcode:
function TLogObject.GetFileLog: TFileLogObject;
begin
  if FFileLog = NIL then
    FFileLog.Create;

  Result := FFileLog;
end;
So muss sie aussehen:

Delphi-Quellcode:
function TLogObject.GetFileLog: TFileLogObject;
begin
  if FFileLog = NIL then
    FFileLog := TFileLogObject.Create;

  Result := FFileLog;
end;
Die Variable zeigte ins leere

Luckie 30. Apr 2011 13:36

AW: AssignFile -> simples prinzip aber ich stolper trotzdem...
 
Da zeigt nichts ins Leere. Du hast den Konstruktor als gewöhnliche Methode aufgerufen. Dabei wird natürlich keine Instanz erzeugt.

DerTobi 30. Apr 2011 13:41

AW: AssignFile -> simples prinzip aber ich stolper trotzdem...
 
Jop, stimmt.

Luckie 30. Apr 2011 13:50

AW: AssignFile -> simples prinzip aber ich stolper trotzdem...
 
Und genau darauf hat meine Frage abgezielt.

himitsu 30. Apr 2011 14:49

AW: AssignFile -> simples prinzip aber ich stolper trotzdem...
 
Meine auch. :angle2:

Aber hier nochein Tipp:

Delphi-Quellcode:
if FFileLog = NIL then

if not Assigned(FFileLog) then
assigned = zugewiesen ... eventuell ist es so sogar verständlicher.

Und nicht vergessen,
Delphi-Quellcode:
FreeAndNil(FFileLog);
anstatt
Delphi-Quellcode:
FFileLog.Free;
und eventuell noch mit NIL initiieren (falls dieses nicht zufällig automatisch durch Delphi gemacht werden sollte),
sonst bringt diese Prüfung nichts.

Bjoerk 30. Apr 2011 15:09

AW: AssignFile -> simples prinzip aber ich stolper trotzdem...
 
weshalb hast du denn constructor Create; overload; ?

DerTobi 1. Mai 2011 14:21

AW: AssignFile -> simples prinzip aber ich stolper trotzdem...
 
Hoi Hoi,

jap, wegen der Frage bin ich auch über den Fehler gestolpert :)

Warum ich an der Stelle ausgerechnet = NIL gewählt habe kann ich nicht mehr erklären. Gibt wohl auch keinen besonderen Grund dafür.

FreeAndNil ist klar.

das overload ist Macht der Gewohnheit.


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