Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 28.04.2012, 10:27
Ogurcofff Ogurcofff вне форума
Прохожий
 
Регистрация: 28.07.2011
Сообщения: 34
Репутация: 12
По умолчанию Деление на ноль. И борьба с пустым Edit

В процессе "написания" программы возникает целая куча вопросов. И мне как начинающему любителю не решить их своими силами.
Так вот моя простенькая программка производит некоторые вычисления, но иногда возникают исключительные ситуации, такие как деление на 0 или значение из пустого edit-а попадает в знаменатель дроби, что тоже, наверное расценивается как деление на 0.
Какие предлагают решения:
Код:
try
....
except
...
end;
Здесь предлагается в эту конструкцию заключить обработчик ошибок, и в случае исключительной ситуации вывести сообщение, что мол "Произошло деление на ноль. Проверьте правильность ввода данных".
Я же "планирую" чтобы все расчеты происходили при событии OnChange в Edit. И мне эти сообщения не нужны.
Вопрос, возможно ли обрабатывать эти исключения без вывода всяких сообщений, чтобы пустой Edit не выдавал ошибку is not a valid floating point value. И в случае деления на ноль просто не происходили никакие вычисления и все.
Надеюсь понятно расписал.
Задавайте наводящие вопросы
Ответить с цитированием
  #2  
Старый 28.04.2012, 10:31
Аватар для Yurk@
Yurk@ Yurk@ вне форума
Специалист
 
Регистрация: 07.09.2007
Адрес: Украина, г. Днепропетровск
Сообщения: 892
Версия Delphi: 7 + ОгнеПтица
Репутация: выкл
По умолчанию

Код:
TryStrToInt(Edit1.Text, <переменная куда вывести результат>);
__________________
Поживу - увижу, Доживу - узнаю, Выживу - учту.
[P.S.]->Выражая благодарность за помощь - Вы получаете шанс на помощь в следующий раз
Ответить с цитированием
Этот пользователь сказал Спасибо Yurk@ за это полезное сообщение:
Ogurcofff (28.04.2012)
  #3  
Старый 28.04.2012, 12:56
Ogurcofff Ogurcofff вне форума
Прохожий
 
Регистрация: 28.07.2011
Сообщения: 34
Репутация: 12
По умолчанию

Цитата:
Сообщение от Yurk@
Код:
TryStrToInt(Edit1.Text, <переменная куда вывести результат>);
Отвечает мне компилятор [Pascal Error] Unit3.pas(31): E2035 Not enough actual parameters

Цитата:
Сообщение от Ildar-tsr
Код:
if (Edit1.Text = '') or (Edit1.Text = '0') then
  Abort;
Цитата:
Сообщение от NumLock
Код:
try
....
except
end;
Без изменений, также происходит деление на ноль и выскакивает ошибка
Может у кого есть отлаженный код, рабочий, так сказать для анализа.
Ответить с цитированием
  #4  
Старый 28.04.2012, 13:17
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
Восклицание

Цитата:
Сообщение от Ogurcofff
также происходит деление на ноль и выскакивает ошибка
не ври! запусти http://zalil.ru/33150371 и убедись!

Stop on Delphi Exception отключать надо
__________________
Пишу программы за еду.
__________________

Последний раз редактировалось NumLock, 28.04.2012 в 13:21.
Ответить с цитированием
Этот пользователь сказал Спасибо NumLock за это полезное сообщение:
Ogurcofff (28.04.2012)
  #5  
Старый 28.04.2012, 14:01
Ogurcofff Ogurcofff вне форума
Прохожий
 
Регистрация: 28.07.2011
Сообщения: 34
Репутация: 12
По умолчанию

Цитата:
Сообщение от NumLock
не ври! запусти http://zalil.ru/33150371 и убедись!

Stop on Delphi Exception отключать надо
Не врал, честное слово.
А теперь понял ошибку и исправился!.

Вот так должно быть?
Код:
procedure TRIP.Edit1Change(Sender: TObject);
     begin
     try
     a:=StrToFloat(edit1.Text);
     b:=strtofloat(edit2.Text);
     c:=StrToFloat(edit3.Text);
     d:=strtofloat(edit4.Text);
     e:=strtofloat(edit5.Text);
     F:=b+((e-a)/(c-a)*(d-b));
     edit6.Text:=floattostr(f);
   except
   end;
  end;

Последний раз редактировалось Ogurcofff, 28.04.2012 в 14:12.
Ответить с цитированием
  #6  
Старый 28.04.2012, 14:20
Аватар для Ildar-tsr
Ildar-tsr Ildar-tsr вне форума
Местный
 
Регистрация: 09.08.2011
Адрес: г.Сургут, ХМАО
Сообщения: 453
Репутация: 7402
По умолчанию

Цитата:
Сообщение от Ogurcofff
Не врал, честное слово.
А теперь понял ошибку и исправился!.

Вот так должно быть?
Да все верно.
Для окончательного понимания:
Программа пытается выполнить, то что находиться в блок try. Если возникает любая ошибка, то программа незамедлительно переходит в блок except. То есть если возникнет ошибка во время дебага программы (запуска с делфи), то вы увидите сообщение об ошибке, нажмете F9 и программа пойдет выполняться дальше. Если же вы запустите exe'шник, то никаких предупреждение на экран не вылезет.
__________________
Google в помощь
Ответить с цитированием
Этот пользователь сказал Спасибо Ildar-tsr за это полезное сообщение:
Ogurcofff (28.04.2012)
  #7  
Старый 28.04.2012, 15:38
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

Цитата:
Сообщение от Ogurcofff
Почему так получается
потому что:
Цитата:
Сообщение от NumLock
Stop on Delphi Exception отключать надо
в IDE.
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
  #8  
Старый 28.04.2012, 21:23
Аватар для angvelem
angvelem angvelem вне форума
.
 
Регистрация: 18.05.2011
Адрес: Омск
Сообщения: 3,970
Версия Delphi: 3,5,7,10,12,XE2
Репутация: выкл
По умолчанию

Если версия Дельфи не позволяет яно указать, что Edit может воспринимато только цифры, то имеется обходной путь:
Код:
procedure TForm1FormCreate(Sender: TObject);
var
  I : Integer;
begin
  // Устанавливаем для всех Edit-ов только цифры,
  //   в старших версиях дельфи имеется в свойствах контрола.
  for I := 0 to ComponentCount - 1 do
    if (Components[i] is TEdit) then
      with (Components[i] as TEdit) do
        SetWindowLong(Handle, GWL_STYLE, GetWindowLong(Handle, GWL_STYLE) or ES_NUMBER);
end;
и тогда в коде не потребуется делать дополнительные проверки.
__________________
Je venus de nulle part
55.026263 с.ш., 73.397636 в.д.
Ответить с цитированием
  #9  
Старый 28.04.2012, 10:49
Аватар для Ildar-tsr
Ildar-tsr Ildar-tsr вне форума
Местный
 
Регистрация: 09.08.2011
Адрес: г.Сургут, ХМАО
Сообщения: 453
Репутация: 7402
По умолчанию

Цитата:
Сообщение от Ogurcofff
И в случае деления на ноль просто не происходили никакие вычисления и все.
Код:
if (Edit1.Text = '') or (Edit1.Text = '0') then
  Abort;
__________________
Google в помощь
Ответить с цитированием
Этот пользователь сказал Спасибо Ildar-tsr за это полезное сообщение:
Ogurcofff (28.04.2012)
  #10  
Старый 28.04.2012, 10:51
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

Код:
try
....
except
end;
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
Этот пользователь сказал Спасибо NumLock за это полезное сообщение:
Ogurcofff (28.04.2012)
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра
Комбинированный вид Комбинированный вид

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 22:05.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025