I have a form with a bunch of labels used from another forms. I came to conclusion that it is not efficient way as form may not be assigned sometimes. So I think it is not good to check if the form assigned every time before I read the data, I think it is better to create a list of public properties and during reading check if form assigned. But in addition to be sure that only one approach is in use I decide to close somehow the direct access to the properties of the components of the form.
Shortly speaking: to protect components being declared in published clause from being accessed from another class, like protected or private clauses would do.
But it looks like no solution exists for this occasion. The only thing is to create another object with properties and force the form to use its properties.
Please give me another solution if you know.
Once a property has been published, it cannot be un-published. And the Delphi form designer needs to publish the components it operates on. So your designed forms will be full of published components.
Since you cannot hide the components what is left is to hide the form. Since you talk about the form sometimes not being assigned, I suspect you are using global variables to refer to your forms. That's probably your main problem. If you have visible global variables of form type, then any part of your program can poke at any other part, with no restraint.
So the first thing to do is to remove those global variables. It's perfectly possible to write an application without a single global variable of form type. Then you can control how the parts of your application interact with each other.
Other parts of the question hint that your forms own data. That's a design choice that is rather fragile. Hold the data in non-visual model objects that are designed just for that purpose. And let the forms merely present views of that data. Then when one part of the system needs to ask for data, it can ask the non-visual model objects rather than the visual forms.