![]() |
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:
|
AW: TextFile Writeln für Klasse verfügbar machen.
Was genau hast Du vor Textfile ist ein Datentyp wie Integer,Pointer etc...
|
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; |
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..
|
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.
|
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
![]()
Delphi-Quellcode:
Benutzen kann man es in etwas so:
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;
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; |
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:
Gruß
MyClass.TextOut('Text' + MyIntToStr(Int, 4) + MyFloatToStr(Float, 12, 3) + Text2);
Thomas |
AW: TextFile Writeln für Klasse verfügbar machen.
Zitat:
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:17 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