![]() |
Delphi-Version: 2007
FileStream mit "TIniFile Funktionalität".Methoden
Ich würde gerne eine FileStream Klasse schreiben die ich wie eine IniFile behandeln kann. Wie könnte man denn sowas machen? Ich habe gedacht daß ich einen Header anlege in der ich die nötigen Infos speichere. Nur, wie könnte so ein Header aussehen? Oder ist das Ganze Blödsinn?
|
AW: FileStream mit "TIniFile Funktionalität".Methoden
Du willst eine Klasse von
Delphi-Quellcode:
ableiten und dann um Methoden von
TFileStream
Delphi-Quellcode:
erweitern?
TIniFile
Lass mich kurz überlegen: Ja, das ist Blödsinn :) |
AW: FileStream mit "TIniFile Funktionalität".Methoden
Juut. Einverstanden. :oops:
Dann anders rum. Wie krieg ich eine emf in eine IniFile. Auch Blödsinn? |
AW: FileStream mit "TIniFile Funktionalität".Methoden
Zitat:
![]() |
AW: FileStream mit "TIniFile Funktionalität".Methoden
Meintest Du vielleicht eher
![]() |
AW: FileStream mit "TIniFile Funktionalität".Methoden
Okay. Wenn das funktioniert? Wäre mir ja auch viel lieber. Ich werf mal einen Blick in die inifiles.pas. Melde mich ggf. nochmal. Thanx!
|
AW: FileStream mit "TIniFile Funktionalität".Methoden
TCustomIni (der Vorfahre von TIniFile) ... das kann man gern verwenden und ihm, statt der INI-Datei-WinAPI, ein anderes Backend verpassen.
TStringListe mit Names/Values (ist wie eine INI, aber mit nur einer einzigen Section) TStringStream TTextReader TTextWriter TBinaryReader TBinaryWriter TStringReader TStringWriter TStreamWriter TStreamReader ... Das ![]() ![]() ![]() ![]() ![]() |
AW: FileStream mit "TIniFile Funktionalität".Methoden
Okay. Ich hab's jetzt erst mal so probiert. Funzt einwandfrei.
Delphi-Quellcode:
function TMemIniFileEx.ReadMetaFile(const Section, Name: string;
Value: TMetaFile): integer; var MemoryStream: TMemoryStream; begin MemoryStream := TMemoryStream.Create; try Result := ReadBinaryStream(Section, Name, MemoryStream); // integer, kein int64 MemoryStream.Position := 0; Value.LoadFromStream(MemoryStream); finally MemoryStream.Free; end; end; procedure TMemIniFileEx.WriteMetaFile(const Section, Name: string; Value: TMetaFile); var MemoryStream: TMemoryStream; begin MemoryStream := TMemoryStream.Create; try Value.SaveToStream(MemoryStream); MemoryStream.Position := 0; WriteBinaryStream(Section, Name, MemoryStream); finally MemoryStream.Free; end; end; |
AW: FileStream mit "TIniFile Funktionalität".Methoden
Bis auf die Tatsache, dass du dich jetzt mit einem
Delphi-Quellcode:
verheiratet hast sieht das doch gut aus.
TMemIniFile
Wenn du eine Klasse geschrieben hättest, die etwas näher bei deiner Anwendung und etwas weiter weg von
Delphi-Quellcode:
ist, dann wäre das flexibler.
TMemIniFile
Delphi-Quellcode:
type
TFoo = class( TCustomIniFile ) private FIniFile : TCustomIniFile; public constructor Create( AIniFile : TCustomIniFile ); // Alle Methoden auf die interne FIniFile umleiten procedure WriteMetaFile( const Section, Name : string; const Value : TMetaFile ); procedure ReadMetaFile( const Section, Name : string; const Value : TMetaFile ); end; constructor TFoo.Create( AIniFile : TCustomIniFile ); begin inherited Create; if not Assigned( AIniFile ) then raise EArgumentNilException.Create( 'TFoo: AIniFile' ); FIniFile := AIniFile; end; procedure TFoo.WriteMetaFile( const Section, Name : string; const Value : TMetaFile ); var LStream : TStream; begin LStream := TMemoryStream.Create; try Value.WriteToStream( LStream ); LStream.Position := 0; FIniFile.WriteBinaryStream( Section, Name, LStream ); finally LStream.Free; end; end; |
AW: FileStream mit "TIniFile Funktionalität".Methoden
Okay. Meistens arbeite ich aber mit einen eigenen IniFileParser. Der liest die Ini mit Assignfile und Co als TextFile ein. Wenn ich dort jetzt die Methoden (ReadMetaFile, ReadBinaryStream bzw. WriteMetaFile, SaveToStream) ergänze geht das dann noch als TextFile?
Delphi-Quellcode:
function TStrIniFile.LoadFile: boolean;
var F: TextFile; S: string; Buf: array [1..65536] of Char; begin Result := false; if IniFileExists then begin AssignFile(F, FFileName); SetTextBuf(F, Buf); if CanOpenFile(F, false) then begin while not Eof(F) do begin Readln(F, S); if IsIniLine(S) then AddItem(S); end; CloseFile(F); Result := true; end; end; end; function TStrIniFile.SaveFile: boolean; var F: TextFile; I: integer; Buf: array [1..65536] of Char; begin Result := false; if FFileName <> '' then begin AssignFile(F, FFileName); SetTextBuf(F, Buf); if CanOpenFile(F, true) then begin for I := 0 to FCount - 1 do begin if I > 0 then if FEqualSignPos[I] < 0 then Writeln(F); Writeln(F, FItems[I]); end; CloseFile(F); Result := true; end; end; end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:38 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 by Thomas Breitkreuz