You're right, I'm trying to create the controls at runtime.
I understand what you said about using frames for this. I'll test and see if that way I'll be able to pass the parameters from one window to another.
As lucamar says, frames were specifically designed as reusable, embeddable containers and are the way to go.
Although you can use forms in the way your quoted code shows I would not recommend it.
For one thing, as you found, you may assume your form instance exists when it does not and cause an immediate access violation.
For another, you are using a sledgehammer to crack a nut. A form is a heavyweight object carrying large volumes of data and references to methods, almost none of which you will use in your tabsheet. Having several of these (tabsheet + form) instances will bloat your program unnecessarily. Why have two containers when one will suffice?
But you may not even need any frames. You could design your tabsheets in the IDE editor and save them. Then use the .lfm as a template to create your tabsheets dynamically, after which you dispose of the .lfm and design phase, once you have everything in working code.
To transfer data (parameters) between tabsheets you could design a simple record to hold it all, and pass that around rather than a huge GUI object like a form. OOP people call it decoupling, it means keeping GUI code separate from the data the program processes. Unfortunately RAD, for all its benefits, can encourage sloppy design in which the GUI is so tightly interwoven with the program data it becomes difficult (or impossible) to unravel without completely changing the program design.
This thread has code that shows one way to work with dynamically created tabsheets.
https://forum.lazarus.freepascal.org/index.php/topic,55400.msg412187.html#msg412187It is based on the code of the originator of the thread, so will not suit your case exactly, but shows the general approach needed.