I'm not quite sure, but I think to see in the source code of the component that the OnEditingDone event really fires twice: first, when ENTER is pressed (that's hard-coded into TCustomEdit), and second when the Edit loses focus (inherited from TControl). Since your OnEditingDone shows a messagebox the edit automatically loses focus. If you want to check the behavior of the event add a silent watch, for example a counter that you increment in the OnEditingDone and display in a label.
If you really need the message dialog, you could try the following work-around: add a status variable to the form and keep track of the EditingDone's:
var
EditDoneCounter: integer;
In the Edit's OnChange event handler you reset the counter, and in the OnEditDoneEvent you increment it. The main code of the OnEditDone event should be executed only while EditDoneCounter=0.
Something like this (of course, untested...)
procedure TForm1.SpinEditChange(Sender:TObject);
begin
EditDoneCounter := 0;
end;
procedure TForm1.SpinEditEditingDone(Sender:TObject);
begin
if EditDoneCounter = 0 then begin
// here is was you want to do, e.g. show the messge box
end;
inc(EditDoneCounter);
end;