TFileStream表现得很奇怪

时间:2016-12-19 10:35:55

标签: delphi delphi-7

我有这个代码单元:(我在Win XP sp 3上运行Delphi 7)。

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

CONST
   EOL = #13#10;

type
  TForm1 = class(TForm)
    Button1: TButton;

    procedure Button1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    Procedure StringToStream(Ofile : TFileStream; Const StrValue : String);

  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1   : TForm1;
  Curdir  : String;
  Ofile   : TFileStream;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
   Ofile := TFileStream.Create(curdir + '\TESTfil.HTML', fmCreate,fmsharedenynone);
   try
      StringToStream(Ofile, '<HTML><BODY> </BODY></HTML>' + EOL);
//      StringToStream(Ofile, '</BODY></HTML>' + EOL);
   finally
      Ofile.Free;
   end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
   Curdir := ExtractFileDir(Application.ExeName);
end;

Procedure Tform1.StringToStream(Ofile : TFileStream; Const StrValue : String);

BEGIN
   IF length(StrValue) > 0 then
      Ofile.Write(StrValue,length(StrValue));
    Ofile.Write('testpunkt',9);

END; 

这个单位的输出是:

"28 non printable characters" + "\testpunkt" 

我试过把字符串变成&#34; CONST&#34; 。 - &GT;同样的错误

我用PCHAR试过了 - 有很多错误......(主要是语法错误)

我已将INDY7更改为INDY9以获取idGlobal.WriteStringtoStream() - 但该特定的INDY-9不支持WriteStringToStream。

我做错了什么?

1 个答案:

答案 0 :(得分:5)

您已写入字符串的地址而不是其内容。要将字符串写入流,请使用以下代码:

procedure TForm1.StringToStream(Ofile: TFileStream; const StrValue: string);
begin
  Ofile.WriteBuffer(Pointer(StrValue)^, Length(StrValue));
end; 

这里我已经取消引用指针,因此写了字符串的内容。

注意:

  • 此代码不需要检查字符串是否为空。
  • 由于您使用Delphi 7并且字符串是ANSI,因此传递Length(StrValue)是合理的。如果您转移到Unicode,则必须修改代码以解决编码问题。
  • 我使用WriteBuffer而不是Write,因为前者会在出现错误时引发异常,与Write相反。
  • 您的代码假定写入与可执行文件相同的目录是安全的。如果你部署你的程序,那么这个假设很可能会崩溃。
  • 您对全局变量的使用只会让您陷入困境。请参阅尽可能使用局部变量,作为参数传递的变量,类的数据成员。顺全球。
  • 编写XML充满了复杂性。使用原始字符串操作尝试这样做可能会在将来的某个时候导致许多编码问题。明智的做法是立即使用XML库,以便将来不必重新编写代码。