Bin mir nicht sicher, ob das vor oder nach OnBeforPost passiert, aber Try-Except geht da drin eh nicht.
[EDIT] es wird nach OnBeforePost gepürft
Aber beim .Post kannst ein Try-Except auf EDatabaseError machen,
oder auf OnPostError reagieren.
Delphi-Quellcode:
procedure TDataSet.Post;
begin
UpdateRecord;
case State
of
dsEdit, dsInsert:
begin
DataEvent(deCheckBrowseMode, 0);
DoBeforePost;
CheckOperation(InternalPost, FOnPostError);
// <-----
FreeFieldBuffers;
SetState(dsBrowse);
Resync([]);
DoAfterPost;
end;
end;
end;
procedure TDataSet.InternalPost;
begin
CheckRequiredFields;
end;
procedure TDataSet.CheckRequiredFields;
var
I: Integer;
begin
for I := 0
to FFields.Count - 1
do
with FFields[I]
do
if Required
and not ReadOnly and (FieldKind = fkData)
and IsNull
then
begin
FocusControl;
DatabaseErrorFmt(SFieldRequired, [DisplayName]
{, Self});
// k.A. warum Self auskommentiert ist, aber für die Fehlersuche wäre es eigentlich besser, wenn es das nicht wäre ... in XE auskommentiert und in 10.4 ganz weg o_O
end;
end;
...
procedure DatabaseError(
const Message:
string; Component: TComponent =
nil);
begin
if Assigned(Component)
and (Component.
Name <> '
')
then
raise EDatabaseError.Create(Format('
%s: %s', [Component.
Name,
Message]))
else
raise EDatabaseError.Create(
Message);
end;
procedure TDataSet.CheckOperation(Operation: TDataOperation; ErrorEvent: TDataSetErrorEvent);
var
Done: Boolean;
Action: TDataAction;
begin
Done := False;
repeat
try
UpdateCursorPos;
Operation;
// <------
Done := True;
except
on E: EDatabaseError
do
begin
Action := daFail;
if Assigned(ErrorEvent)
then ErrorEvent(Self, E, Action);
// <------
if Action = daFail
then raise;
if Action = daAbort
then SysUtils.Abort;
end;
end;
until Done;
end;
// unit DBConsts;
resourcestring
SFieldRequired = '
Feld '#39'
%s'#39'
muss einen Wert haben';