Duch das Setzen von Form.Parent := pnl1;
wird ein DestroyHandle aufgerufen, was intern dazu führt, daß die Items des TreeView freigegeben und neu erzeugt werden. Dadurch werden die gespeicherten Pointer auf die TreeNodes ungültig.
Es kommt immer darauf an, wie das intern behandelt wird.
In TCustomTreeView.DestroyWnd wird der Inhalt von Items in einen MemoryStream geschrieben und Items.Clear aufgerufen. In dem Moment sind die TreeNode-Pointer schon ungültig, obwohl sie noch die richtigen Daten enthalten. Nach dem Recreate werden die TTreeNodes zwar wieder hergestellt, allerdings stimmt die Position im Speicher mit hoher Wahrscheinlichkeit nicht mehr mit der vorigen überein. Das dauerhafte Speichern von Pointern auf TreeNodes ist also mit Vorsicht zu genießen. Leider gibt es auch keinen brauchbaren Event, mit dem man das abfangen könnte.