Вы должны использовать функции, которые набор данных (в данном случае, TTable) уже дает вам вместо того, чтобы пытаться изобрести колесо. TDataSet предоставляет событие (OnBeforePost), специально разработанное для этой цели.
Нажмите на свой TTable
, а затем перейдите на вкладку «События» в «Инспекторе объектов». Найдите OnBeforePost
событие и дважды щелкните его, чтобы сгенерировать оболочку событий в редакторе кода. Вы увидите что-то вроде этого:
procedure TForm1.Table1BeforePost(DataSet: TDataSet);
begin
// DataSet is the TDataSet (TTable, TQuery, TADOQuery, etc.) to which
// event is attached
end;
Вы можете сделать все ваши проверки, необходимые, прежде чем запись будет записана в базу данных здесь. Например, если вы хотите убедиться, что в каждом отдельном поле есть что-то, вы можете сделать это:
procedure TForm1.Table1BeforePost(DataSet: TDataSet);
var
i: Integer;
begin
// You can replace DataSet with your actual table variable name, but using it
// this way allows you to use this same event for more than one table if you want.
for i := 0 to DataSet.FieldCount - 1 do
if DataSet.Fields[i].IsNull then
raise Exception.CreateFmt('Field %s has no value', DataSet.Fields[i].FieldName);
end;
Если вы хотите убедиться, что только определенные поля имеют значения или что значение находится в определенном диапазоне, вы можете получить доступ к полю напрямую:
procedure TForm1.Table1BeforePost(DataSet: TDataSet);
begin
if DataSet.FieldByName('MyField').IsNull then
Abort; // This silently cancels the post without telling the user
if DataSet.FieldByName('AField').AsInteger = 0 then
raise Exception.Create('AField must not be 0');
end;
Теперь вам не нужно ничего делать в TDBGrid. Если пользователь нажимает DownArrowна последнюю строку и вводит новую строку, и они вводят неполные или неправильные данные, события, описанные выше, будут позаботиться об этом. Они также будут работать, если вы используете две кнопки (один для вставки или редактирования, а другой для публикации), потому что события будут обрабатывать все остальное.
procedure TForm1.ButtonInsertClick(Sender: TObject);
begin
Table1.Insert; // Or Append - if you have an index on the table they're the same thing
end;
procedure TForm1.ButtonPostClick(Sender: TObject);
begin
Table1.Post; // This is 100% of the code you need here
end;