Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   TextFile Writeln für Klasse verfügbar machen. (https://www.delphipraxis.net/170694-textfile-writeln-fuer-klasse-verfuegbar-machen.html)

Bjoerk 28. Sep 2012 18:53

TextFile Writeln für Klasse verfügbar machen.
 
Ich möchte einer Klasse die Texfile Write und Writelns‘s verfügbar machen. Geht das irgendwie? quasi als ob es so wäre: TMyClass = class(TextFile) :cyclops:

Bummi 28. Sep 2012 19:09

AW: TextFile Writeln für Klasse verfügbar machen.
 
Was genau hast Du vor Textfile ist ein Datentyp wie Integer,Pointer etc...

Sir Rufo 28. Sep 2012 19:32

AW: TextFile Writeln für Klasse verfügbar machen.
 
Er möchte das ganze Geraffel gekapselt haben ;)
Delphi-Quellcode:
TMyTextFile = class
public
  constructor Create( const AFilename : string );
  procedure Write( const AStr : string );
  ...
end;

Bjoerk 28. Sep 2012 19:38

AW: TextFile Writeln für Klasse verfügbar machen.
 
Jepp, Geraffel ist genau das richtige Stichwort. Meine Writelns sind leider nicht stringkonform. Write stellt ja einen (wie ich finde ziemlich genialen Parser zur Verfügung und ich hab mehre hundert davon, wahrscheinlich sogar über 1000 Anweisungen), die ich jetzt umgetsalten muß, deshalb die Frage:

Bsp:

Delphi-Quellcode:
writeln (aus, 'Text', Int:4, Float: 12:3, Text2); usw..

DeddyH 28. Sep 2012 22:39

AW: TextFile Writeln für Klasse verfügbar machen.
 
Mit Format() bekommt man ähnliche Funktionalität. Es ist nur anfangs nicht ganz leicht, die ganzen FormatStrings zu begreifen, aber mit etwas Übung ist man da superflexibel.

Uwe Raabe 28. Sep 2012 23:07

AW: TextFile Writeln für Klasse verfügbar machen.
 
Ich bin mir nicht ganz sicher, ob es das ist, was du dir vorstellst, aber inspiriert von Vcl.Printers.AssignPrn habe ich da mal was zusammengeschrieben:

Delphi-Quellcode:
type
  TTextFile = class
  private type
    TTextRecHelper = record helper for TTextRec
    public
      function GetTextFile: TTextFile;
      procedure SetTextFile(const Value: TTextFile);
      property TextFile: TTextFile read GetTextFile write SetTextFile;
    end;
  private var
    FBuilder: TStringBuilder;
    class function TextClose(var F: TTextRec): Integer; static;
    class function TextIgnore(var F: TTextRec): Integer; static;
    class function TextInput(var F: TTextRec): Integer; static;
    class function TextOpen(var F: TTextRec): Integer; static;
    class function TextOutput(var F: TTextRec): Integer; static;
  public
    constructor Create;
    destructor Destroy; override;
    procedure AppendString(const Value: string);
    procedure AssignFile(var F: Text);
    function ToString: string; override;
  end;

constructor TTextFile.Create;
begin
  inherited Create;
  FBuilder := TStringBuilder.Create();
end;

destructor TTextFile.Destroy;
begin
  FBuilder.Free;
  inherited Destroy;
end;

procedure TTextFile.AppendString(const Value: string);
begin
  FBuilder.Append(Value);
end;

procedure TTextFile.AssignFile(var F: Text);
begin
  FillChar(F, SizeOf(F), 0);
  with TTextRec(F)do
  begin
    Mode := fmClosed;
    BufSize := SizeOf(Buffer);
    BufPtr := @Buffer;
    OpenFunc := @TextOpen;
    TextFile := Self;
  end;
end;

class function TTextFile.TextClose(var F: TTextRec): Integer;
begin
  Result := 0;
end;

class function TTextFile.TextIgnore(var F: TTextRec): Integer;
begin
  Result := 0;
end;

class function TTextFile.TextInput(var F: TTextRec): Integer;
begin
  F.BufPos := 0;
  F.BufEnd := 0;
  Result := 0;
end;

class function TTextFile.TextOpen(var F: TTextRec): Integer;
begin
  if F.Mode = fmInput then
  begin
    F.InOutFunc := @TextInput;
    F.FlushFunc := @TextIgnore;
    F.CloseFunc := @TextIgnore;
  end else
  begin
    F.Mode := fmOutput;
    F.InOutFunc := @TextOutput;
    F.FlushFunc := @TextOutput;
    F.CloseFunc := @TextClose;
  end;
  Result := 0;
end;

class function TTextFile.TextOutput(var F: TTextRec): Integer;
var
  AStr: AnsiString;
begin
  SetLength(AStr, F.BufPos);
  Move(F.BufPtr^, AStr[1], F.BufPos);
  F.TextFile.AppendString(string(AStr));
  F.BufPos := 0;
  Result := 0;
end;

function TTextFile.ToString: string;
begin
  result := FBuilder.ToString;
end;

function TTextFile.TTextRecHelper.GetTextFile: TTextFile;
begin
  Move(UserData[1], Result, Sizeof(Result));
end;

procedure TTextFile.TTextRecHelper.SetTextFile(const Value: TTextFile);
begin
  Move(Value, UserData[1], Sizeof(Value));
end;
Benutzen kann man es in etwas so:

Delphi-Quellcode:
var
  F: TextFile;
  T: TTextFile;
begin
  T := TTextFile.Create;
  try
    T.AssignFile(F);
    Rewrite(F);
    Writeln(F, 'Text', Int:4, Float: 12:3, Text2);
    CloseFile(F);
    Memo1.Lines.Text := T.ToString;
  finally
    T.Free;
  end;
end;

Bjoerk 29. Sep 2012 06:59

AW: TextFile Writeln für Klasse verfügbar machen.
 
Wow, da hast du dir aber viel Arbeit gemacht. Vielen lieben Dank Uwe. Das mit einem OnWriteln Event wäre genau was ich bräuchte. Ich kann es aber leider nicht testen, da ich nur D2007 habe (keine TStringBuilder class).

Mal sehen, wie ich das mache, zu Fuß kann ich das jedenfalls nicht ändern, ist viel zu viel. Vielleicht schreibe ich auch einen Parser, der mir den Code umgestaltet:.

Delphi-Quellcode:
MyClass.TextOut('Text' + MyIntToStr(Int, 4) + MyFloatToStr(Float, 12, 3) + Text2);
Gruß
Thomas

Uwe Raabe 29. Sep 2012 07:33

AW: TextFile Writeln für Klasse verfügbar machen.
 
Zitat:

Zitat von Bjoerk (Beitrag 1184927)
Wow, da hast du dir aber viel Arbeit gemacht.

Das war jetzt nicht wirklich viel Arbeit und es hat mich auch einfach interessiert, ob es überhaupt geht.


Zitat:

Zitat von Bjoerk (Beitrag 1184927)
Das mit einem OnWriteln Event wäre genau was ich bräuchte. Ich kann es aber leider nicht testen, da ich nur D2007 habe (keine TStringBuilder class).

Dann lass den StringBuilder weg und implementiere die AssignString-Methode (vielleicht virtuell) nach deinen Wünschen. Eventuell kannst du dann auch auf das ToString verzichten.


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