Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 02.11.2009, 15:13   #1
Ho-ho
Новичок
Джуниор
 
Регистрация: 02.11.2009
Сообщений: 5
Сообщение Вывод сообщения об ошибке...

Написал простенькую программу, которая выдаёт корни квадратного уравнения. Но в ней есть один недочет, он заключается в том, что если оставить хотя бы одно из полей для ввода переменных пустым, то программа выдаст ошибку - "" is not a valid floating point value"... Как сделать так, чтобы программа "по нормальному" писала мол, "Введите значения переменных"? Вод код программы:
Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Edit1: TEdit;
    Edit2: TEdit;
    Edit3: TEdit;
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    Label4: TLabel;
    Button1: TButton;
    Label5: TLabel;
    Button2: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Edit1KeyPress(Sender: TObject; var Key: Char);
    procedure Edit2KeyPress(Sender: TObject; var Key: Char);
    procedure Edit3KeyPress(Sender: TObject; var Key: Char);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
a   : real;
b   : real;
c   : real;
x1  : real;
x2  : real;
x3  : real;
Dis : real;
begin
a := StrToFloat(Edit1.Text);
b := StrToFloat(Edit2.Text);
c := StrToFloat(Edit3.Text);
Dis := b*b - 4*a*c;
if Dis < 0
   then
     begin
       Label5.Caption := 'Квадратное уравнение с указанными Вами ' +
                                'коэффициентами не имеет решений, т.к. ' +
                                'дискриминант меньше нуля.';
       Label5.Font.Style:=[];
       Label5.Font.Color:=clBlack;
     end
   else
     if Dis > 0
       then
         begin
           x1 := (-b + sqrt(Dis)) / (2*a);
           x2 := (-b - sqrt(Dis)) / (2*a);
           Label5.Caption := 'Уравнение с указанными Вами коэффициентами ' +
                             'имеет два корня, т.к. дискриминант больше нуля '
                             + #13 +
                             'Первый корень равен: ' +
                             FloatToStrF(x1,ffFixed,4,3) + '.' + #13 +
                             'Второй корень равен: ' +
                             FloatToStrF(x2,ffFixed,4,3) + '.';
           Label5.Font.Style:=[];
           Label5.Font.Color:=clBlack;
         end
       else
         begin
           x3 := -b / 2*a;
           Label5.Caption := 'Уравнение с указанными Вами коэффициентами ' +
                             'имеет один корень, т.к. дискриминант ' +
                             'равен нулю. ' + #13 +
                             'корень этого уравнения равен: ' +
                             FloatToStrF(x3,ffFixed,4,3) + '.';
           Label5.Font.Style:=[];
           Label5.Font.Color:=clBlack;
         end;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  Form1.Close;
end;

procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
begin
  case Key of
    '0'..'9':                         ;
    #8      :                         ;
    #13    : Edit2.SetFocus;
    '.',',' :
      begin
        if Key = '.' then Key := ',';
      end;
  else Key :=Chr(0);
  end;
end;

procedure TForm1.Edit2KeyPress(Sender: TObject; var Key: Char);
begin
case Key of
    '0'..'9':                         ;
    #8      :                         ;
    #13    : Edit3.SetFocus;
    '.',',' :
      begin
        if Key = '.' then Key := ',';
      end;
  else Key :=Chr(0);
  end;
end;

procedure TForm1.Edit3KeyPress(Sender: TObject; var Key: Char);
begin
case Key of
    '0'..'9':                             ;
    #8      :                             ;
    #13    : Button1.SetFocus;
    '.',',' :
      begin
        if Key = '.' then Key := ',';
      end;
  else Key :=Chr(0);
  end;
end;

end.
P.S. в Delphi только 4 дня (да и вообще программирую только 4 дня...).
Ho-ho вне форума Ответить с цитированием
Старый 02.11.2009, 15:19   #2
danekne
Форумчанин
 
Регистрация: 12.02.2007
Сообщений: 360
По умолчанию

при нажатии на клавишу
Код:
if (edit1.text:="") or (edit2.text:="") or (edit3.text:=") then showmessage("введите все данные")
else
<код обработчик>

Последний раз редактировалось danekne; 02.11.2009 в 15:31.
danekne вне форума Ответить с цитированием
Старый 02.11.2009, 15:20   #3
Utkin
Старожил
 
Аватар для Utkin
 
Регистрация: 04.02.2009
Сообщений: 17,351
По умолчанию

Код:
a := StrToFloat(Edit1.Text);
b := StrToFloat(Edit2.Text);
c := StrToFloat(Edit3.Text);
Перед этим нужно сделать проверку, что-то типа
Код:
if Edit1.Text='' then Edit1.Text:='0';
Этими операциями ты пытаешься преобразовать строку в числа и делфи совершенно справедливо тебе говорит, о том что нечего преобразовывать.
Маньяк-самоучка
Utkin появился в результате деления на нуль.
Осторожно! Альтернативная логика
Utkin вне форума Ответить с цитированием
Старый 02.11.2009, 15:21   #4
Alex2009
Proger Man
Форумчанин
 
Аватар для Alex2009
 
Регистрация: 07.03.2009
Сообщений: 584
По умолчанию

if Edit1.Text='' then Label1.Caption:='error';
ShowMessage('Добро пожаловать!');
Alex2009 вне форума Ответить с цитированием
Старый 02.11.2009, 15:22   #5
Gonzo
Форумчанин
 
Аватар для Gonzo
 
Регистрация: 07.03.2009
Сообщений: 123
По умолчанию

Заключай в try...except и лови ошибку
Не говорите что мне делать, и я не скажу куда Вам идти.
Пишу программы на заказ на Delphi и Pascal
Форум разработчиков Pascal и Delphi
Gonzo вне форума Ответить с цитированием
Старый 02.11.2009, 15:24   #6
danekne
Форумчанин
 
Регистрация: 12.02.2007
Сообщений: 360
По умолчанию

Utkin при такой схеме - вполне можно на деление на ноль попасть
danekne вне форума Ответить с цитированием
Старый 02.11.2009, 15:27   #7
Utkin
Старожил
 
Аватар для Utkin
 
Регистрация: 04.02.2009
Сообщений: 17,351
По умолчанию

Цитата:
Сообщение от danekne Посмотреть сообщение
Utkin при такой схеме - вполне можно на деление на ноль попасть
Это уже другой разговор, можно заменять на единицу и вообще строго говоря на нуль можно делить...
Маньяк-самоучка
Utkin появился в результате деления на нуль.
Осторожно! Альтернативная логика
Utkin вне форума Ответить с цитированием
Старый 02.11.2009, 15:34   #8
Anatole
Форумчанин
 
Аватар для Anatole
 
Регистрация: 07.04.2009
Сообщений: 245
По умолчанию

Цитата:
строго говоря на нуль можно делить...
вообще то, не всегда
Всякое безобразие должно быть единообразным. Тогда это называется порядком.
Anatole вне форума Ответить с цитированием
Старый 02.11.2009, 16:11   #9
Ho-ho
Новичок
Джуниор
 
Регистрация: 02.11.2009
Сообщений: 5
По умолчанию

danekne и Utkin, я пробовал делать то, что вы говорите, только вот тут:
Код:
procedure TForm1.Edit(1)(2)(3)KeyPress(Sender: TObject; var Key: Char);
begin
  case Key of
    '0'..'9':                         ;
    #8      :                         ;
    #13    : Edit2.SetFocus;
    '.',',' :
      begin
        if Key = '.' then Key := ',';
      end;
  else Key :=Chr(0);
  end;
end;
Вот что я добавлял:
Код:
  case Key of
    '0'..'9':               ;
    #8      :               ;
    #13     : Edit2.SetFocus;
    '.',',' :
      begin
        if Key = '.' then Key := ',';
      end;
    ''     :
      begin
        if Key = '' then ShowMessage('Введите все данные');
      end;
  else Key :=Chr(0);
  end;
Но компилятор ругается, говорит что "Incompatible types: 'Char' and 'String'"...
Что написали остальные я вообще не понял
Ho-ho вне форума Ответить с цитированием
Старый 02.11.2009, 16:14   #10
Utkin
Старожил
 
Аватар для Utkin
 
Регистрация: 04.02.2009
Сообщений: 17,351
По умолчанию

Цитата:
Сообщение от Ho-ho Посмотреть сообщение
danekne и Utkin, я пробовал делать то, что вы говорите, только вот тут:
Код:
procedure TForm1.Edit(1)(2)(3)KeyPress(Sender: TObject; var Key: Char);
begin
  case Key of
    '0'..'9':                         ;
    #8      :                         ;
    #13    : Edit2.SetFocus;
    '.',',' :
      begin
        if Key = '.' then Key := ',';
      end;
  else Key :=Chr(0);
  end;
end;
Вот что я добавлял:
Код:
  case Key of
    '0'..'9':               ;
    #8      :               ;
    #13     : Edit2.SetFocus;
    '.',',' :
      begin
        if Key = '.' then Key := ',';
      end;
    ''     :
      begin
        if Key = '' then ShowMessage('Введите все данные');
      end;
  else Key :=Chr(0);
  end;
Но компилятор ругается, говорит что "Incompatible types: 'Char' and 'String'"...
Что написали остальные я вообще не понял
Не писал я тебе такого, посмотри внимательно.
Код:
if Edit1.Text='' then Edit1.Text:='1'; // А то нуль не всем нравится
if Edit2.Text='' then Edit2.Text:='1';
if Edit3.Text='' then Edit3.Text:='1';
сразу перед
Код:
a := StrToFloat(Edit1.Text);
b := StrToFloat(Edit2.Text);
c := StrToFloat(Edit3.Text);
Маньяк-самоучка
Utkin появился в результате деления на нуль.
Осторожно! Альтернативная логика
Utkin вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
MaskEdit - вывод об ошибке. lutdan Компоненты Delphi 2 29.10.2009 09:29
Вывод сообщения о скрытом тексте Busine2009 Microsoft Office Word 12 26.09.2009 23:32
Вывод сообщения в PDF Busine2009 Фриланс 2 13.07.2009 09:39
Перехват сообщения об ошибке SanekIrk Работа с сетью в Delphi 2 06.07.2009 04:53
Перхват сообщения об ошибке!!!! chekanoff Общие вопросы Delphi 4 10.12.2007 10:14