2015-11-18 3 views
1

Моя программа принимает текстовый файл с тремя столбцами данных при запросе пользователя с помощью файла> 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. 
+1

Может ли быть пробел или другая пунктуация в строке? Кажется, это сообщение об ошибке. Если есть пробел, попробуйте применить TRIM до StrToFloat. –

+2

Не используйте 'FillChar()' для инициализации переменной 'TFormatSettings'. Используйте один из статических методов 'TFormatSettings.Create()', например: 'FS: = TFormatSettings.Create;' Без параметров 'Create()' инициализирует использование параметров из локали системы по умолчанию. Другие 'Create()' overloads позволяют указать конкретную локаль по идентификатору или имени. –

+0

ShowMessage (Данные [3]) должны быть Data [n] предположительно. У вас может быть ошибка намного позже в списке. Вы уверены, что у вас есть не менее 1000 непустых строк? – Dsm

ответ

1

Вы, скорее всего, бездомную возврат каретки или перевод строки в разобранных строках данных , Самый простой способ избежать этого является Trim ваши записи

data[n]:= Trim(col_2); 

Это удаляет паразитную пробелы (включая CR/LF).