Einzelnen Beitrag anzeigen

Hobbycoder

Registriert seit: 22. Feb 2017
927 Beiträge
 
#6

AW: IniFile ReadBinaryStream bekomme ich nicht in Gange

  Alt 1. Nov 2018, 14:22
Trotzdem hätte ich das so gemacht (wie p80286 schon sagte):
Delphi-Quellcode:
function ReadIniStream( const Filename, Section, Ident: String; const IniStream: TStream; const FolderOverride: String = '' ): Boolean;
var
  FIniFile: TIniFile;
  FName: String;
  FMemStream: TMemoryStream;
begin
  Result:=False;
  if IniStream<>nil then
  begin
    FMemStream := TMemoryStream.Create();
    try
      FName := GetIniFilename( Filename, FolderOverride );
      if not SysUtils.FileExists( FName ) then
        Exit;
      FIniFile := TIniFile.Create( FName );
      FIniFile.ReadBinaryStream( Section, Ident, FMemStream );
      FMemStream.Position := 0;
      IniStream.Position := 0;
      IniStream.CopyFrom(FMemStream, SizeOf(FMemStream));
      Result:=True;
    finally
      FMemStream.Free;
      IniStream.Position := 0;
    end;
  end;
end;
Zumindest ungefähr so (hab ich nicht in Delphi getestet).

Der Grund ist folgender:
Zum einen vertrete ich die Einstellung: Wer etwas erzeugt, der gibt's auch frei.
Zum anderen wird zwar in deiner jetzigen Version der Rssultstream auf jeden Fall erzeugt, aber sollte in beim Lesen aus der Ini was schief gehen, gibt sie trotzdem irgendwas zurück. Die aufrufende Methode erfährt davon nichts, und muss dann mit den fehlerhaften Daten weiterarbeiten.

Mit o.g. Lösung hätte man schon mal die Info, ob das Lesen des Streams fehlerfrei war. Nun muss man zwar in der aufrufenden Methode den Stream erzeugen (wieder eine Zeile mehr), aber damit erhöht sich m.M.n. die Übersichtlichkeit an der Stelle, wo ich den Stream dann auch wieder freigeben muss.

Ist aber nur meine Meinung
Gruß Hobbycoder
Alle sagten: "Das geht nicht.". Dann kam einer, der wusste das nicht, und hat's einfach gemacht.
  Mit Zitat antworten Zitat