Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.11.20;
Скачать: CL | DM;

Вниз

Программа то работает, то не работает на разных 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;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.048 c
14-1130225479
Антоний
2005-10-25 11:31
2005.11.20
В силу одной из веток ниже...


1-1130508623
Dimedrol
2005-10-28 18:10
2005.11.20
TWebBrowser. Не копируется текст.


11-1112024023
Орегон
2005-03-28 19:33
2005.11.20
Объявления процедур


5-1110285566
GuAV
2005-03-08 15:39
2005.11.20
procedure TCustomImageList.DefineProperties(Filer: TFiler);


4-1127385325
Wistler
2005-09-22 14:35
2005.11.20
COM-порт и XP