Консультация № 56566
24.09.2006, 20:47
0.00 руб.
0 7 5
Уважаемые эксперты! Опять вопрос. Пользователь вводит число с клавиатуры. Если вводит через точку(например 1.5 вместо 1,5), то компилятор выдает econverterror. Как обойти эту ошибку? Или можно как-то "переделать" его в "1,5"? И еще если отслеживаю ошибку, то как остановить приложение в этом месте. Ну, чтобы юзер вновь попытался. Но, лучше бы конечно было сделать так, чтобы независимо от вида точки программа работала. Спасибо.

Обсуждение

Неизвестный
24.09.2006, 20:59
общий
это ответ
Здравствуйте, Oricardo!
Компилятор выдаёт ошибку, потому что в качестве разделителя целой и дробной частей в Delphi используется точка.
Можете просто получать строку с числом и заменять в ней точку на запятую (если введена точка) или оставлять строку как есть, есть запятой в ней нет.
Пример удаления запятой в приложении.
Удачи!

Приложение:
var s : string;begin if pos(‘,‘,s)>0 then begin insert(‘.‘,s,pos(‘,‘,s)); delete(s,pos(‘,‘,s),1); end;// теперь s - строка с точкой вместо запятойend;
Неизвестный
24.09.2006, 21:00
общий
Извините! Я описался:Я написал: "заменять в ней точку на запятую (если введена точка)".Я имел ввиду: "заменять в ней запятую на точку (если введена запятая)".
Неизвестный
25.09.2006, 06:25
общий
это ответ
Здравствуйте, Oricardo!
Используй конструкцию try-except для перехвата ИС:

try
Операторы, где возможна ИС;
except
Операторы, которые должны быть выполнены в случае ИС;
end;
Неизвестный
25.09.2006, 12:38
общий
это ответ
Здравствуйте, Oricardo!
Можно так:
procedure TForm1.FormKeyPress(Sender: TObject; var Key: Char);
begin
if Key = ‘.‘ then Key:= ‘,‘
end;
давно
Мастер-Эксперт
425
4118
25.09.2006, 13:36
общий
Ставить точку или запятую - зависит от того, какая функция конвертирования используется. В более новых (типа StrToFloat()) разделитель дробной части берется из настроек системы, в более старых (типа Val()), используется только точка, согласно стандарту.Поэтому более приемлимо будет на проверять каждое нажатие клавиши, а после полного ввода числа проверить, точка или запятая содержится в числе и уже в зависимости от этого применять для преобразования ту или иную функцию.
Об авторе:
Я только в одном глубоко убеждён - не надо иметь убеждений! :)
Неизвестный
25.09.2006, 19:40
общий
это ответ
Здравствуйте, Oricardo!
В приложении в LabelEdit можно ввести только корректный Float

Приложение:
procedure TfmOptions.leMapXPropKeyPress(Sender: TObject; var Key: Char);var ch1, ch2: PChar; s1,s2: String;begin if not (key in [‘0‘..‘9‘,#8,DecimalSeparator]) then key := #0; s1 := TLabeledEdit(Sender).Text; ch1 := PChar(s1); s2 := key; ch2 := PChar(s2); if (key = DecimalSeparator) and (AnsiStrPos(ch1,ch2) <> nil) then key := #0; if (key = DecimalSeparator) and (s1 = ‘‘) then key := #0;end;
Неизвестный
27.09.2006, 08:39
общий
это ответ
Здравствуйте, Oricardo!
function ReplaceStr(str:string):string; // замена запятой на точку
var
ix:integer;
sx:string;
res:string;
begin
ix:=Pos(‘,‘,str);
if ix<>0 then str[ix]:=‘.‘;
ReplaceStr:=str;
end;
Форма ответа