Посидел немного - придумал решение, с использованием обработчика OnPostError, вот код может кому будет интересно/пригодится, написано универсально, чтоб можно было использовать 1 обработчик на разных ДатаСетах, если для одного дата сета делать то он будет намного проще, преимущество по сравнению со стандартной ошибкой ещё в том что здесь перечисляются все поля которые пользователь не ввёл а не только первое попавшиеся.
Код:
procedure TMainForm.dstSpcPostError(DataSet: TDataSet; E: EDatabaseError;
var Action: TDataAction);
var
i:integer;
s,gridName:string;
begin
S := '';
gridName:=GetGridName(DataSet.Name);
for i := 0 to DataSet.FieldCount - 1 do
begin
if DataSet.Fields[i].Required and DataSet.Fields[i].IsNull then
s := s +'Поле '+(FindComponent(gridName) as TDBGridEh).Columns[GetColumnByName(DataSet.Fields[i].FullName,(FindComponent(gridName) as TDBGridEh))].Title.Caption+' не может быть пустым. ';
end;
E.Message:=s;
end;
function TMainForm.GetColumnByName(const sFieldName : String; GridEh : TDBGridEh): Integer;
var
i:Integer;
begin
Result := -1;
for i := 0 to GridEh.Columns.Count-1 do
begin
if GridEh.Columns[i].FieldName = sFieldName then
begin
Result := i;
break;
end;
end;
end;
function TMainForm.GetGridName(a:string):string;
var
i:integer;
begin
result := '';
for I:= 0 to ComponentCount - 1 do
if (Components[i] is TDBGridEh) then
if (Components[i] as TDBGridEh).DataSource.DataSet.Name = a then
begin
result := (Components[i] as TDBGridEh).Name;
break;
end;
end;