![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Почему этот код не работает ?!!! Помогите!!!плиз
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;