Delphi-PRAXiS
Seite 1 von 3  1 23      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi AnsiString speichern und laden (https://www.delphipraxis.net/207283-ansistring-speichern-und-laden.html)

Willie1 9. Mär 2021 18:16

AnsiString speichern und laden
 
Hallo,
ich will einen AnsiString speichern und wieder öffnen. Habe ein Tutorium von Himitsu zum Thema gefunden.
Bevor ich das gefunden hatte, wollte ich es so machen:
Delphi-Quellcode:
  public
    Txt: AnsiString;
    Txtarray: TArray<Byte>;
    Path: TFilename;

procedure TForm1.Button2Click(Sender: TObject);
var
  i: Integer;
begin
  if Txt = '' then Exit;
  SetLength(Txtarray,Length(Txt));
  for i:=1 to Length(Txt) do Txtarray[i-1] := Ord(Txt[i]);
  TFile.WriteAllBytes(Path,Txtarray);
end;

procedure TForm1.Button3Click(Sender: TObject);
var
  i: Integer;
begin
  TxtArray := TFile.ReadAllBytes(Path);
  Txt := '';
  for i:=0 to Length(Txtarray) do Txt := Txt + Chr(Txtarray[i]);
  Memo1.Text := Txt;
end;
Um Kompatibilität mit alten Delphi-Versionen geht es mir nicht. Geht das so in Ordnung?
Gruß Willie.

Rolf Frei 9. Mär 2021 18:28

AW: AnsiString speichern und laden
 
Leider verstehe ich nicht so ganz was du da genau machen willst. Wieso so kompliziert? Wieso nicht mit einer TStringList und SafeToFile? Warum willst du das überhaupt als ANSI speichern?

Delphi-Quellcode:
with TStringList.Create do
try
  { Speichern }
  Text := String(DeinAnsiText);
  SaveToFile(DeinFileName, TEncoding.ANSI);

  { Laden }
  LoadFromFile(DeinFieleName, TEncoding.ANSI);
  DeinAnsiText := AnsiString(Text);
finally
  Free
end;

himitsu 9. Mär 2021 23:50

AW: AnsiString speichern und laden
 
Da Byte und AnsiChar gleich groß sind, kann man statt der Schleife und jedem Char einzeln auch einmal Move oder SetString verwenden.


Statt den direkten Casts (siehe Rolf Frei) kann man auch TEncoding verwenden. (die Casts sind hier aber einfacher)

Und wenn du schon TFile.WriteAllBytes verwendest ... dir ist aufgefallen, dass es da auch Methoden für Text/String gibt?
Und TStringStream gibt es auch noch. (das uralte AssignFile+Write hat noch ein AnsiString als Input)


Viele Standardfunktionen gehen nutzen halt String und es gibt sie nicht mit AnsiString, darum ist geht hier dann oft der Umweg über einen String (UnicodeString).

haentschman 10. Mär 2021 05:21

AW: AnsiString speichern und laden
 
Moin...8-)
Delphi-Quellcode:
with TStringList.Create do
.
...mich gruselts. :twisted:

[Gebetsmühle on]
with nicht mehr verwenden! ... Probleme z.B. mit TRect und keine Auflösung der Variablen im Debugging! :warn:
[Gebetsmühle off]

Rolf Frei 10. Mär 2021 12:09

AW: AnsiString speichern und laden
 
Gegen with ist in so einem regional beschränkten einfachen Fall nichts einzuwenden, vorallem weil darin nur mit Sachen des erstellten Objects gearbeitet wird. Die Frage ist immer wo und für was man es einsetzt. Hier mit dem try/finaly und einer TStringList passt das problemlos, aber das ist ein anderes Thema, das nichts mit der Originalfrage zu tun hat.

Sinspin 10. Mär 2021 12:14

AW: AnsiString speichern und laden
 
Du hast schon recht, momentan kann da nix schiefgehen. Interessant wird es erst wenn die Sache komplexer wird und man vergisst den Unsinn zu entfernen.

Willie1 10. Mär 2021 18:10

AW: AnsiString speichern und laden
 
Hallo,
danke für eure Tipps, ich habe lange ein altes Delphi benutzt, darum kenne ich noch nicht alle Verbesserungen.

Warum AnsiString statt WideString?
Ich hatte mir vor vielen Jahren eine einfache Verschlüsselung ausgedacht. Ich verknüpfe das 2. Nibble des 1. Bytes mit dem 1. Nibble des 2. Bytes usw. und zum Schluss noch das erste mit dem letzten Nibble. Nur als Teil der Verschlüsselung! Mit WideStrings macht das keinen Sinn.
Ich will auf keinen Fall jetzt eine Diskussion über Verschlüsselung anfachen! Das war nur eine Idee, die ich damals hatte und will sie mal ausprobieren.

Willie.

PS. with TFenster.Create do
try Showmodal finally Free end
benutze ich oft und sehe darin kein Problem, es spart Quelltext und ist übersichtlich.

KodeZwerg 10. Mär 2021 18:22

AW: AnsiString speichern und laden
 
Idee, verpack doch dein AnsiString in ein Base64 Encoding string.
Dann brauchst Du Dir um Unicode nicht mehr viele Gedanken machen.
Nur noch die eigene Lade/Speicher methode mit dem Base64 ergänzen, fertig.
(Es kann auch jede andere Base64 Lösung genommen werden, die ist halt bereits enthalten.)

Viel Erfolg!

himitsu 10. Mär 2021 18:58

AW: AnsiString speichern und laden
 
Also hast du keinen AnsiString (CP_ACP) sondern einen RawByteString, oder besser noch ein TBytes.

Und vorallem mit Letzterem bereitet das TFile.WriteAllBytes keine Probleme.

stifflersmom 11. Mär 2021 11:09

AW: AnsiString speichern und laden
 
Zitat:

Zitat von Willie1 (Beitrag 1484841)
PS. with TFenster.Create do
try Showmodal finally Free end
benutze ich oft und sehe darin kein Problem, es spart Quelltext und ist übersichtlich.

Mit der Übersichtlichkeit ist's im Debugger dann aber nichts mehr...


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:13 Uhr.
Seite 1 von 3  1 23      

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