La otra opción que se me ocurre para lo que buscas hacer, requiere que todos los mensajes de error incluyan dos caracteres arbitrarios que circunscriban al mensaje señalizándolo (para el ejemplo elegí "~" y ".").
Firebird:
Código SQL
[-]CREATE EXCEPTION E_SIN_NOMBRE '~El campo NOMBRE es un dato requerido.';
C++ Builder:
Código PHP:
...
{
if (E->ClassNameIs("EIBInterBaseError")) {
EIBInterBaseError *EI = static_cast <EIBInterBaseError*> (E);
int p1 = EI->Message.Pos("~");
int p2 = EI->Message.Pos(".");
AnsiString msg = p1 ? EI->Message.SubString(p1 + 1, p2 - p1) : EI->Message;
MessageBox(0, msg.c_str(), "", MB_ICONERROR);
} else
MessageBox(0, E->Message.c_str(),"", MB_ICONERROR);
}
De ese modo el mensaje, que sin tratar, debería verse así:
Se verá así:
Saludos