Hello, Lazarus mailing list.

I've changed the behavior of TCustomForm.Create constructor. Now it raises an exception if your TCustomForm descendant has no resource.

1. Why the change is needed.

Historically TCustomForm has 2 constructors: Create() - for creating forms from resources and CreateNew() - for resourceless forms. When IDE creates a new form it creates a new unit (.pas file) and a new resource (.lfm file). IDE also adds {$R *.lfm} directive into the form unit file to attach the form resource into the executable. During the runtime TCustomForm.Create searches for resource and construct itself based on information from that resource. But what can happen if it can't find an appopriate resource? You will see an empty form. I think most of you will spend plenty of time trying to understand why do you see an empty form if you or someone else accidentally remove the {$R *.lfm} directive. So absence of the form resource is an exceptional situation and LCL must report an exception. LCL already report an exception if you have no resource for TFrame and TDataModule descendants.

On the other hand there are some situations when you want to construct a form in code without any resources. How to be in this case? You must use CreateNew() constructor - the difference between Create and CreateNew only in resource search. Moreover Create constructor also calls CreateNew inside.

2. How this change can affect your applications.

This change is applied only for new projects created by the Lazarus IDE. It does not affect your old projects.

3. Should you change anything in your application.

Yes, please do. If you are using Create() constructor to construct your resourceless forms - you are doing a mistake. Please replace it with CreateNew(). This will also speedup your form construction because no resource will be searched and no resource will be accidentally loaded. To simplify the search of accidental Create() constructor calls set "RequireDerivedFormResource" variable to True and test how your application works. If you see no exceptions - then you are doing things right.

4. How to change the behavior back.

The behavior is controlled by a global variable *RequireDerivedFormResource* which is set to True for all new applications created by the IDE and is set to False by default. If you for some reason want the old behavior just remove "RequireDerivedFormResource := True" line from .lpr file of your new application.

--
Best regards,
Paul Ishenin.


--
_______________________________________________
Lazarus mailing list
[email protected]
http://lists.lazarus.freepascal.org/mailman/listinfo/lazarus

Reply via email to