![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как перехватить ошибку? [D7, Paradox]
Юлия © (2003-08-26 12:44:00)
При попытке добавить неуникальное значение в индексированное (уникально) поле таблицы появляется ошибка. Как перехватить ее и вывести своесообщение?
AlexWeb (2003-08-26 16:50:00) [1]
Вам же сказали, попробовать запустить программу не из Дельфи!!!
При ошибке сообщение будет показываться только Ваше.
procedure TForm1.Query1PostError(DataSet: TDataSet; E: EDatabaseError;
var Action: TDataAction);
begin
if E.HelpContext = 0 then
begin
Action:= daAbort;
ShowMessage ("Неуникальное значение"));
end;
end;
Zacho (2003-08-26 14:54:00) [2]
> Юлия (26.08.03 14:52) [23]
Ну не знаю. У меня - работает.
Юлия (2003-08-26 14:52:00) [3]
VAleksey:
Я действительно явно не вызваю post... У меня значение выбирается из lookup поля... В момент выбора вылезает ошибка. в этом дело? А где же его ловить тогда?
Zacho:
Код обработчика:
application.MessageBox("Неуникальное значение","Ошибка",mb_ok);
Action:=daAbort;
У меня не работает.
(с текстом сообщения пока не разобралась)
VAleksey (2003-08-26 14:45:00) [4]
В обработчике напиши.
Action := daAbort;
Zacho (2003-08-26 14:33:00) [5]
> VAleksey © (26.08.03 14:24) [18]
> Юлия (26.08.03 14:28) [19]
Только что попробовал. Все работает нормально. Естественно, при запусе под отладчиком при включенной опции "Break on Exceptions" сначало выдается стандартное сообщение об ошибке и вываливается в отладчик, а потом вызывается OnPostError. При запуске программы не из Дельфи - естественно, никаких "стандартных" сообщений нет, только то, что я сам выдаю в OnPostError.
2 Юлия : приведи свой код обработчика OnPostError.
VAleksey (2003-08-26 14:33:00) [6]
> Юлия
Блин, а ты вот этого типа "VAleksey ©" игнорируешь?, или явно Post нигде не вызываешь? ;-)
Юлия (2003-08-26 14:28:00) [7]
Пробовала. Не получается. Пишет: key violation
VAleksey (2003-08-26 14:24:00) [8]
> Zacho © (26.08.03 14:23)
Мне тоже помнится, что исключение на нарушение первичного ключа вызывается до OnPostError.
Zacho (2003-08-26 14:23:00) [9]
> Юлия (26.08.03 14:11) [14]
А у меня - нет. Попробуй снять галочку "Break on Exceptions" или запустить программу не из Дельфи.
Юлия (2003-08-26 14:20:00) [10]
Если написать такой код, стандартное сообщение появляется, а мое - нет. В процедуру не попадаем.
VAleksey (2003-08-26 14:14:00) [11]
> Юлия
Тоже естественно. Т.к. жанное сообщение генерируется BDE.
см.
> VAleksey © (26.08.03 12:59)
Юлия (2003-08-26 14:11:00) [12]
Стандартное Сообщение об ошибке вылезает раньше, чем наступает событие onPostError.
Zacho (2003-08-26 14:09:00) [13]
> VAleksey © (26.08.03 14:07) [12]
Согласен. Но у меня старая привычка парсить текст сообщения об ошибке :)
VAleksey (2003-08-26 14:07:00) [14]
> Zacho © (26.08.03 14:04)
Лучше посмотреть в helpe или книге или как - нибудь получить класс исключения и проверить КЛАСС исключения.
Zacho (2003-08-26 14:04:00) [15]
Примерно так:
procedure Form1.Table1PostError(DataSet: TDataSet; E: EDatabaseError;
var Action: TDataAction);
begin
if E.Message="не помню я, какое там сообщение, поставь нужное" then
begin
Action:=daAbort;
application.MessageBox("Неуникальное значение","Ошибка",mb_ok);
end else Action:=daFail;
end;
Юлия (2003-08-26 14:00:00) [16]
(Вопрос к Zacho)
Юлия (2003-08-26 13:56:00) [17]
Напишите, пожалуйста, как это должно выглядеть.
alex-ran (2003-08-26 13:03:00) [18]
Вернее так, опечатался :) :
try
Table1.InsertRecord([...,...,...]);
except
on EDBEngineError do
begin
MessageBox("Неуникальное значение","Ошибка",mb_ok
Abort;
end;
end;
Zacho (2003-08-26 13:02:00) [19]
> Юлия (26.08.03 12:56) [2]
TDataSetErrorEvent = procedure(DataSet: TDataSet; E: EDatabaseError;
var Action: TDataAction) of object;
Обрати внимание на E: EDatabaseError; и var Action: TDataAction
Подробности - в хелпе.
alex-ran (2003-08-26 13:00:00) [20]
Попробуй так:
try
tblAccount.InsertRecord([...,...,...]);
except
on EDBEngineError do beginMessageBox("Неуникальное значение","Ошибка",mb_ok
Abort;
end;