AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Object und Fail

Ein Thema von MacGuyver · begonnen am 2. Feb 2010 · letzter Beitrag vom 4. Feb 2010
Antwort Antwort
Benutzerbild von MacGuyver
MacGuyver

Registriert seit: 9. Sep 2003
Ort: Wildeshausen
293 Beiträge
 
Turbo Delphi für Win32
 
#1

Object und Fail

  Alt 2. Feb 2010, 18:31
Moin Leute

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:
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;
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.

Ich könnte wie folgt umstellen:

Delphi-Quellcode:
type
  TDirInfo = object
    DirInfo : SearchRec;

    constructor Create;

    function FindFirst( aDatei : PathStr;
                           aAttr : Word):Boolean;

    function FindNext:Boolean;

    destructor Free;
  end;
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.

Meine Frage: Kommt das wirklich vom Fail? Hat jemand von euch schon Erfahrungen damit gesammelt?



Stefan
Englisch eine Weltsprache? Zu kompliziert und der nahe Osten würde Englisch als Pflichtweltsprache nicht akzeptieren.
IDO wäre genau das Richtige: http://forum.idolinguo.de/index.php oder www.idolinguo.de
  Mit Zitat antworten Zitat
Benutzerbild von implementation
implementation

Registriert seit: 5. Mai 2008
940 Beiträge
 
FreePascal / Lazarus
 
#2

Re: Object und Fail

  Alt 2. Feb 2010, 18:49
Zitat von MacGuyver:
Delphi-Quellcode:
begin
{$IfDef Win32}
  lEc := FindFirst(aDatei,aAttr,DirInfo);
  if lEc <> 0 then
  begin
    SysUtils.FindClose(DirInfo);
    Fail;
  end;
Gehört FindClose nicht erst nach FindNext?
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]
  Mit Zitat antworten Zitat
Benutzerbild von MacGuyver
MacGuyver

Registriert seit: 9. Sep 2003
Ort: Wildeshausen
293 Beiträge
 
Turbo Delphi für Win32
 
#3

Re: Object und Fail

  Alt 2. Feb 2010, 19:00
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.
Englisch eine Weltsprache? Zu kompliziert und der nahe Osten würde Englisch als Pflichtweltsprache nicht akzeptieren.
IDO wäre genau das Richtige: http://forum.idolinguo.de/index.php oder www.idolinguo.de
  Mit Zitat antworten Zitat
Benutzerbild von toms
toms
(CodeLib-Manager)

Registriert seit: 10. Jun 2002
4.648 Beiträge
 
Delphi XE Professional
 
#4

Re: Object und Fail

  Alt 2. Feb 2010, 20:07
Wo wird dem DosError entwas zugewiesen?
Thomas
  Mit Zitat antworten Zitat
Benutzerbild von MacGuyver
MacGuyver

Registriert seit: 9. Sep 2003
Ort: Wildeshausen
293 Beiträge
 
Turbo Delphi für Win32
 
#5

Re: Object und Fail

  Alt 2. Feb 2010, 20:20
DosError?

Delphi-Quellcode:
{$IfDef Win32}
  lEc := SysUtils.FindNext(DirInfo);
  FindNext := lEc = 0;
{$Else}
  Dos.FindNext(DirInfo);
  FindNext := DosError = 0;
{$EndIf}
Das wird doch nur in TP kompiliert. Unter Delphi wird

Delphi-Quellcode:
lEc := SysUtils.FindNext(DirInfo);
FindNext := lEc = 0;
ausgeführt.
Englisch eine Weltsprache? Zu kompliziert und der nahe Osten würde Englisch als Pflichtweltsprache nicht akzeptieren.
IDO wäre genau das Richtige: http://forum.idolinguo.de/index.php oder www.idolinguo.de
  Mit Zitat antworten Zitat
Blup

Registriert seit: 7. Aug 2008
Ort: Brandenburg
1.429 Beiträge
 
Delphi 10.4 Sydney
 
#6

Re: Object und Fail

  Alt 3. Feb 2010, 12:39
Bei FindClose ist SysUtils angegeben.
Eventuell wird ein falsches FindFirst aufgerufen, vieleicht dann besser so:
Delphi-Quellcode:
{$IfDef Win32}
  lEc := SysUtils.FindFirst(aDatei,aAttr,DirInfo);
SysUtils.FindClose() muss und sollte nur aufgerufen werden, wenn SysUtils.FindFirst erfolgreich war.
  Mit Zitat antworten Zitat
Benutzerbild von MacGuyver
MacGuyver

Registriert seit: 9. Sep 2003
Ort: Wildeshausen
293 Beiträge
 
Turbo Delphi für Win32
 
#7

Re: Object und Fail

  Alt 4. Feb 2010, 09:40
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.
Englisch eine Weltsprache? Zu kompliziert und der nahe Osten würde Englisch als Pflichtweltsprache nicht akzeptieren.
IDO wäre genau das Richtige: http://forum.idolinguo.de/index.php oder www.idolinguo.de
  Mit Zitat antworten Zitat
Blup

Registriert seit: 7. Aug 2008
Ort: Brandenburg
1.429 Beiträge
 
Delphi 10.4 Sydney
 
#8

Re: Object und Fail

  Alt 4. Feb 2010, 09:57
Zitat von MacGuyver:
Irrtum!

FindClose braucht nicht aufgerufen zu werden, wenn nichts gefunden wurde. Wenn etwas gefunden wurde muss es aber aufgerufen werden.
Du hast meine Antwort nicht richtig gelesen.
Genau das hab ich auch geschrieben.

Zitat von MacGuyver:
Ich hatte das FindClose auch schon ausgeklammert, der Fehler trat trotzdem auf.
Du kannst und solltest auf FindClose an dieser Stelle verzichten, aber es geht darum SysUtils.FindFirst und nicht nur FindFirst zu schreiben, den es ist unklar ob eventuell Dos.FindFirst aufgerufen wird.
  Mit Zitat antworten Zitat
Benutzerbild von MacGuyver
MacGuyver

Registriert seit: 9. Sep 2003
Ort: Wildeshausen
293 Beiträge
 
Turbo Delphi für Win32
 
#9

Re: Object und Fail

  Alt 4. Feb 2010, 12:30
Oh, da habe ich nicht richtig gelesen.

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.
Englisch eine Weltsprache? Zu kompliziert und der nahe Osten würde Englisch als Pflichtweltsprache nicht akzeptieren.
IDO wäre genau das Richtige: http://forum.idolinguo.de/index.php oder www.idolinguo.de
  Mit Zitat antworten Zitat
Benutzerbild von MacGuyver
MacGuyver

Registriert seit: 9. Sep 2003
Ort: Wildeshausen
293 Beiträge
 
Turbo Delphi für Win32
 
#10

Re: Object und Fail

  Alt 4. Feb 2010, 20:32
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.

Hätte ich das mal früher gewusst...
Englisch eine Weltsprache? Zu kompliziert und der nahe Osten würde Englisch als Pflichtweltsprache nicht akzeptieren.
IDO wäre genau das Richtige: http://forum.idolinguo.de/index.php oder www.idolinguo.de
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:02 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