鉴于这种混乱(多年前设计用于将某些数据写入csv“field1”,“field2”),输出文件已开始停止大约55个字符。在showmessage()调用或放置在本地String变量中也是如此。转换为TStringList以清除代码甚至以相同的方式失败。在代码停止时在IDE中将此检查为本地字符串变量将按计划显示整个构建的字符串。 ShowMessage()甚至会在最后添加尾随省略号....
我最终以“LD”,“BC63781S”,“JACKSON”,“MS”,“DENVER”,“CO”,“1186”,“0”...在showmessage和“LD”,“BC63781S磁盘文件中的“,”JACKSON“,”MS“,”DENVER“,”CO“,”1186“,”0“。
更好的可读性 https://gist.github.com/788839
Writeln(F,
'"'+ ACtion
+ '","' + Ini.ReadString('IP_ITS','BAccount','TEST')
+ '","' + FieldByName('PICKCITY').AsString
+ '","' + FieldByName('PICKST').AsString
+ '","' + FieldByName('DROPCITY').AsString
+ '","' + FieldByName('DROPST').AsString
+ '","' + FieldByName('TOT_MILES').AsString
+ '","' + FloatToStr(AWeight)
+ '","' + FieldByName('LENGTH').AsString
+ '","' + FloatToStr(AStops)
+ '","' + ''{grosspay}
+ '","' + FieldByName('PICK_DATE').AsString
+ '","' + FieldByName('PICK_TIME').AsString
+ '","' + FieldByName('DROP_DATE').AsString
+ '","' + FieldByName('DROP_TIME').AsString
+ '","' + AEquip
+ '","","' + ALTL
+ '"' + ',"","' + '","1","'
+ Ini.ReadString('IP_ITS','BComp','BAccount')
+ FieldByName('PRO_NO').AsString
+ '","","","","",""'
)
答案 0 :(得分:5)
两个修复可能性:
1)而不是每个字符串之间的+号,而是使用a。它将让Writeln()进行文本连接。
Writeln(F, '"',ACtion,'","', Ini.ReadString('IP_ITS','BAccount','TEST'),'","',
FieldByName('PICKCITY').AsString,'","',FieldByName('PICKST').AsString,'","',
FieldByName('DROPCITY').AsString,'","',FieldByName('DROPST').AsString,'","',
FieldByName('TOT_MILES').AsString,'","',FloatToStr(AWeight),","',
FieldByName('LENGTH').AsString,'","',FloatToStr(AStops),
'","',''{grosspay},'","',FieldByName('PICK_DATE').AsString,
'","',FieldByName('PICK_TIME').AsString,'","',FieldByName('DROP_DATE').AsString,
'","',FieldByName('DROP_TIME').AsString,'","',AEquip,
'","","',ALTL,'"' , ',"","',
'","1","',Ini.ReadString('IP_ITS','BComp','BAccount'),FieldByName('PRO_NO').AsString,
'","","","","",""');
2)使用Format()然后打开参数数组 - 这是我的首选方式,因为它也更容易修复/维护
Writeln(F, format('"%s","%s","%s","%s","%s","%s","%s", ....
[ACtion,Ini.ReadString('IP_ITS','BAccount','TEST'),FieldByName('PICKCITY').AsString, ..... ]));
在所有情况下,请确保您已设置一定大小的写入缓冲区,并使用{$ I - }:
procedure TClassData.SaveToFile(const FileName: TFileName);
var F: system.Text;
buf: array[word] of byte;
begin
{$I-}
assign(F,FileName);
system.SetTextBuf(F,buf);
rewrite(F);
if ioresult=0 then
begin
writeln(F,...
...
答案 1 :(得分:1)
由于原因,我可能永远不会理解观察字符串数据的行为迫使它截断。 ShowMessage()并没有停止它将文件写得很好。
放一个ShowMessage()或停止而不是骰子。
Quantum Delphi?
也许一个Flush调用会有助于ShowMessage()为什么会切断55个字符?
答案 2 :(得分:1)
您是否在Project>中启用了“大字符串”,“范围检查”和“溢出检查”选项>编译器? 删除所有项目DCU文件,并强制项目重建。 这可能有所帮助。
答案 3 :(得分:-1)
您的文本文件可能包含无效字符,如#0(字符串结尾)。考虑这样的字符串:
sString:='这是一个带有巨大问题的字符串#0。
如果你执行ShowMessage(sString),它只会显示“This a string”,因为#0表示字符串结束符。
记住你实际上看不到#0字符,你可能需要创建一个程序来搜索这个字符并删除它。
更好的解决方案是根本不使用TStringList,也不使用Wite()。使用Stream descendent,就像TFileStream一样,可以彻底摆脱这个问题。