Форум: "Начинающим";
Текущий архив: 2005.11.20;
Скачать: [xml.tar.bz2];
ВнизПрограмма то работает, то не работает на разных PC Найти похожие ветки
← →
Kostafey © (2005-11-05 14:24) [0]Уважаемые Мастера ! Скомпилированная в Delphi 7 программа
работает то корректно, то некорректно в зависимости от того
на каком PC она запущена. На всех PC установлена WinXP.
Программа не сложная (вычисления и т.п.), каких-либо библиотек не требует.
На том PC, на котором она работает не корректо выдается сообщение:
" "0,001" is not a vaild floating point value ".
В программе действительно есть в оконном элементе TEdit такое значение,
которое в последствии преобразуется примерно так:
strtofloat(Edit1.text), а затем используется в вычислениях.
Так что же такого может быть не так на этом PC, что это не срабатывает
или, возможно, стоит каким-то образом подкорректировать программу ?
← →
_Sergey_ (2005-11-05 14:30) [1]Разделитель дробной и целой части не обязательно запятая. На других компах просто стоит точка. В Delphi есть какая-то функция, которая узнает текущий разделитель. Просто заменяй все "неправильные" символы из Edit1 на разделитель...
← →
stakan © (2005-11-05 14:31) [2]см. DecimalSeparator
← →
jack128 © (2005-11-05 14:32) [3]На том компьютере разделителем целой и дробной части установлена точка, или какой то другой символ, но не запятая которую пытаешся ввести ты. либо вводи нужный символ либо поменяй настройки в панели управления.
← →
begin...end © (2005-11-05 14:32) [4]Вероятно, дело в том, что на других компьютерах в системе установлен разделитель целой и дробной частей числа, отличный от запятой. Чтобы избежать таких ситуаций, перед преобразованием строки в число изменяйте в своей программе глобальную переменную DecimalSeparator или (поскольку у Вас Delphi 7) используйте перегруженную версию FloatToStr (ту, которая принимает параметр FormatSettings).
← →
jack128 © (2005-11-05 14:46) [5]А лудше всего делать так:
function StrToFloatEx(s : string): Extended;
begin
if DecimalSeparator <> "." then
s := StringReplace(s, ".", DecimalSeparator, []);
if DecimalSeparator <> "," then
s := StringReplace(s, ",", DecimalSeparator, []);
Result := StrToFloat(s);
end;
← →
Kostafey © (2005-11-05 14:47) [6]
> stakan © (05.11.05 14:31) [2]
>
> см. DecimalSeparator
Да, но если я поставлю DecimalSeparator:=".";
то прграмма не бутет выполняться на других PC !!!
(где разделитель запятая)
> используйте перегруженную версию FloatToStr (ту, которая
> принимает параметр FormatSettings).
Имеется в виду функция FormatFloat ?
← →
Kostafey © (2005-11-05 14:50) [7]
> jack128 © (05.11.05 14:46) [5]
>
> А лудше всего делать так:...
Хм. Это может сработать. Надо протестировать.
Спасибо !
← →
Kostafey © (2005-11-05 14:53) [8]
> function StrToFloatEx(s : string): Extended;
> begin
> if DecimalSeparator <> "." then
> s := StringReplace(s, ".", DecimalSeparator, []);
> if DecimalSeparator <> "," then
> s := StringReplace(s, ",", DecimalSeparator, []);
> Result := StrToFloat(s);
> end;
Отлично работает !!! Премного благодарен !!!
← →
gdaujk © (2005-11-05 15:08) [9]Если ты принимаешь от потенциального пользователя какие либо численные значения и/или показываешь ему их, то советую тебе:
1) Прикрепи к своему Edit"у филтр ввода, наподобие:procedure TRealEdit.KeyPress(Sender: TObject; var Key: Char);
begin
case Key of
"0".."9", "-", #8: ; //1-9,BackSpase -- нихера не делаем...
"," , ".": //разделители
begin
Key:=DecimalSeparator; //заменим разделитель на допустимый
if (length(Text) = 0) or (Text = "-")
then
begin
Key:=chr(0);
Text := Text + "0" + DecimalSeparator;
SelStart := Length(Text);
end
else
if Pos(DecimalSeparator, Text) <> 0 //разрешаем введение только одного разделителя
then
begin
Key:=#0;
//MessageBeep(MB_OK);
end;
end;
else
begin
Key := #0; //иначе символ не вводиться
end;
end;
end;
Тем самым ты обезопасишь свою программ от некорректного ввода численных значений пользователем.
2) Для вывода численных значений используй FloatToStr, FloatToStrF, IntToStr, и т. п.
И ни каких проблемм...
PS: Описанный фильтр - только пример. Его можно всячески модернизировать. Если элементов, в которые вводятся числа, несколько, то не надо крепить к каждому свой фильтр. Можно прикрепит ко всем один общий...
← →
jack128 © (2005-11-05 15:11) [10]gdaujk © (05.11.05 15:08) [9]
если еще вставка из буффера обмена ;)
← →
gdaujk © (2005-11-05 15:22) [11]jack128 © (05.11.05 15:11) [10]
Можно тогда и WM_PASTE обработать: просто попробовать с помощью StrToFloat перевести то, что неразумный юзер вставил в Edit. Если будет ошибка EConvertError, послать юзера погулять...
PS: фильтр, заменяющий при возможности некорректные выражения, позволяет не напрягать вышеописанным способом юзера...
← →
Kostafey © (2005-11-06 01:38) [12]
> 1) Прикрепи к своему Edit"у филтр ввода, наподобие:...
Да, очень хрошая вешь-этот фильтр.
Просто у меня уже в программе стояли некоторые значения TEdit-ов
по умолчанию. И из-за этих-то стндартных значений программа вылетала.
Всем спасибо за ответы !
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2005.11.20;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.041 c