| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Delphi: Общие вопросы > Преобразование StrToFloat |
| Автор: Guest_bobah 26.2.2003, 03:52 |
| У меня в программе из компонента Tedit считывается строка и её нужно преобразовать с учётом знака. При этом неизвестно, число там введено или нет. Стандартный Floattostr выдает ошибку EConvertError, если введено не число, и эту ошибку я никак не могу перехватить. Мучаюсь долго. Ничего не выходит. Может есть обходные пути? |
| Автор: Medved 26.2.2003, 03:57 |
| Используй лучше контрол TRxCalcEdit из RXLib, таких вопросов возникать не будет. а вообще ошибки перехватываются try ... except ... end; |
| Автор: Alex 26.2.2003, 16:39 |
| procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char); begin if Key=',' then Key:='.'; if (pos('.', Edit1.Text)<> 0) and (key='.') then key:=#0; if not(Key in ['0'..'9', '+', '-']) and not (Key=#8)and not (Key='.') then begin key:=#0; beep; end; end; |
| Автор: Guest_bobah 27.2.2003, 06:16 |
| Но если писать try..except..end; то отладчик всё равно останавливает программу при ошибке. У меня - по ошибке EConvertError. Прикол всей этой строки в TEdit - не в точке или запятой, а в том, что туда некоторые тупые юзеры пишут не число, а буквы. Кстати, если код просто откомпилировать и запустить без отладчика, то try..except..end; прекрасно работает! И при любых нарушениях в строке! |
| Автор: cpu 27.2.2003, 06:21 |
| я сменил ник (с guest_bobah на cpu). зарегестрировался. |
| Автор: Medved 27.2.2003, 06:23 | ||
Да, действительно, потрясающее открытие..... |
| Автор: Song 28.2.2003, 05:25 |
| Убери в опциях дебаггера соответстующую опцию. |
| Автор: cpu 1.3.2003, 04:05 | ||
Можно поконкретней, please? (пишу проги а опций дебаггера не знаю - позорррррр! |
| Автор: Vit 1.3.2003, 08:38 |
| Меню->Tools->Debugger Options->Language Exceptions Uncheck: Stop On Delphi Exceptions |
| Автор: cpu 2.3.2003, 04:13 |
| Спасибо!!! |
| Автор: Medved 2.3.2003, 22:33 |
| Только не советую тебе это делать... |
| Автор: cpu 4.3.2003, 04:43 | ||
А что? |
| Автор: Medved 5.3.2003, 06:24 |
| Говоря простым языком - эта фитча очень здорово облегчает процесс отладки и тестирования кода. Если жы Вы поставили программно обработку ошибок, и очень хочеться посмотреть как они (ошибки) обрабатываются, то просто запустите скомпилированный exe-шик из проводника, командной строки и т.д. Ну а в Вашей ситуации саммым корректым выходом было бы (по привилам хорошего стиля) сделать так, как посоветывал alex-co. |
| Автор: Song 5.3.2003, 06:31 |
| ИМХО она очень осложняет, а не облегчает. Если Вам она облегчает значит Вы не привыкли пользоваться современными способами обработки ошибок, например, try .. except .. end Конечно на момент отладки это полезно, но когда кусок кода будет отлажен, работа с ним будет невозможна т.к. IDE всё время будет вылетать по exception'у на этом участке кода. |
| Автор: Medved 5.3.2003, 07:00 |
| Пользуюсь, и очень часто, поэтому и придерживаюсь такого мнения. Причем правильно пользуюсь этим. Просто я предпочитаю писать код таким образом, чтобы у мне не приходилось обрабатывать такого рода ошибки, которые могут возникать в любом случае. Т.е. иначе говоря, если рассматривать вопрос, который прозвучал в этом топике, то поставленную задачу можно решить двумя способами. 1) try..except...end; 2) через OnKeyPress. В первом случае может возникнуть исключительная ситуация, во втором - это не допускается. ИМХО второй вариант больше соответствует хорошему стилю программирования. Этого я и придерживаюсь, причем во всем. |
| Автор: December 5.3.2003, 10:35 | ||
А, по-моему, первый, так как: 1) обработка потенциальных ошибок происходит централизованно, а не дьявол знает где; 2) OnKeyPress поймает далеко не всё. Для общего случая нужно упомянуть об OnChange и т.п. - а это уже и муторно, и система больше нагружается. Так что есплорер форевер. |
| Автор: cpu 6.3.2003, 05:11 |
| Второй вариант лучше. Спасибо всем за инфу! |
| Автор: cpu 6.3.2003, 05:15 |
| (для моего случая) Но в общем, я бы написал Try. |
| Автор: cpu 8.3.2003, 04:20 |
| Недавно возникла проблема аналогичного характера... Что делать, если строка берётся не из Edit а читается из файла например: readln(f,a); Причём заранее неизвестно, число туда написали или нет. Я решил проблему так: function Mystrtoint(a:string):integer; var i:integer; begin for i:=1 to length(a) do if not(copy(a,i,1) in [0..9]) then exit; Mystrtoint:=strtoint(a); end; В принципе, работает, но это же целая процедура, а там не одна такая переменная. Может можно проще? (например, читать из файла другой командой, правда я других не знаю). |
| Автор: Song 8.3.2003, 16:53 | ||
|
| Автор: Song 8.3.2003, 16:56 |
| cpu К слову говоря Ваша функция с чтением из файла ничего общего не имеет. |
| Автор: cpu 9.3.2003, 06:33 | ||
Да, я знаю, но с помощью неё я обрабатывал прочитанные из файла строки. Я не стал приводить весь текст - там лишком много. |