Hola vmelga.
Creo haberte entendido lo siguiente:
Tenés un DBGrid asociado a una tabla y cuando escribis sobre el mismo DBgrid en determinada celda, querés verificar si el valor de la misma existe en otra tabla. Y si no existe mostrar un mensaje, borrar lo escrito y posicionarte en la misma celda para volver a escribir.
Si es así, probá de la siguiente forma:
Código Delphi
[-]
private
procedure CampoSetText(Sender: TField; const Text: String);
end;
...
implementation
procedure TForm1.CampoSetText(Sender: TField; const Text: String);
begin
if Text <> '' then
begin
TuQuery.Close;
TuQuery.SQL.Clear;
TuQuery.SQL.Add('Select * From TuTabla'); TuQuery.SQL.Add('Where Campo = :Dato'); TuQuery.ParamByName('Dato').AsString:= Text;
TuQuery.Open;
if TuQuery.IsEmpty then
begin
ShowMessage('Dato inexistente');
TField(Sender).Value:= '';
Abort;
end
else
TField(Sender).Value:= Text;
TuQuery.Close;
end;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
TuDataSet.FieldByName('TuCampo').OnSetText:= CampoSetText; end;
...
procedure TForm1.FormDestroy(Sender: TObject);
begin
TuDataSet.FieldByName('TuCampo').OnSetText:= nil;
end;
Con un TDBGrid, en lugar de referenciar al TDataSet, podrías hacer:
Código Delphi
[-]
procedure TForm1.FormCreate(Sender: TObject);
begin
with DBGrid1.DataSource.DataSet do
FieldByName('TuCampo').OnSetText:= CampoSetText;
end;
Pero ignoro si es igual para un TdxDBGrid.
Saludos.