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

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

Почему этот код не работает ?!!! Помогите!!!плиз


Part ©   (2002-11-11 11:56:00) 

По идее этот код должен отлавливать неправильные числа, но когда туда записываешь стринг - возникает EDatabaseError который я не могу перехватить :( Помогите!!!

procedure TForm_R.DBEdit20Exit(Sender: TObject);
var
n : integer;
begin
try
n:= StrToInt(Form_R.DBEdit20.Text);


except
on EDatabaseError do
begin
ShowMessage("Incorrect format!!. Please enter number 1-31!");
DBEdit20.SetFocus;
end;
end;
if (n >31) or (n<1) then
begin
ShowMessage("Incorrect format!!. Please enter number 1-31!");
DBEdit20.SetFocus;
end;
end;


MsGuns   (2002-11-11 13:09:00) [1]

ИМХО, здесь делается попытка проверить корректность введенного ЧИСЛА даты. Я в таких случаях проверяю в защищенном блоке ВСЮ дату, т.е. ЧЧММГГГГ. Если все три составляющих в разных контролах, то не следует фокусировать именно ошибочный контрол, а просто давать одну мессагу. Контроль же делать не по OnExit каждого DBEDIT, а по кнопке "Записать". Да, ессно, вместо DBEdit использовать обычные TEdit на отдельной панельке рядом с гридом.
Что есть лучше хотя бы потому, что Датасет находится не в броузерном стате минимальное время (что, например, весьмо критично для формата Paradox)


Holy   (2002-11-11 12:58:00) [2]

2Part
Вноси в едит значения из поля... Еще можно попробовать у Table событие вроде BeforeEdit,BeforePost,BeforeInsert oбрабатывать или After... Попробуй.


Part   (2002-11-11 12:43:00) [3]

to KoluChi

я посмотрел DataSource.AutoEdit := false и все равно сначала пытается сделать апдейт базе , а потом эксит :((

всем спасибо holy - попробую сделать как ты посоветовал - вносить то в Едит просто - а вот чтоб пользователь видел значения базы когда ничего не меняет ?


holy   (2002-11-11 12:25:00) [4]

Тогда, если такое дело сделай проще... Судя по всему у тебя на форме DBEdit (и видимо ОнЭксит происходит позже, чем попытка записи в базу) махни его на едит просто и из него в соответствующее поле заноси руками. или же не меняя дбедита сделай ему обработчик события от кнопок клавиатуры и проверяй
if not Key in ["0".."9",#9,#8] then key:=0;
Тогда символы не описанного здесь кода просто не введутся.


KoluChi   (2002-11-11 12:20:00) [5]

DataSource.AutoEdit := true - поэтому при выходе из DBEdit изменения пытаются сохранить в базе данных. Отловить можно
по событиям DataSource.DataSet.OnBeforePost;


Alx2   (2002-11-11 12:14:00) [6]

>holy (11.11.02 12:09)
>Попробуй запустить прогу не из Делфей ( ее обработчик сам все
>перехватывает
и проге не достается)

Снять
Tools->Debugger->Language Exceptions->Stop on Delphi Exceptions


Part   (2002-11-11 12:10:00) [7]

Я понимаю - но как отловить этот EDatabaseError? Когда переходишь с этого поля на другое возникает этот ерор :( У меня стоит обработчик на OnExit но ошибочка проходит мимо ???


holy   (2002-11-11 12:09:00) [8]

Народ, не мучайте человека... Попробуй запустить прогу не из Делфей (ее обработчик сам все перехватывает и проге не достается)


KoluChi   (2002-11-11 12:07:00) [9]

DBEdit20.Field.Value := StrToIntDef(Form_R.DBEdit20.Text, 0);


KoluChi   (2002-11-11 12:05:00) [10]

во-первыx, лучше использовать
n := StrToIntDef(Form_R.DBEdit20.Text, 0);
а во-вторых согласен с Alx2
EDatabaseError - ошибка базы данных, а не преобразования




Alx2   (2002-11-11 12:03:00) [11]

>Part (11.11.02 11:56)
Вообще говоря, с помощью E.ClassName можно определить кто пришел.


Alx2   (2002-11-11 12:00:00) [12]

>Part (11.11.02 11:56)
>n:= StrToInt(Form_R.DBEdit20.Text);
> on EDatabaseError do

Вряд ли StrToInt вернет EDatabaseError

Вот пример из хэлпа

const

CRLF = #13 + #10;
var
TempDate: TDateTime;
begin
try
TempDate := StrToDateTime("99/99/1998");
except
on E: EConvertError do
ShowMessage(E.ClassName + CRLF + E.Message);
end;


Наверх

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