I notice that LCL doesn't actually come with any TField objects that have OnValidate property. I was using Unidac's TVirtualTable which does actually work in Lazarus, except precisely the OnValidate property.
I tried instead of creating an exception, to show a messagedlg, followed by focus to the grid of the VirtualTable and then Grid.SelectedField to the field of the OnValidate event. And it mostly works except for when you move between columns of the grid. For some reason and I don't know if it's Lazarus's fault (I hope not) or Unidac's fault, but the OnValidate is called before the column is actually selected internally in the grid but after the event of the move cursor to another column of the grid is already processed. So when in OnValidate procedure you try to Assign the SelectedField, it is ignored because the DBGrid object thinks its still on the OnValidate field.
In other words its a big mess to say the least. So I am going to try to forget about Unidac's VirtualTable component and work with TMemDataset instead.
I hope this helps someone in the future.