【发布时间】:2015-11-18 18:28:42
【问题描述】:
当用户在表单上使用 file>open 提示时,我的程序会获取一个包含 3 列数据的文本文件。但是,我只需要文本文件中的中间数据列来绘制图形(使用TeeChart)。因此,文本文件的中间列存储在字符串数组中
为了绘制图表,我需要使用addXY() 函数。因此,我使用for..do 循环将字符串类型数组的内容转换为浮点类型,然后将其存储到一个名为 display 的新数组中。
但是,当我点击一个按钮(在表单上)来显示图表时,我不断得到
"....引发异常类 EConvertError,消息为 "0.160 '不是有效的浮点值。'"
我查看了之前的问题并尝试将TFormatSettings 成员DecimalSeparator 修改为'.',然后将TFormatSettings 变量传递给StrtoFloat()。我不确定我是否正确实施了这一点,因为它似乎不起作用。如有任何帮助,我将不胜感激。
我对 Delphi 比较陌生,但有使用 C 的经验。
我在下面列出了我的程序:
var
Form1 : TForm1;
ft : text;
data : Array[1..10000] of string;
FS : TFormatSettings;
implementation
{$R *.dfm}
{Open and store textfile}
procedure TForm1.Open_fileClick(Sender: TObject);
var
col_1 : String[18];
col_2 : String[7];
col_3 : String[10]; //size of each column
n : smallint;
begin
if OpenDialog1.execute then
n:=1;
assignfile(ft,OpenDialog1.FileName);
reset(ft);
try
while not Eof(ft) do
begin
Readln(ft, col_1, col_2,col_3);
data[n]:= col_2;
inc(n);
end;
Showmessage(data[3]); //check if correct value displayed
finally
CloseFile(ft);
end;
end;
{Display on TChart}
procedure TForm1.Display_dataClick(Sender: TObject);
var
n: smallint;
display : Array[1..10000] of single;
begin
series1.clear;
chart1.Title.Text.Clear;
chart1.Title.Text.add('Output Data, y[n]'); //set up graph
FillChar(FS, SizeOf(FS), 0);
FS.DecimalSeparator := '.'; //is this correct?
for n:=1 to 10000-1 do display[n]:= strtofloat(data[n+2],FS);
for n:=0 to 10000-1 do series1.addxy(n/10000,display[n]);
end;
end.
【问题讨论】:
-
字符串中可能有空格或其他标点符号吗?错误消息似乎表明了这一点。如果有空格,请尝试在 StrToFloat 之前应用 TRIM。
-
不要使用
FillChar()来初始化TFormatSettings变量。请改用静态TFormatSettings.Create()方法之一,例如:FS := TFormatSettings.Create;无参数Create()使用默认系统区域设置中的设置进行初始化。其他Create()重载允许您通过 ID 或名称指定特定的语言环境。 -
ShowMessage(Data[3]) 应该是 Data[n] 大概。您可能会在列表的稍后部分出现错误。您确定至少有 1000 个非空行吗?
-
使用不推荐使用的长短字符串的大错误。使用原生字符串类型。
-
@Dsm 哦,对不起,我忘了提到文本文件是三列数字,前两行作为列的标题。这就是为什么我想查看数据[3],以测试它是否读取了列中的正确数字。是的,我想阅读的文本文件中大约有 8000-10000 行。
标签: delphi delphi-2007