| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Delphi: Для новичков > Ошибка is not a valid floating point value |
| Автор: IamDreamer 22.3.2011, 19:07 | ||||||
В Memo1 текст:
в Memo2:
При выполнении кода
вылетает ошибка <Project raised exception class EConvertError with message ''' is not a valid floating point value'>. В чём ошибка? |
| Автор: northener 22.3.2011, 19:45 |
Значит там пустая строка. |
| Автор: IamDreamer 22.3.2011, 19:56 |
Видимо, напортачил с индексами... Спасибо. |
| Автор: THandle 22.3.2011, 20:10 |
| IamDreamer, может на всякий случай еще использовать TryStrToFloat? |
| Автор: IamDreamer 22.3.2011, 20:18 | ||
THandle, вообще можно, но. Первоначально в Memo числа заносятся из текстового файла (по условию решаемой задачи). Реализовано вот так:
Перед началом процедуры нужно указать путь к файлу с данными. Мне бы лучше сделать проверку на существование файла (если, например, путь к файлу не указали, а сразу попытались считать данные). |
| Автор: Frees 22.3.2011, 21:00 | ||||
и еще (на всякий случай) в мемо можно сразу грузить файл....
|
| Автор: IamDreamer 22.3.2011, 21:41 |
Спасибо, попробовал. Кода так становится меньше, но как переписать в Memo1 не всё содержимое файла, а первый (или любой другой) столбец? |
| Автор: superVad 22.3.2011, 22:14 | ||
Возможно, в начале работы программы стоит сделать так:
А то вдруг разделитель точка. |
| Автор: IamDreamer 23.3.2011, 17:48 | ||
Пишу:
На что заменить <halt>, чтобы при ошибке программа возвращалась к этапу выбора файла? Метку создать? Пробовал запускать OpenDialog.Execute (с последующим Reset()), но при считывании значений из файла вылетала ошибка http://s1.ipicture.ru/ |
| Автор: superVad 23.3.2011, 17:58 | ||
Для начала пиши:
как то оно грамотней. Ну напиши exit попробуй. А лучше весь код покажи - а то не понятно куда надо возвращаться программе. |
| Автор: IamDreamer 23.3.2011, 18:01 |
| В первоначальном варианте так и было |
| Автор: superVad 23.3.2011, 18:05 |
| IamDreamer, какой ты быстрый Exit попробуй - но возможно я не до конца понял что то. |
| Автор: IamDreamer 23.3.2011, 18:11 |
| superVad, спасибо! То самое. |
| Автор: Frees 23.3.2011, 18:46 |
| у TOpenDialog есть опция ofFileMustExist - позволит открыть только существующий файл. Добавлено через 1 минуту и 12 секунд http://www.beluch.ru/progr/100comp/8_2.htm |
| Автор: IamDreamer 23.3.2011, 19:05 | ||
Сделал так:
|
| Автор: Frees 23.3.2011, 19:17 |
| а если исключение вызовет FloatToStr, формат числа например кривой ? то MessageDLG(... введет в заблуждение и скроет реальную ошибку! |
| Автор: IamDreamer 23.3.2011, 19:26 |
Страшно представить Почему TryStrToFloat есть, а TryFloatToStr нет? |
| Автор: IamDreamer 23.3.2011, 19:38 |
| Обещали файл только с числами. Я их присваиваю переменным, потом вывожу в Memo. |
| Автор: northener 24.3.2011, 01:01 |
Ну раз обещали, то можно и так. Вот только кого назовут стрелочником, если что-то пойдет не так? Ну и вдогонку. Read/Readln могут и не вызвать исключение. Если не включена соответствующая опция компилятора. По умолчанию она включена. |
| Автор: IamDreamer 24.3.2011, 10:29 | ||
Как-нибудь переживу... |
| Автор: IamDreamer 24.3.2011, 18:36 | ||
Файл оказался несколько иной формы: имеет вид
Переменной типа TTime можно напрямую из файла командой Readln(filename, T) присвоить значение первого столбца (т.е. чтобы после выполнения Readln(Filename, T) значение T=11:17:01)? |
| Автор: superVad 24.3.2011, 18:58 | ||||
Я не уверен но возможно надо в FormCreate такое поставить:
И можно будет использовать функцию StrToTime. ПС Вероятно я ошибся и надо использовать LongTimeFormat вместо ShortTimeFormat. В общем поэкспериментируй, попробуй как работает такое:
|
| Автор: IamDreamer 24.3.2011, 19:23 |
То есть всё-таки надо будет сначала считать как строку, потом перевести в TTime? |
| Автор: superVad 24.3.2011, 19:34 | ||
А как ты еще из текстового файла хочешь считать? |
| Автор: IamDreamer 24.3.2011, 19:54 |
| superVad, числа же сразу считываются. |
| Автор: superVad 24.3.2011, 20:13 |
Ну попробуй |
| Автор: IamDreamer 24.3.2011, 20:18 | ||
Файл F имеет вид, как показано выше. Выполнение приводит к ошибке http://s1.ipicture.ru/ |
| Автор: Frees 24.3.2011, 20:22 |
| TTime - это на самом деле Float а в файле у тебя строка, читай строку и StrToTime используй. |
| Автор: IamDreamer 24.3.2011, 20:31 |
| Frees, спасибо. Теперь другая загвоздка: в строковую переменную в результате Readln(filename, stroka) присваивается вся строка, т.е. "11:17:01 1144 268,42 213 65". Как сделать так, чтобы в эту переменную записывалось только время без редактирования файла? |
| Автор: Frees 24.3.2011, 20:48 | ||
может так, хотя не уверен..
|
| Автор: superVad 24.3.2011, 21:14 | ||
Или:
|
| Автор: Frees 24.3.2011, 21:26 |
данные после времени тоже надо из строки stroka брать, Read из файла уже следующую строку данных верноет |
| Автор: IamDreamer 24.3.2011, 21:32 |
| Readln (Filename, Stroka) без ошибок. Если добавить ещё 2 переменные (Readln(Filename, Stroka, A, B)), вылетает та же ошибка. A, B - переменные типа Real. |
| Автор: superVad 24.3.2011, 23:40 | ||||
Ну использовать другую переменную
|
| Автор: northener 25.3.2011, 02:54 |
| 2 superVad. Ну не хочет автор "распарсивать" строки данного ему файла. Ему хочется использовать процедуру Read/Readln! Мне бы тоже хотелось бы этого, если бы я не знал, что "компилер маджик" всё-таки не волшебная палочка. |
| Автор: IamDreamer 25.3.2011, 08:16 | ||
В общем, дело вот в чём. Файл имеет расширение .csv, в блокноте его содержимое выглядит так:
Readln() не может считать информацию из-за разделителей ';' (пробовал заменить их на пробелы - всё получилось). Запятые, отделяющие целую часть от дробной, вроде переваривает. Нужно либо считать все данные в строку, а затем из неё вытащить числа, либо на этапе чтения из файла заставить читать, несмотря на точки с запятыми. Мне второй вариант кажется менее объёмным, но слабо представляю, как его осуществить... |
| Автор: Frees 25.3.2011, 09:15 |
дак работай с ним как с csv, по средствам TStringList (DelimitedText) |
| Автор: superVad 25.3.2011, 09:51 | ||
Как то так:
|
| Автор: IamDreamer 29.3.2011, 14:47 | ||
Тут задание снова поменяли... Новый вид файла с входными данными:
Как учесть то, что последнее значение отделено несколькими пробелами? |
| Автор: Frees 29.3.2011, 14:54 |
может это Tab ? Добавлено через 2 минуты и 59 секунд пример написанный IamDreamer должен был переварить пробелы |
| Автор: IamDreamer 29.3.2011, 14:58 | ||||
Попробовал в качестве Delimiter указать ' ' (один пробел) и проверил результат командой
Результат:
Выходит, количество пробелов ему безразлично Добавлено через 59 секунд SuperVad. Да, переварил. За что ему ещё раз спасибо! А то я уже выматерил тех, кто мне это задание выдал. |