La variable F, como tal es un puntero, un número de 4 bytes que indica una dirección en memoria. Cuando vos haces
En realidad estas escribiendo un número de 4 bytes (la dirección que tenía en memoria la instancia que creaste en esa corrida en particular).
Claro que cuando ejecutes otra vez el programa, aún cuando recuperés la dirección, en la memoria no habrá una instancia válida del objeto.
Lo que a vos te hace falta es que tu clase sea auto-persistente, en palabras mas modernas, que sea "serializable".
Esto podrías lograrlo dotando de un par de métodos a la clase, por decir: SaveToStream, LoadFromStream, que se encarguen de escribir y leer todas las propiedades de un stream.
Otra posibilidad, mas elaborada, es que crees una clase que sirva de ancestro a todas tu jerarquía, y que dicha clase tenga la lógica para escribir/leer las propiedades publicadas en un stream. Deben ser las propiedades publicadas porque es para estas para las que tenes información de tipo en tiempo de corrida (RTTI).
Finalmente, podrías derivar tus clases de TComponent (formalmente hablando, que dejen de ser clases y sean componentes), y valerte de los métodos WriteComponent y ReadComponent de un stream. Esto ya implementa, mas o menos, lo que explique antes (valiendose de la clase TWriter y TReader de la VCL).
En fin, este es un tema amplio, con lo dicho pretendo, mas que darte una solución, darte las ideas para que encontres una.
Hasta luego.
Hasta luego.