我正在使用在Parallels VM中运行的Delphi XE2和Win10。我创建这样的文件:
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'。我想摆脱它。 '返回'行在另一个proc中生成。搜索答案所花费的时间显示没有解决方案,甚至是另一个例子。也许我搜错了。
Line #: -3
Sending MN050;Line #: -3
Sending DS;Line #: -3
Returned DSANT=ATV@ 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 DSANT=ATV@ in 183.1767
Line #: -4
Sending MN072;DS;
Returned DS@@@@@ON@ in 175.8367
Line #: -5
Sending MN026;
Sending DS;
Returned DS@@@03539 in 175.4539
答案 0 :(得分:4)
它使您错误地解释了日志的内容及其编写方式。 对程序的第一次调用导致
Line #: -3<CRLF>
Sending MN050;
(我添加了<CRLF>
来表示新行字符)
注意,第二行之后没有<CRLF>
。
因此,下一个呼叫将连接到第一个呼叫的第二行
Line #: -3<CRLF>
Sending MN050;Line #: -3<CRLF>
Sending DS;
第三个电话再次连接到上一个
的结尾Line #: -3<CRLF>
Sending MN050;Line #: -3<CRLF>
Sending DS;Line #: -3<CRLF>
Returned DSANT=ATV@ in 168.5584
也许你打算这样做:
Line #: -3 Sending MN050;<CRLF>
Line #: -3 Sending DS;<CRLF>
Line #: -3 Returned DSANT=ATV@ in 168.5584<CRLF>
您可以通过移动+ #13#10
来实现
从
str := 'Line #: ' + intToStr(GridLine) + #13#10;
到
sx := UTF8String(sToLog + #13#10);
答案 1 :(得分:3)
您不能在#13#10
字符串后添加sToLog
CRLF序列,因此下一个Line #:
会转到同一行。
可能的纠正
str := sToLog + #13#10;
len := 0;
sx := UTF8String(str);
但您最好使用GridLine和sToLog参数将此代码重写为独立函数或方法