Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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
9-1120903985
Юра
2005-07-09 14:13
2005.11.20
2-ух мерные игры


14-1130078980
alexsis
2005-10-23 18:49
2005.11.20
Михаил Задорнов


2-1130956076
floxi
2005-11-02 21:27
2005.11.20
Умножение матриц


1-1130510277
BFG9k
2005-10-28 18:37
2005.11.20
Что происходит между OnClose и OnDestroy ?


5-1109970079
BRom
2005-03-05 00:01
2005.11.20
Видимость внутреннего компоненте другими





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский