![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Программа то работает, то не работает на разных PC [D7, WinXP]
Kostafey © (2005-11-05 14:24:00)Уважаемые Мастера ! Скомпилированная в Delphi 7 программа
работает то корректно, то некорректно в зависимости от того
на каком PC она запущена. На всех PC установлена WinXP.
Программа не сложная (вычисления и т.п.), каких-либо библиотек не требует.
На том PC, на котором она работает не корректо выдается сообщение:
" '0,001' is not a vaild floating point value ".
В программе действительно есть в оконном элементе TEdit такое значение,
которое в последствии преобразуется примерно так:
strtofloat(Edit1.text), а затем используется в вычислениях.
Так что же такого может быть не так на этом PC, что это не срабатывает
или, возможно, стоит каким-то образом подкорректировать программу ?
Kostafey (2005-11-06 01:38:00) [1]
> 1) Прикрепи к своему Edit'у филтр ввода, наподобие:...
Да, очень хрошая вешь-этот фильтр.
Просто у меня уже в программе стояли некоторые значения TEdit-ов
по умолчанию. И из-за этих-то стндартных значений программа вылетала.
Всем спасибо за ответы !
gdaujk (2005-11-05 15:22:00) [2]jack128 © (05.11.05 15:11) [10]
Можно тогда и WM_PASTE обработать: просто попробовать с помощью StrToFloat перевести то, что неразумный юзер вставил в Edit. Если будет ошибка EConvertError, послать юзера погулять...
PS: фильтр, заменяющий при возможности некорректные выражения, позволяет не напрягать вышеописанным способом юзера...
jack128 (2005-11-05 15:11:00) [3]gdaujk © (05.11.05 15:08) [9]
если еще вставка из буффера обмена ;)
gdaujk (2005-11-05 15:08:00) [4]Если ты принимаешь от потенциального пользователя какие либо численные значения и/или показываешь ему их, то советую тебе:
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: Описанный фильтр - только пример. Его можно всячески модернизировать. Если элементов, в которые вводятся числа, несколько, то не надо крепить к каждому свой фильтр. Можно прикрепит ко всем один общий...
Kostafey (2005-11-05 14:53:00) [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:50:00) [6]
> jack128 © (05.11.05 14:46) [5]
>
> А лудше всего делать так:...
Хм. Это может сработать. Надо протестировать.
Спасибо !
Kostafey (2005-11-05 14:47:00) [7]
> stakan © (05.11.05 14:31) [2]
>
> см. DecimalSeparator
Да, но если я поставлю DecimalSeparator:='.';
то прграмма не бутет выполняться на других PC !!!
(где разделитель запятая)
> используйте перегруженную версию FloatToStr (ту, которая
> принимает параметр FormatSettings).
Имеется в виду функция FormatFloat ?
jack128 (2005-11-05 14:46:00) [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;
jack128 (2005-11-05 14:32:00) [9]На том компьютере разделителем целой и дробной части установлена точка, или какой то другой символ, но не запятая которую пытаешся ввести ты. либо вводи нужный символ либо поменяй настройки в панели управления.
begin...end (2005-11-05 14:32:00) [10]Вероятно, дело в том, что на других компьютерах в системе установлен разделитель целой и дробной частей числа, отличный от запятой. Чтобы избежать таких ситуаций, перед преобразованием строки в число изменяйте в своей программе глобальную переменную DecimalSeparator или (поскольку у Вас Delphi 7) используйте перегруженную версию FloatToStr (ту, которая принимает параметр FormatSettings).
stakan (2005-11-05 14:31:00) [11]см. DecimalSeparator
_Sergey_ (2005-11-05 14:30:00) [12]Разделитель дробной и целой части не обязательно запятая. На других компах просто стоит точка. В Delphi есть какая-то функция, которая узнает текущий разделитель. Просто заменяй все "неправильные" символы из Edit1 на разделитель...