Моя программа принимает текстовый файл с тремя столбцами данных при запросе пользователя с помощью файла> open в форме. Однако мне нужен только средний столбец данных из текстового файла, чтобы построить график (используя TeeChart
). Поэтому средний столбец из текстового файла хранится в строковом массивеПочему моя программа продолжает поднимать EConvertError при использовании StrtoFloat() в Delphi 2007 для Win32?
Для построения графика мне нужно использовать функцию addXY()
. Поэтому я использую цикл for..do
, чтобы преобразовать содержимое массива строки типа в тип float, которые затем сохраняются в новый массив, называемый дисплеем.
Однако, когда я нажимаю кнопку (на форме) для отображения графика, я получаю
«.... поднял класс исключения EConvertError с сообщением» 0,160 «не является допустимым с плавающей точкой значение ".»
Я имел взгляд через предыдущие вопросы и пытался изменить TFormatSettings
элемент DecimalSeparator
в '.'
, а затем передать TFormatSettings
переменную StrtoFloat()
. Я не уверен, если я реализовал это правильно, так как он, похоже, не работает. Я был бы признателен y помогите пожалуйста.
Я относительно новый для 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.
Может ли быть пробел или другая пунктуация в строке? Кажется, это сообщение об ошибке. Если есть пробел, попробуйте применить TRIM до StrToFloat. –
Не используйте 'FillChar()' для инициализации переменной 'TFormatSettings'. Используйте один из статических методов 'TFormatSettings.Create()', например: 'FS: = TFormatSettings.Create;' Без параметров 'Create()' инициализирует использование параметров из локали системы по умолчанию. Другие 'Create()' overloads позволяют указать конкретную локаль по идентификатору или имени. –
ShowMessage (Данные [3]) должны быть Data [n] предположительно. У вас может быть ошибка намного позже в списке. Вы уверены, что у вас есть не менее 1000 непустых строк? – Dsm