我使用在Parallels VM中运行的Delphi XE2和Win10。我创建该文件是这样的:TFilestream写入给出了意想不到的结果
logfile := TFilestream.Create(WRITE_PATH + 'Log.txt', fmCreate);
这是写:
procedure TfrmMain.Logit(const sToLog: string);
var
len: cardinal;
ss, sx: UTF8String;
str: string;
begin
if mnuMain.Items[1].Items[2].checked then
begin
str := 'Line #: ' + intToStr(GridLine) + #13#10;
ss := UTF8String(str);
len := length(ss);
logfile.WriteBuffer(ss[1],len);
ss := '';
str := '';
len := 0;
sx := UTF8String(sToLog);
len := length(sx);
logfile.WriteBuffer(sx[1], len);
end;
end;
以及检测结果。请注意'发送'行中额外的'Line#:-3'。我想摆脱这一点。 '返回'行是在另一个过程中产生的。花在寻找答案上的时间显示没有解决方案,甚至是另一个例子。也许我搜索了错误的单词。
Line #: -3
Sending MN050;Line #: -3
Sending DS;Line #: -3
Returned [email protected] in 168.5584
改变的代码:
procedure TfrmMain.Logit(sToLog: string);
var
len: cardinal;
ss, sx: UTF8String;
str: string;
begin
str := mnuMain.Items[1].Items[2].Caption;
if mnuMain.Items[1].Items[2].checked then
begin
if flag then
begin
str := 'Line #: ' + intToStr(GridLine) + #13#10;
ss := UTF8String(str);
len := length(ss);
logfile.WriteBuffer(ss[1],len);
end;
flag := false;
ss := UTF8String('');
sx := UTF8String(sToLog) + #13#10;
len := length(sx);
logfile.WriteBuffer(sx[1], len);
end;
end;
结果:
Line #: -3
Sending MN050;
Sending DS;
Sending DS;Returned [email protected] in 183.1767
Line #: -4
Sending MN072;DS;
Returned [email protected]@@@@[email protected] in 175.8367
Line #: -5
Sending MN026;
Sending DS;
Returned [email protected]@@03539 in 175.4539
你能表现出[MCVE ]。这个代码也很笨拙。你真的需要把自己提升到更高的层次。你应该有一个类,你可以发送字符串,并让他们登录。相反,你似乎有一个邪恶的UI代码和文件处理代码组合。 –
谢谢你。你能告诉我为什么我的代码不符合最小的,完整的,可验证的标准吗?虽然我同意一个班会是一个改进,但我不知道如何单独解决我的问题。 – Mike
在附注中,您应该考虑直接使用'TStreamWriter'而不是'TFileStream'。 'TStreamWriter'可以封装'TFileStream'(甚至在内部创建一个),并且具有接受标准的'String'值作为输入的'WriteLine()'方法,并且可以在其输出中将它们写为UTF-8。 –