Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi standard error output in D4/5? (https://www.delphipraxis.net/73302-standard-error-output-d4-5-a.html)

himitsu 15. Jul 2006 13:40


standard error output in D4/5?
 
Tachchen,

in D7 is ja folgende Variable in der SystemUnit definiert,
Delphi-Quellcode:
Var ErrOutput: Text;
allerdings ist diese noch nicht unter D4 verfügbar
und ich konnte auch keinen Ersatzt finden. -.-''

Was soll ich denn jetzt machen?

Bräuchte es für diese Zeilen:
Code:
If @F = @[b]ErrOutput[/b] Then F.Handle := [b]GetStdHandle(STD_ERROR_HANDLE)[/b]
Else F.Handle := [b]GetStdHandle(STD_OUTPUT_HANDLE)[/b];
Im Notfall (wenn es nichts gibt) würde ich wohl STD_OUTPUT_HANDLE (ohne Abfrage) verwenden können ... hoff ich mal.


MbD Frank

Muetze1 15. Jul 2006 14:47

Re: standard error output in D4/5?
 
Deklarier ihn dir einfach:

Delphi-Quellcode:
Var
  ErrOutput: Text;

....

Begin
  TTextRec(ErrOutput).Mode := fmWrite;
  TTextRec(ErrOutput).Handle := GetStdHandle(STD_ERROR_HANDLE);
End.

himitsu 15. Jul 2006 15:28

Re: standard error output in D4/5?
 
Also gibt/gab es demnach nocht nichts dafür?

Na ja, dann bleib ich wohl dennoch besser bei STD_OUTPUT_HANDLE, da andererseits ja auch schon STD_OUTPUT_HANDLE verwendet wird ^^
Code:
If [b]Mode = fmOutput[/b] and 3 Then Begin
  F.InOutFunc := @_TextOut;
  {$IFDEF _NewMode} If @F = @ErrOutput Then F.Handle := GetStdHandle(STD_ERROR_HANDLE)
  Else {$ENDIF} F.Handle := GetStdHandle([b]STD_OUTPUT_HANDLE[/b]);
End Else Begin
  F.InOutFunc := @_TextIn;
  F.Handle   := GetStdHandle([b]STD_INPUT_HANDLE[/b]);
End;


außerdem wüde der Zweizeiler dann auch nicht mehr so schon (kurz) aussehn :roll:
Delphi-Quellcode:
{$IFDEF _NewMode} If @F = @ErrOutput Then {$ENDIF} F.Handle := GetStdHandle(STD_ERROR_HANDLE)
{$IFDEF _NewMode} Else F.Handle := GetStdHandle(STD_OUTPUT_HANDLE) {$ENDIF} ;

// oder
{$IFDEF _NewMode}
  If @F = @ErrOutput Then F.Handle := GetStdHandle(STD_ERROR_HANDLE)
  Else F.Handle := GetStdHandle(STD_OUTPUT_HANDLE);
{$ELSE}
  F.Handle := GetStdHandle(STD_ERROR_HANDLE);
{$ENDIF}

Hätte dieses Verhalten zwar beheben können, allerings reagieren diese Funktionen ja "genauso" wie die Originale, bis auf die Tatsache, das hier mit 64-Bit gerechnet wurd.

Und als Nebeneffekt daß kein DatenTyp ausgeschlossen wird ... unteranderem wegen genau diesem Verhalten, mit dem Puffer) schließt der DelphiCmpiler TextFile von den Seek-/SizeFunktionen aus :zwinker:


Du kannst es aber mal so versuchen:
Delphi-Quellcode:
// für Schreibzugriff:
RealPos := FilePos64(F) + TFileRec(F).BufEnd - TFileRec(F).BufPos;

// für Lesezugriff:
RealPos := FilePos64(F) + TFileRec(F).BufPos;

Muetze1 15. Jul 2006 16:32

Re: standard error output in D4/5?
 
Ich weiss zwar nicht was das andere alles zu bedeuten hat was du so geschrieben hast, aber eine Anmerkung habe ich noch:

Delphi-Quellcode:
If Mode = fmOutput and 3 Then Begin
Was soll dieser Code bewirken? fmOutput ist eine Konstante und mit $D7B2 definiert. Somit wird immer 2 übrig bleiben - ich verstehe aber denn Sinn nicht eine Konstante mit einer logischen Operation zu verändern, da das Ergebnis genauso konstant ist und man somit direkt auf das Ergebnis vergleichen könnte...

himitsu 15. Jul 2006 17:31

Re: standard error output in D4/5?
 
Bei den Dateifunktionen gibt es nicht nur diese 4 Möglichkeiten ... das einzige was wirklich "genormt" ist, sind die letzten 2 Bits.
Delphi-Quellcode:
Const fmClosed = $D7B0;
  fmInput     = $D7B1;
  fmOutput    = $D7B2;
  fmInOut     = $D7B3;
also sozusagen:
Delphi-Quellcode:
Const _fmClosed = $0;
  _fmInput     = $1;
  _fmOutput    = $2;
  _fmInOut     = $3;
Theoretisch ist es möglich für bestimmte Dateitypen auch verschiedene Methoden zu implementieren, welche sich Anhand der ersten 14 Bits unterscheiden lassen, wobei halt die letzten immer die Richtung angeben.

Zusammen mit dem vorangegangen Code kommt sozusagen folgendes raus,
Delphi-Quellcode:
If Mode and 3 = fmOutput and 3 Then ...
's sieht doch viel eindeutiger aus, als
Delphi-Quellcode:
If Mode and $0003 = $0002 Then ...

//oder eben
If Mode = 2 Then ...


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