FreeAndNil(O);
macht folgendes:
Danach führt ein Zugriff auf O zu einem Fehler.
Wenn das Objekt sebst schon nicht mehr existierte, scheitert FreeAndNil schon selbst.
Benutze beim schrittweisen debuggen mal noch die überwachten Ausdrücke, um Deine Objekte zu untersuchen.
Wenn Du Deinen Quelltext mal aufgeräumt hast, kannst Du ihn ja nochmal zeigen. Vielleicht fällt jemandem dann noch etwas auf...