Delphi-PRAXiS
Seite 2 von 2     12   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi WideString -> TStream? (https://www.delphipraxis.net/97955-widestring-tstream.html)

sirius 19. Aug 2007 19:42

Re: WideString -> TStream?
 
Zitat:

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.
Bei dir gibt es durch das ws+#0#0 sowieso keine Probleme, da dein String damit niemals leer ist. Ergo: Brauchst du den Kommentar nicht beachten.

Falls du aber mal einen string nicht konstant erweiterst, bevor du auf eine Element zugreifst:
Wenn du das mit einem ansistring versuchst, dann greift das Programm bei einem leeren string auf Adresse $0000000 zu und es gibt eine AV.
Bei WideString ist das (derzeit) aber wiederum völlig anders. Delphi macht aus dem Widestring einen PWideChar. Und wenn der widestring leer ist, dann gibt diese Funktion als Ergebnis einen gültigen Zeiger auf #00#00 im Datensegment zurück. Dadurch gibt es keine AV. Allerdings sollte man sich auf so etwas nicht verlassen (man weis ja nie was der Compiler morgen macht) und lieber vorher abfragen, ob ws ein Leerstring ist. Du kannst auch gleich statt "value[1]" PWideChar(Value) nehmen. Dann wärst du auf der sicheren Seite, wenn nicht dieses Problem dir dazwischen funkt.

PS: Ich frage mich grad, ob der Compiler bei WS+#0#0 2 Bytes oder 4 Bytes anhängt :gruebel:
Edit: Bei mir sind es vier.

Muetze1 19. Aug 2007 21:19

Re: WideString -> TStream?
 
Zitat:

Zitat von sirius
Wenn du das mit einem ansistring versuchst, dann greift das Programm bei einem leeren string auf Adresse $0000000 zu und es gibt eine AV.

Bei eingeschaltetem RangeCheck wird in beiden Fällen zuvor eine ERangeCheckException ausgelöst. Somit sollte man sich sowas überhaupt nicht angewöhnen, weil sonst läuft das Programm nur einwandfrei bei bestimmten Compilereinstellungen.

blackdrake 19. Aug 2007 21:41

Re: WideString -> TStream?
 
Hallo.

@Mutze1: Wie sollte man den Code anders schreiben, damit er mit allen Compilereinstellungen funktioniert und sauber ist?

Kann mir jemand erklären, wieso eigentlich bei der Auslagerung der Write()-Funktion ein ANSI String anstelle eines WideStrings geschrieben wird? Ist eigentlich ein komisches Phänomen.

Gruß
blackdrake

DGL-luke 19. Aug 2007 21:53

Re: WideString -> TStream?
 
Zitat:

Zitat von sirius
Du kannst auch gleich statt "value[1]" PWideChar(Value) nehmen.


blackdrake 19. Aug 2007 22:02

Re: WideString -> TStream?
 
Danke, hatte ich übersehen. Leider funktioniert es dann nicht mehr.

Folgender Code:

Delphi-Quellcode:
public
  x: tfilestream;

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

procedure TForm1.Button1Click(Sender: TObject);
var
  ws: widestring;
  pwc: pwidechar;
begin
  ws:=edit1.text;
  x:=tfilestream.Create('c:\test.txt',fmcreate);
  pwc := PWideChar(ws);
  Write(pwc, sizeof(wideChar)*(length(ws)+1));
  x.free;
end;
Erzeug nicht E[NULL]d[NULL]i[NULL]t[NULL]1[NULL][NULL], sondern "dd\".

Gruß
blackdrake

Muetze1 19. Aug 2007 22:07

Re: WideString -> TStream?
 
Delphi-Quellcode:
Write(pwc^, sizeof(wideChar)*(length(ws)+1));
Beachte das ^...

blackdrake 19. Aug 2007 22:08

Re: WideString -> TStream?
 
Vielen Dank :)


Alle Zeitangaben in WEZ +1. Es ist jetzt 03:49 Uhr.
Seite 2 von 2     12   

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