![]() |
Object und Fail
Moin Leute :hi:
Ich stelle gerade mein Programm von Turbo Pascal 7.0 auf Turbo Delphi um. Das Programm läuft dann als Console. Bei über 100.000 Zeilen kann ich nicht mal eben eine reine Formularanwendung draus machen. Als 32 Bit Console läuft das Teil dann auch auf XP 64 Bit, was einer 16 Bit Anwendung verwährt wird. Komme ich zu meinem Problem.
Delphi-Quellcode:
Wenn FindFirst keine Datei liefert, wird Fail aufgerufen. In dem Moment zerlegt sich mein Stack und ein folgender FillChar auf eine Variable von Record führt zum Speicherfehler.
type
TDirInfo = object DirInfo : SearchRec; constructor Create( aDatei : PathStr; aAttr : Word); function FindNext:Boolean; destructor Free; end; constructor TDirInfo.Create( aDatei : PathStr; aAttr : Word); {$IfDef Win32} var lEc : Int32; {$EndIf} begin {$IfDef Win32} lEc := FindFirst(aDatei,aAttr,DirInfo); if lEc <> 0 then begin SysUtils.FindClose(DirInfo); Fail; end; {$Else} FindFirst(aDatei,aAttr,DirInfo); if DosError <> 0 then begin { FindClose wird bei Dos nicht benötigt } Fail; end; {$EndIf} end; function TDirInfo.FindNext:Boolean; {$IfDef Win32} var lEc : Int32; {$EndIf} begin {$IfDef Win32} lEc := SysUtils.FindNext(DirInfo); FindNext := lEc = 0; {$Else} Dos.FindNext(DirInfo); FindNext := DosError = 0; {$EndIf} end; destructor TDirInfo.Free; begin {$IfDef Win32} SysUtils.FindClose(DirInfo); {$EndIf} end; Ich könnte wie folgt umstellen:
Delphi-Quellcode:
Leider muss ich dann 38 Stellen in meinem Programm umstellen. Dazu kommen dann noch ein paar Objekte, die auch mit Fail enden, wenn eine Datei nicht geöffnet werden kann, etc. und das sind noch viel mehr Stellen.
type
TDirInfo = object DirInfo : SearchRec; constructor Create; function FindFirst( aDatei : PathStr; aAttr : Word):Boolean; function FindNext:Boolean; destructor Free; end; Meine Frage: Kommt das wirklich vom Fail? Hat jemand von euch schon Erfahrungen damit gesammelt? Stefan |
Re: Object und Fail
Zitat:
So läuft das zumindest inner Windows API. [OT]Du solltest auf Klassen umstellen. Objekte sind inzwischen veraltet.[/OT] [EDIT] OK, ich nehm alles zurück. Wird ja nur im Fehlerfall aufgerufen. Sry. [/EDIT] |
Re: Object und Fail
Ja, object ist veraltet, das weiß ich. Wie du an den ganzen Compilerschalter schon siehst, möchte ich das Programm unter Delphi und unter TP7 kompilieren können.
FindFirst/FindNext/FindClose kann ich ausschließen, habe ich auch erst gedacht. |
Re: Object und Fail
Wo wird dem DosError entwas zugewiesen?
|
Re: Object und Fail
DosError?
Delphi-Quellcode:
Das wird doch nur in TP kompiliert. Unter Delphi wird
{$IfDef Win32}
lEc := SysUtils.FindNext(DirInfo); FindNext := lEc = 0; {$Else} Dos.FindNext(DirInfo); FindNext := DosError = 0; {$EndIf}
Delphi-Quellcode:
ausgeführt.
lEc := SysUtils.FindNext(DirInfo);
FindNext := lEc = 0; |
Re: Object und Fail
Bei FindClose ist SysUtils angegeben.
Eventuell wird ein falsches FindFirst aufgerufen, vieleicht dann besser so:
Delphi-Quellcode:
SysUtils.FindClose() muss und sollte nur aufgerufen werden, wenn SysUtils.FindFirst erfolgreich war.
{$IfDef Win32}
lEc := SysUtils.FindFirst(aDatei,aAttr,DirInfo); |
Re: Object und Fail
Irrtum!
FindClose braucht nicht aufgerufen zu werden, wenn nichts gefunden wurde. Wenn etwas gefunden wurde muss es aber aufgerufen werden. Ich hatte das FindClose auch schon ausgeklammert, der Fehler trat trotzdem auf. |
Re: Object und Fail
Zitat:
Genau das hab ich auch geschrieben. Zitat:
|
Re: Object und Fail
Oh, da habe ich nicht richtig gelesen. :oops:
Die Unit DOS enthält nur PathStr und Co. und sonst nichts. Sie ist nur ein Dummy, damit ich nicht jede Unit überarbeiten muss. Mein Konvertierungsprogramm fügt die SysUtils überall automatisch ein, so sind die Funktionen wie BlockRead und so drin. Von daher nimmt er die aus SysUtils. In Windows.pas gibt es kein FindFirst, was er fälschlicher Weise nehmen könnte. Es wird von FindFirst auf FindFirstFile aus Windows.pas zugegriffen. |
Re: Object und Fail
N'abend,
ich habe das gerade noch einmal durchgespielt. Ich habe das Objekt so umgestellt, dass das FindFirst in einer Funktion verwendet wird und im Creator kein Fail mehr verwendet wird. Der Fehler auf dem Stack passiert so nicht mehr. So ein Mist! 150 Stellen überarbeiten. :kotz: Hätte ich das mal früher gewusst... |
Alle Zeitangaben in WEZ +1. Es ist jetzt 21: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