Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Программа то работает, то не работает на разных 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 на разделитель...


Наверх

Титульная страница Поиск, карта сайта Написать письмо