Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   String in einem Stream schreiben (https://www.delphipraxis.net/173640-string-einem-stream-schreiben.html)

reef 8. Mär 2013 11:30

Delphi-Version: 5

String in einem Stream schreiben
 
Hallo zusammen,

bin neu hier und habe ein paar Fragen zu "String in einem TFileStream schreiben". Die Datei wird zwar geschrieben, nur steht in dieser Datei nicht das, was ich möchte, sondern merkwürdige Zeichen. Ich nutze Delphi XE 2. Hängt das mit dem Unicode zusammen? Was mache ich da falsch?

Delphi-Quellcode:
procedure TForm4.Button1Click(Sender: TObject);
begin
  //comport1.CustomBaudRate := 57600;
  comport1.Open;
  Fstream := TFilestream.Create(ExtractFileDir(ParamStr(0)) + '\test.dat', fmcreate);
  timer1.Enabled := True;
end;

procedure TForm4.Button2Click(Sender: TObject);
begin
  timer1.Enabled := False;
  comport1.close;
  if assigned(FStream) then
  begin
    FStream.Free;
  end;
end;

procedure TForm4.ComPort1RxChar(Sender: TObject; Count: Integer);
var
  Str: String;
begin
  ComPort1.Readstr(Str, Count);
  Fstream.WriteBuffer(Str, Count);
end;

procedure TForm4.Timer1Timer(Sender: TObject);
var
  Str: String;
begin
  Str := '1234';
  ComPort1.WriteStr(Str);
end;
Schönen Dank für Eure Hilfe.

Gruß
Ralf

mkinzler 8. Mär 2013 11:33

AW: String in einem Stream schreiben
 
Vermutlich. Deklariere ml str als AnsiString.

CCRDude 8. Mär 2013 11:37

AW: String in einem Stream schreiben
 
Wäre nicht RawByteString passender als AnsiString?

Bummi 8. Mär 2013 11:39

AW: String in einem Stream schreiben
 
@CCRDude im Zusammenhang mit einem Comport dürfte AnsiString wahrscheinlicher sein...

CCRDude 8. Mär 2013 11:44

AW: String in einem Stream schreiben
 
Soweit ich verstanden habe, verwendet RawByteString keinerlei codeseitenspezifische Konvertierung bei Zuweisungen, AnsiString schon.

Gerade bei einer seriellen Schnittstelle würde ich nicht zwingend reine Textdaten erwarten, sondern auch Steuerzeichen.

Ich hatb neulich mal länger an einem Problem gesessen, wo eine teure Fremdkomponente Binärdaten in einen AnsiString gelesen und mit einer AnsiString-Konstante verglichen hat. Lief super - nur nicht auf z.B russischen oder japanischen Systemen, da ist der String-Vergleich bei gleichen Bytes (in Roh-Ansicht zeigte der Debugger das) in die Hose gegangen, weil sie im AnsiString als andere Zeichen interpretiert wurden als in der Konstante.

mjustin 8. Mär 2013 11:56

AW: String in einem Stream schreiben
 
Zitat:

Zitat von CCRDude (Beitrag 1206497)
Soweit ich verstanden habe, verwendet RawByteString keinerlei codeseitenspezifische Konvertierung bei Zuweisungen, AnsiString schon.

RawByteString oder TBytes bevorzuge ich bei Binärdaten und strings, deren Encoding noch nicht bekannt ist, auch. Über RawByteString schrieb Allen Bauer, es sei ursprünglich nur als Codepageloser Datentyp für Prozedur- und Funktionsparameter gedacht gewesen ("RawByteString was intended to be used only as a function parameter"). - http://stackoverflow.com/questions/6...-vs-ansistring
Was zu der Frage führt ob die Verwendung von RawByteString für anderes als "bad practice" angesehen wird.

Bummi 8. Mär 2013 11:58

AW: String in einem Stream schreiben
 
@CCRDude Du hast Recht, sorry ich war falsch abgebogen ....

p80286 8. Mär 2013 12:02

AW: String in einem Stream schreiben
 
Solange da nichts interpretiert (angezeigt) wird ist das doch Pott wie Deckel oder nicht?

Gruß
K-H

mjustin 8. Mär 2013 12:08

AW: String in einem Stream schreiben
 
Zitat:

Zitat von p80286 (Beitrag 1206505)
Solange da nichts interpretiert (angezeigt) wird ist das doch Pott wie Deckel oder nicht?

Interpretiert wird nicht nur bei der Anzeige, sondern schon bei der Zuweisung z.B. an string / AnsiString Variablen. Dann erscheinen "Fragezeichen" für nicht interpretierbare Zeichen/Zeichenfolgen.

SirThornberry 8. Mär 2013 12:12

AW: String in einem Stream schreiben
 
Der Grund dürfte sein das du nicht den Inhalt des Strings schreibst sondern den String selbst:
Delphi-Quellcode:
Fstream.WriteBuffer(Str, Count);
Wenn du ein SizeOf(Str) aufrufst wirst du sehen das der String immer 4 Bytes groß ist. Wenn du den Inhalt des Strings schreiben willst musst du Str[1] übergeben (die Referenz auf das erste Zeichen)


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:05 Uhr.
Seite 1 von 2  1 2      

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