Es fehlt im Konstruktor der Komponente TUserButton das override!
Jupp, denn so wird dein Create nicht aufgerufen, das .Icon ist nil und da Delphi solche Subkomponenten nicht automatisch erstellt, knallt es dann beim Laden, da nur über den Getter auf die Instanz zugegriffen und diesem die Daten zugewiesen werden.
Aus diesem Grund finde ich es auch irgndwie krank, daß man einen Setter machen muß, wenn man will, daß sowas in der DFM gespeichert wird, obwohl die VCL den garnicht verwendet.