AGB  ·  Datenschutz  ·  Impressum  







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

WideString -> TStream?

Ein Thema von blackdrake · begonnen am 19. Aug 2007 · letzter Beitrag vom 19. Aug 2007
Antwort Antwort
Seite 1 von 2  1 2      
blackdrake

Registriert seit: 21. Aug 2003
Ort: Bammental
618 Beiträge
 
Delphi 10.3 Rio
 
#1

WideString -> TStream?

  Alt 19. Aug 2007, 17:47
Hallo.

Ich möchte einen String im WideString-Format (bei ANSI 00h zwischen jedem Zeichen) in einen TFileStream speichern. Vorher wandle ich ein String in WideString um.

Delphi-Quellcode:
public
  tempstream: TStream;

procedure Write(const Value; Size: Integer);
begin
   mainform.tempstream.WriteBuffer(Value, Size);
end;

procedure WriteRaw(const Value: Binary);
begin
  Write(Value[1], Length(Value));
end;

var
  ws: widestring;
begin
  ws := mainform.edt_vle1.text;
  WriteRaw(ws+#00#00);
end;
Das Ergebnis, das man im Hexeditor betrachten kann, ist jedoch:

abcde[NULL][NULL]

Wieso hat die String -> WideString konvertierung nicht funktioniert?

Da mein Projekt OpenSource ist, möchte ich keine fremden, kostenpflichtigen Komponenten verwenden. Der Benutzer soll mit frei erhältlichen Komponenten oder den Borland-VCLs das Projekt öffnen können. Daher muss ich bis 2008 warten, bis Borland vollen Unicode-Support für die VCLs bietet. Solange wandle ich einfach die Strings in WideStrings um. Das Dateiformat will ich aber bereits Unicode-Ready machen.

Gruß
blackdrake
Daniel Marschall
  Mit Zitat antworten Zitat
Benutzerbild von sirius
sirius

Registriert seit: 3. Jan 2007
Ort: Dresden
3.443 Beiträge
 
Delphi 7 Enterprise
 
#2

Re: WideString -> TStream?

  Alt 19. Aug 2007, 18:08
Was ist denn binary?


Edit: Derzeit kannst du einen Widestring z.B. so speichern:
Delphi-Quellcode:
var ws:widestring;
begin
  ws:=edit1.text;
  stream.Write(ws[1],sizeof(WideChar)*(length(ws)+1));
end;
Aber ob das noch Betsand hat (besonders das "length+1"), wenn mal völlig auf Unicode umgestellt wird....

Edit2: Natürlich "ws:widestring"
Edit3: Ok, ich glaube hier sind noch tausend fehler drinn
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.
  Mit Zitat antworten Zitat
blackdrake

Registriert seit: 21. Aug 2003
Ort: Bammental
618 Beiträge
 
Delphi 10.3 Rio
 
#3

Re: WideString -> TStream?

  Alt 19. Aug 2007, 18:32
Hallo.

Danke für die Antwort

Delphi-Quellcode:
public
  tempstream: TStream;

procedure Write(const Value; Size: Integer);
begin
  mainform.tempstream.WriteBuffer(Value, Size);
end;

procedure WriteWideString(const Value: WideString);
begin
  Write(Value[1], sizeof(Char)*(length(Value)+1));
end;

var
  ws: widestring;
begin
  ws := mainform.edt_vle1.text;
  WriteWideString(ws+#00#00);
end;
Funktioniert leider nicht. In der Ausgabedatei steht weiterhin abcd[NULL][NULL], als wäre es ein AnsiString.

PS: Binary gibts übrigens bei DEC von Hagen Reddmann. Konnte ich jetzt bei dieser WideString lösung steichen.
`
Edit: Fehler besteht sowohl bei Write() als auch bei WriteBuffer() von TStream.

Gruß
Daniel Marschall
Daniel Marschall
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#4

Re: WideString -> TStream?

  Alt 19. Aug 2007, 18:36
Hinweis: Beachte das Zeichen Index 1 ungültig ist bei einer Stringlänge von 0!
  Mit Zitat antworten Zitat
Benutzerbild von sirius
sirius

Registriert seit: 3. Jan 2007
Ort: Dresden
3.443 Beiträge
 
Delphi 7 Enterprise
 
#5

Re: WideString -> TStream?

  Alt 19. Aug 2007, 18:36
Sorry, ich hatte oben noch das sizeof(char) zu sizeof(widechar) geändert.
Wobei ich mich gerade frage, warum du einen ansistring gespeichert bekommst und (mit dem Fehler) nicht nur die erste Hälfte des widestrings
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.
  Mit Zitat antworten Zitat
blackdrake

Registriert seit: 21. Aug 2003
Ort: Bammental
618 Beiträge
 
Delphi 10.3 Rio
 
#6

Re: WideString -> TStream?

  Alt 19. Aug 2007, 18:41
Hallo. sizeof(char) hab ich zu sizeof(widechar) gemacht und erhalte genau das selbe Ergebnis. Irgendwas ist hier komisch. Wieso funktioniert die String -> WideString umwandlung nicht? Funktioniert bei euch dieses Script?
Daniel Marschall
  Mit Zitat antworten Zitat
Benutzerbild von sirius
sirius

Registriert seit: 3. Jan 2007
Ort: Dresden
3.443 Beiträge
 
Delphi 7 Enterprise
 
#7

Re: WideString -> TStream?

  Alt 19. Aug 2007, 18:51
Zitat von Muetze1:
Hinweis: Beachte das Zeichen Index 1 ungültig ist bei einer Stringlänge von 0!
Man sollte es sich nicht angewöhnen, aber in dem Fall (widestring zu PWideChar) würde es klappen.


btw: @blackdrake. In meinem Memorystream landet genau das, was du willst.
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.
  Mit Zitat antworten Zitat
blackdrake

Registriert seit: 21. Aug 2003
Ort: Bammental
618 Beiträge
 
Delphi 10.3 Rio
 
#8

Re: WideString -> TStream?

  Alt 19. Aug 2007, 18:56
Geht denn eine WideString Speicherung nicht auch mit FileStream?
Daniel Marschall
  Mit Zitat antworten Zitat
Benutzerbild von sirius
sirius

Registriert seit: 3. Jan 2007
Ort: Dresden
3.443 Beiträge
 
Delphi 7 Enterprise
 
#9

Re: WideString -> TStream?

  Alt 19. Aug 2007, 19:03
Klappt bei mir genauso (ich habs nur erst mit Tmemorystream gemacht, weil ichs da einfacher überprüfen kann).

Code (in Anlehnung an deinen):
Delphi-Quellcode:
type
  TForm1 = class(TForm)
    Edit1: TEdit;
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
    x:tfilestream;
    procedure write(const buffer;size:integer);
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.write(const buffer;size:integer);
begin
  x.Writebuffer(buffer,size);
end;

procedure TForm1.Button1Click(Sender: TObject);
var ws:widestring;
begin
  ws:=edit1.text;
  x:=tfilestream.Create('T:\test.txt',fmcreate);
  Write(ws[1],sizeof(wideChar)*(length(ws)+1));
  x.free;
end;

end.
Ergebnis siehe Anhang.
Angehängte Dateien
Dateityp: txt test_941.txt (12 Bytes, 11x aufgerufen)
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.
  Mit Zitat antworten Zitat
blackdrake

Registriert seit: 21. Aug 2003
Ort: Bammental
618 Beiträge
 
Delphi 10.3 Rio
 
#10

Re: WideString -> TStream?

  Alt 19. Aug 2007, 19:26
Hallo.

Danke für euere Hilfe. Seltsamerweiße liegt es daran, dass ich Write(...) in eine Prozedur ausgelagert habe. Sobald ich es in eine Funktion auslagere, schreibt er einen AnsiString in die Datei. Die Auslagerung ist aber nicht so wichtig.

Jetzt muss ich nur noch abwarten bis Borland 2034 endlich Unicode-Kompatible VCLs fertigstellt, damit die Stelle im Dateiformat Sinn ergibt.

Was ist jetzt eigentlich mit dem [1] und einem leeren String? Mein PC ist nicht in einer atomaren Explosion untergegangen, als ich die Editbox geleert und die Aktion ausgeführt habe.

Gruß
blackdrake
Daniel Marschall
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 19:50 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