![]() |
D2009 Exception
Mir ist kein anderen threadnamen eingefallen.
Meine Funktion welche ich hier schonmal gepostet habe verursacht in D2009 beim 2 Aufruf ein Exception Exception in "blaaa, blaa" aufgetreten.
Delphi-Quellcode:
und zwar wenn das zweitemal
procedure TSkinConfig.AppendToLinkedList(nReading: Integer; sBuffer: string);
begin New(FPBuffer); if nReading = 0 then Begin New(FToPBuffer); LineStart := FToPBuffer; end; FPBuffer^.Nr := nReading; FPBuffer^.Str := sBuffer; LineStart^.Max := nReading; FToPBuffer^.Ptr := FPBuffer; FToPBuffer := FPBuffer; end; procedure TSkinConfig.FBuffin(FileName: string); var sBuffer: string; begin if not FExist(FileName) then Exit; try try Assignfile(ParseFile, FileName); reset(ParseFile); while not eof(ParseFile) do begin ReadLN(ParseFile, sBuffer); AppendToLinkedList(nReading, sBuffer); inc(nReading); end; except raise Exception.Create(SysErrorMessage(GetLastError)); end; finally nReading := 0; CloseFile(ParseFile); end; end;
Delphi-Quellcode:
New(FPBuffer);
aufgerufen wird. Beim Awendungsfenster tritt das problem nicht auf nur beim Modal erstellten Window. In D2006 gibt es keine probleme diesbezüglich. Mit Exception Exception kann ich nichts anfangen keine Nummer nix wird zurückgegeben. gruss Emil |
AW: D2009 Exception
GIbst du den speicher auch irgendwo frei? und mit Dispose? Außerdem würde ich das AssignFile über das try-finally setzen, da im Fehlerfall versucht wird eine Datei, die nicht geoffnet ist zu schließen.
|
AW: D2009 Exception
Zitat:
Nach dem erstellung des HauptFenster werden die Resourcen wieder freigegeben.
Delphi-Quellcode:
sowie das TextFile
// Resourcen Freigeben
FPBuffer := nil; Result := True;
Delphi-Quellcode:
CloseFile(ParseFile);
gruss |
AW: D2009 Exception
Zitat:
|
AW: D2009 Exception
Zitat:
Und das AssignFile über try (finally gesetzt) Ändert aber nichts an meinem problem. Reicht ein
Delphi-Quellcode:
FPBuffer := nil;
nicht aus? Nachdem das Hauptfenster erstellt wurde? Warum dann noch ein Dispose? gruss |
AW: D2009 Exception
Es gibt leider keinen Garbage Collector in Delphi:
Man muss den Speicher, den man allokiert (mit new) wieder Freigeben(mit Dispose). Das nilen des Pointers reicht da nicht aus, da der Wert dahinter immer noch existiert. Normalerweise ist sowas "nur" ein Speicherleck und sollte keine Exception werfen, aber wer weiss. Vielleicht liegt der Fehler wo ganz anders |
AW: D2009 Exception
Zitat:
Warum auch immer, bekomme dann nicht mal die HauptAnwendung(Fenster geladen)
Delphi-Quellcode:
wie gesagt das problem habe ich nur mit D2009
while not eof(ParseFile) do
begin ReadLN(ParseFile, sBuffer); AppendToLinkedList(nReading, sBuffer); inc(nReading); Dispose(FPBuffer); end; gruss |
AW: D2009 Exception
Jetzt sagt mir doch mal bitte was ist mein Problem
Das ein und die gleiche Funktion in D2006 funktioniert und in D2009 probleme verursacht. Habe alle relevanten Code Teile gepostet. gruss |
AW: D2009 Exception
Könntest du den Code vielleicht etwas erklären?
Und vielleicht den kompletten Exception-Text posten (Strg-C auf das Exception-Fenster) Das Dispose muss man dann aufführen wenn man das den Record nicht mehr braucht. Wird das FPBuffer an der Stelle nicht mehr gebraucht? Wenn ja, warum ist es dann ein Feld des Objektes und keine Varaible in der Procedure? Sorry, aber ich bin nicht den ganzen Tag im Forum:oops:. |
AW: D2009 Exception
Zitat:
Zitat:
Delphi-Quellcode:
// Resourcen Freigeben
Dispose(FPBuffer); FPBuffer := nil; Result := True; Zitat:
Delphi-Quellcode:
PParseFile = ^TParseFile;
TParseFile = record Nr :Integer; Str : string; Ptr : PParseFile; Max : Integer; end;
Delphi-Quellcode:
ParseFile.. erklärt sich von selbst (die TextDatei halt)
TSkinConfig = class
private ParseFile : TextFile; LineStart : PParseFile; FPBuffer : PParseFile; FToPBuffer : PParseFile; LineStart.. hier wird der Maximale Counter (Zeilen in der Textdatei festgehalten) da sich beim einlesen der nächsten Zeile der letzte FPBuffer leert benötige ich LineStart als Platzhalter für den letzten (aller) Counter. FPBuffer.. wird initialisiert indem ich den Pointer auf LineStart setze FToPBuffer.. enthält die Pointer der Records von PParseFile abhängig vom Counter LineStart 0 to max Zeilen. LineStart erhält dann den kompletten Record von FToPBuffer in dem alle Daten von FPBuffer enthalten sind. Siehe!
Delphi-Quellcode:
FToPBuffer := FPBuffer;
Hoffe meine Erklärung ist ausreichend. Danke. gruss Emil |
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:19 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