Mmm, why is there a TIBDataset on your form while you also have a datamodule?
Normally you have a DM for those components (although I do usually have them on my form because I have multiple instances of the same form).
Anyway... OnBeforeEdit from a dataset should be able to handle exceptions.
BeforeEdit is the triggered at the start of the TDataset.Edit method. The dataset is still in dsBrowse state when this event is triggered. If an exception is raised in the BeforeEdit event handler, then the dataset will remain in dsBrowse state, and the edit operation is cancelled.
https://www.freepascal.org/docs-html/fcl/db/tdataset.beforeedit.html
So it might be a bug.
A bug from IBX?
Will try to inform the creator then.
This is not going to be an IBX bug. TIBDataset is a subclass of TDataset (which is in the FCL) and, IBX gets involved only when TDataset.InternalEdit is called. This is called after the BeforeEdit handler runs.
An exception raised in TDataset.Edit flows back to whoever called it. This may be either your code or a Data Aware control (In the LCL) which is where you should look for any dodgy exception handling.
On the other hand. Sysutils.Abort() is a one liner:
Raise EAbort.Create(SAbortError) at CodePointer(Get_Caller_addr(Get_Frame));
I'm just wondering if the Windows/Linux difference is in the call to CodePointer and is due to the debug level you have compiled at. E.g. if you have not compiled in any debugging info under Linux then maybe this call will result in a segment fault.
I would replace your call to Abort with your own exception and see if you get the same result.
Also, looking at your code, if seems odd that you are looking at a record field when deciding whether to abort. Remember that IBX has a record cache which is separate for each TIBDataset instance. Setting a field in one TIBDataset instance does not necessarily result in the field value being propagated to all such instances whether in the same process or another process. Firebird transaction control is a much better way to co-ordinate multiple threads working on the same data but, even here, you have to call TDataset.Post to lock a record and update the database. TDataset.Edit is not enough.