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

Вниз

обработчик исключительной ситуации   Найти похожие ветки 

 
Дева ©   (2005-11-14 22:47) [0]

Помогите, пожалуйста, написать обработчик исключительной ситуации. Совершенно не могу понять, как его писать, может на примере разберусь.

Задача:
Имеется текстовое поле Edit1, в которое вводятся данные. При нажатии на кнопку Button1:

procedure TForm1.Button1Click(Sender: TObject);
var
i: Integer;
begin
i:=StrToInt(Edit1.Text);
end;

Если в поле Edit1 будут написаны буквы к примеру, то сработает исключительная ситуация и обрубится выполнение всей программы. Надо этого избежать, помогите.


 
Sergey Masloff   (2005-11-14 22:50) [1]

к примеру можно запретить ввод букв ;-)
или почитать в справке про try...except...end. И пример тоже там есть


 
default ©   (2005-11-14 22:56) [2]


procedure TForm1.Button1Click(Sender: TObject);
var
  i: Integer;
begin
  try
    i := StrToInt(Edit1.Text);
  except
    ShowMessage("Это не число")
  end;
end;

P.S. а что одногруппники помочь не могут?


 
Германн ©   (2005-11-15 01:10) [3]

А  если применить Val(), то можно ещё в сообщении об ошибке написать, что "данный символ" не допустим!


 
Германн ©   (2005-11-15 01:14) [4]

Кстати при применении Val() "исключительной ситуации" не будет.


 
Дева ©   (2005-11-16 03:09) [5]

Я просто хочу разобраться с тем, как писать обработку исключительной ситуации.

При данном коде:

procedure TForm1.Button1Click(Sender: TObject);
var
 i: Integer;
begin
 try
   i := StrToInt(Edit1.Text);
 except
   ShowMessage("Это не число")
 end;
end;

все-равно появляется ошибка и работа приложения останавливается.

Я хочу понять, я что-то нетак пишу, или в настройках проекта или среды интегрирования необходимо что-то включить, чтобы все работало???


 
MRAk ©   (2005-11-16 03:20) [6]

кхм делфи на try..except все равно ругается попробуй запустить уже скомпелированный проэкт(тоесть не из под делфи)


 
Джо ©   (2005-11-16 03:23) [7]


> [5] Дева ©   (16.11.05 03:09)

Tools/Debugger Options/Language Exceptions убираем галку Stop on Delphi Exceptions.


 
Плохиш ©   (2005-11-16 11:15) [8]


> Дева ©   (16.11.05 03:09) [5]
> все-равно появляется ошибка и работа приложения останавливается.

Может всё-таки соизволишь прочитать, что в этот момент отладчик тебе сообщает и постараешься понять смысл этого сообщения?


 
Tonich ©   (2005-11-16 11:40) [9]


> Может всё-таки соизволишь прочитать, что в этот момент отладчик
> тебе сообщает и постараешься понять смысл этого сообщения?
>

а нафига???

она ж


> просто хочу разобраться с тем, как писать обработку исключительной
> ситуации


а тут еще читать всякие сообщения компилятора...


 
Плохиш ©   (2005-11-16 11:57) [10]

Мне больше фраза "и обрубится выполнение всей программы" нравиться, ведь врёт и не краснеет, хотя может и краснеет :-)


 
Tonich ©   (2005-11-16 12:28) [11]

неее, они все краснеют )) особенно в определенных ситуациях )))))


 
Дева ©   (2005-11-16 15:25) [12]

Sergey Masloff [1]
Как запретить ввод букв?

Джо, большое спасибо, что помог, хоть ты понял. А то у меня все книги по второму дельфи, а то что там написано, где галочку снимать, не соответствует моему (кажется, пятому). У меня теперь все работает, теперь смогу разобраться с тем, что же все-таки предсавляет из себя обработчик исключительной ситуации:)

Tonich и Плохиш
Хватить глумится. Я же помощи просила, вон Джо, например, без глума понял, в чем проблема...  

Плохиш, а насчет того, что обрубается, я нисколечки не вру!

Tonich. А в каких же это ситуациях мы краснеем?


 
Digitman ©   (2005-11-16 15:29) [13]


> то у меня все книги по второму дельфи


им давно уже место на гвоздике в сортире.

неужто все так печально и нет ни резона ни возможности приобрести из соотв.литературы что-нть посвежее ?

хотя ключевые концепции в Делфи и по сей день не изменились, так что зерно "разумного-доброго-вечного" и там, в Д2, найти можно...


 
Tonich ©   (2005-11-16 15:45) [14]


> Tonich. А в каких же это ситуациях мы краснеем?

ну это не тот форум что бы это обсуждать ))


> А то у меня все книги по второму дельфи

а вот это действительно печально как-то...


 
Игорь Шевченко ©   (2005-11-16 16:09) [15]

Digitman ©   (16.11.05 15:29) [13]


> им давно уже место на гвоздике в сортире.


Это ты, Сергей, погорячился. Потому как написание обработчика исключительной ситуации относится к книгам по первому Delphi.


 
msguns ©   (2005-11-16 16:24) [16]

Применительно к сабжевой ситуации ИМХО не стоит для проверки введенного значения в каждом контроле ставить защищенный блок. Ведь есть же куча функций StrToXXXDef

Для данного случая вполне подходит такой вариант:

with Edit1 do
  if (Text>"") and  (if StrToIntDef(Text,-1)=-1) then
    begin
      ShowMessage("Ошибка !");
      SetFocus; SelectAll;
    end;


 
Amoeba ©   (2005-11-16 16:47) [17]


> Ведь есть же куча функций StrToXXXDef

Если у автора вопроса D5, то там эта ф-ия еще не появилась


 
Игорь Шевченко ©   (2005-11-16 16:50) [18]

msguns ©   (16.11.05 16:24) [16]

:))) вот бы такой компилятор


 
Плохиш ©   (2005-11-16 17:30) [19]


> Дева ©   (16.11.05 15:25) [12]
> Плохиш, а насчет того, что обрубается, я нисколечки не вру!

Врёшь, врёшь. Там написано, что произошла ошибка такая-то и выполнение программы приостановлено, выполнение может быть продолжено по-шагово или нажатием "Старт".


 
Virgo_Style ©   (2005-11-16 20:29) [20]

msguns ©   (16.11.05 16:24) [16]

imho, надежнее использовать TryStrTo...


 
Дева ©   (2005-11-17 03:37) [21]

Книг нет и это печально. На самом деле я купила себе книгу, что-то типа Delphi 5. И сравнила - один в один манулка по второму. Теперь не вижу смысл переводить деньги

Virgo_Style Спасибо большое. Это и правда надежнее.

А в какой ситуации есть потребность использовать методы типа EConvertError. И в какой есть необходимость писать свой?


 
Дева ©   (2005-11-17 12:01) [22]

Подскажите еще вопрос. А если надо ввести в текстовое поле TEdit строку, длиной 13 символов и состоящую только из цифер, как это проверить? Ну длину функцией Length я определю, но как узнать, что она только из цифер?


 
Leonid Troyanovsky ©   (2005-11-17 12:20) [23]


> Дева ©   (17.11.05 12:01) [22]

> TEdit строку, длиной 13 символов и состоящую только из цифер,
>  как это проверить? Ну длину функцией Length я определю,
>  но как узнать, что она только из цифер?


http://rsdn.ru/?Forum/?mid=626935

Ну, а ConvertInput нужно написать свою, с учетом вхождения
только цифр: (s[i] in ["0".."9]) and Length(s) <=13

--
Regards, LVT.


 
Дева ©   (2005-11-17 13:18) [24]

Помогите, пожалуйста!! Совсем не могу понять. Я вызываю методом ShowModal форму, на которой расположена кнопка Ok. Изначально ModalResult = mrNone, это нужно для того, чтобы закрытие формы и выполнение дальнейшего кода происходило лишь в том случае, когда данные в полях TEdit соответствовали требованиям, тогда ModalResult устанавливается в значение mrOk. Но тут у меня проблема - при выполнении всех требований нажимаю на кнопку хорошо и ничего не происходит, приходится нажимать второй раз. Тогда все происходит так, как должно было происходить. Почему? Где моя ошибка
модуль Client

procedure TFormClient.EditPMClick(Sender: TObject);
begin
with DlgClientForm do
 begin
   Edit1.Text:=ADOQueryClient.Fields.Fields[1].AsString;
   Edit2.Text:=ADOQueryClient.Fields.Fields[2].AsString;
   ButtonOk.ModalResult:=mrNone;//устанавливаю значение ModalResult
 end;
//вот вызов другой формы с проверкой того, какая кнопка нажата
if DlgClientForm.ShowModal=mrOk then
 begin
 ADOQueryClient.Edit;
 ADOQueryClient.Fields.Fields[1].AsString:=DlgClient.Cl1;
 ADOQueryClient.Fields.Fields[2].AsString:=DlgClient.Cl2;
 ADOQueryClient.Post;
 end;
end;

модуль DlgClient

procedure TDlgClientForm.ButtonOkClick(Sender: TObject);
begin
if Length(Edit1.Text) <> 13 then
       begin
       ShowMessage("длина должна быть равна 13");
       Edit1.SetFocus;
       end
 else
   begin
   ButtonOk.ModalResult:=mrOk;//Вот присваиваю значение mrOk
   Cl1:=Edit1.Text;
   Cl2:=Edit2.Text;
   end;
end;

P. S. Leonid Troyanovsky, спасибо, буду пробовать


 
Skyle ©   (2005-11-17 13:32) [25]


> ButtonOk.ModalResult:=mrOk;//Вот присваиваю значение mrOk

убрать выделенное?


 
Leonid Troyanovsky ©   (2005-11-17 13:43) [26]


> Дева ©   (17.11.05 13:18) [24]

> procedure TDlgClientForm.ButtonOkClick(Sender: TObject);
>
> begin
> if Length(Edit1.Text) <> 13 then
>        begin
>        ShowMessage("длина должна быть равна 13");
>        Edit1.SetFocus;
>        end
>  else
>    begin
>    ButtonOk.ModalResult:=mrOk;//Вот присваиваю значение
> mrOk



Немного не так.
Во-первых, кнопке ModalResult = mrOK присваивается заранее,
например, в design time.

А если надо отменить закрытие формы, то после, скажем,
ShowMessage надо сделать {Self.}ModalResult := mrNone.

--
Regards, LVT.


 
Дева ©   (2005-11-17 13:55) [27]

Еще вот что, как сделать панель с крестиком в правом верхнем углу? То усть, чтобы она закрывалась?


 
Leonid Troyanovsky ©   (2005-11-17 14:18) [28]


> Дева ©   (17.11.05 13:55) [27]
> Еще вот что, как сделать панель с крестиком в правом верхнем
> углу? То усть, чтобы она закрывалась?


IMHO, вопрос достоин отдельной темы, в которой нужно попытаться
объяснить, что есть искомая панель (и на зачем она нужна).
Или, на худой конец, нарисовать.

--
Regards, LVT.



Страницы: 1 вся ветка

Текущий архив: 2005.12.04;
Скачать: CL | DM;

Наверх




Память: 0.54 MB
Время: 0.029 c
1-1131462242
Веретен
2005-11-08 18:04
2005.12.04
необходимо очистить все TlistBox`ы на странице TTabSheet


10-1108842379
Hmm
2005-02-19 22:46
2005.12.04
Чтение строк из существующего doc-файла (word)... как?


14-1131904021
makvell
2005-11-13 20:47
2005.12.04
Win XP


4-1128079057
Ландграф Павел
2005-09-30 15:17
2005.12.04
Таймер на выключение экрана


1-1131235873
ZLOFENIX
2005-11-06 03:11
2005.12.04
Только для тех кто знает Ultima Online