A step backwards

Just set DateSeparator := '-'; on both side. Then they are ISO 8601 now.
1) note the inversion of the files dd/mm/yyyy and yyyy-mm-dd. Setting DateSeparator := '-'; results in dd-mm-yyyy which is not compatible with yyyy-mmm-dd. As a result displaying a date now also raises an exception.
2) I don't want to change the default date format since that affects also the display and entry of dates.
In a n-tier implementation you should standardize the date format between client and server and leave the display/entry format to the client default settings. Since the ISO 8601 yyyy-mm-dd hh:mm:ss format is recognized by all db servers, you could as well use that format to communicate between client and server.
A similar issue exists with the decimal separator. In my country it is a "," and I can't change a floating point value. It returns a "syntax error at ","". So their also you need to convert to a "." in the communication between client and server. And drop the thousand separator that is used in some locales.
On server side, it call "select" of socket api in CanRead function at last, and there is timeout parameter in "select". Therefore if there is sleep(n), there will be problem on large connection situation. Maybe that is why there is no sleep(n) in all of the synapse server demo.
I don't see how a 100ms sleep in the main thread would affect the multi second select time-out in a different thread. The idea of the sleep in the thread creation routine was to start the thread execution immediately and since a listen on a busy port will bail out instantly (no timeout-for that one) at the return of the sleep you can test if the listen failed or not. I agree that on a heavy server load, there is no guarantee the the new thread will execute immediately and that 100ms scan be too short. You could also just put the setting of Factive in the server thread instead of the main thread, synchronize(SetActive()) if need be. I think that is what you meant with
The Active property is set after connection in the socket thread now.
but that change didn't make it to svn, I think.
Latest svn still allows to start several servers listening on the same port without any message on the servers that failed to listen on the port.
An exception will cause a GUI library include. On the client side, the Application.MessageBox is used instead of raise exception.create(). Because there should not be the ok and cancel button in the raise exception in Lazarus.
Exceptions don't cause a GUI include. A plain console program can also use exceptions. The OK and cancel button is only displayed for exceptions that are not caught in the program. A console program will stop and dump a backtrace if the exception isn't caught. Nothing stops you from doing a try .. except Application.MessageBox end;