AGB  ·  Datenschutz  ·  Impressum  







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

TextFile Writeln für Klasse verfügbar machen.

Ein Thema von Bjoerk · begonnen am 28. Sep 2012 · letzter Beitrag vom 29. Sep 2012
Antwort Antwort
Bjoerk

Registriert seit: 28. Feb 2011
Ort: Mannheim
1.384 Beiträge
 
Delphi 10.4 Sydney
 
#1

TextFile Writeln für Klasse verfügbar machen.

  Alt 28. Sep 2012, 18:53
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)
  Mit Zitat antworten Zitat
Benutzerbild von Bummi
Bummi

Registriert seit: 15. Jun 2010
Ort: Augsburg Bayern Süddeutschland
3.470 Beiträge
 
Delphi XE3 Enterprise
 
#2

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

  Alt 28. Sep 2012, 19:09
Was genau hast Du vor Textfile ist ein Datentyp wie Integer,Pointer etc...
Thomas Wassermann H₂♂
Das Problem steckt meistens zwischen den Ohren
DRY DRY KISS
H₂ (wenn bei meinen Snipplets nichts anderes angegeben ist Lizenz: WTFPL)
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#3

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

  Alt 28. Sep 2012, 19:32
Er möchte das ganze Geraffel gekapselt haben
Delphi-Quellcode:
TMyTextFile = class
public
  constructor Create( const AFilename : string );
  procedure Write( const AStr : string );
  ...
end;
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Bjoerk

Registriert seit: 28. Feb 2011
Ort: Mannheim
1.384 Beiträge
 
Delphi 10.4 Sydney
 
#4

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

  Alt 28. Sep 2012, 19:38
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:

writeln (aus, 'Text', Int:4, Float: 12:3, Text2); usw..
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.540 Beiträge
 
Delphi 11 Alexandria
 
#5

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

  Alt 28. Sep 2012, 22:39
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.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.007 Beiträge
 
Delphi 12 Athens
 
#6

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

  Alt 28. Sep 2012, 23:07
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;
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Bjoerk

Registriert seit: 28. Feb 2011
Ort: Mannheim
1.384 Beiträge
 
Delphi 10.4 Sydney
 
#7

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

  Alt 29. Sep 2012, 06:59
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:.

MyClass.TextOut('Text' + MyIntToStr(Int, 4) + MyFloatToStr(Float, 12, 3) + Text2); Gruß
Thomas
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.007 Beiträge
 
Delphi 12 Athens
 
#8

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

  Alt 29. Sep 2012, 07:33
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.


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.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  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 06:08 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