2011/2/2 Paul Ishenin <[email protected]>: > 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.
What about adding TApplication.CreateNewFrom?: http://bugs.freepascal.org/bug_view_advanced_page.php?bug_id=19678 Is that a necessary extension? Vincent -- _______________________________________________ Lazarus mailing list [email protected] http://lists.lazarus.freepascal.org/mailman/listinfo/lazarus
