[Lazarus] TFrame improvements

Martin Frb lazarus at mfriebe.de
Tue Nov 30 09:31:16 CET 2021

On 30/11/2021 00:27, Juha Manninen via lazarus wrote:
> On Mon, Nov 29, 2021 at 11:14 PM Ondrej Pokorny via lazarus 
> <lazarus at lists.lazarus-ide.org> wrote:
>     On 29.11.2021 17:18, Juha Manninen via lazarus wrote:
>>     The commit message is not perfect but the committed code is, now
>>     that I fully understand the issue.
>     That is nonsense. I reverted your change. The code user code is
>     just plain wrong and your change in TFrame doesn't change anything
>     about it.
> No, the code is valid although not recommended. Accessing Canvas 
> outside Paint works with some widgetsets and then an exception is wrong.

There are 2 (or 3) question.

1) Is the fix correct: Yes (if 2 or 3), otherwise "not applicable"

2) Is it a bug in first? (and therefore is a fix needed): No.
No (at least if it is at runtime) it is not a bug, because it is by 
design that a frame needs a form as parent.

3) Before the patch, ignoring the design time issues => did it work at 
runtime? (And is it indented to?)
When (without the patch) the stream is read at runtime, and the frame is 
embedded in a Form, does the example code then work?
Basically, will at runtime the parent be set, before any properties are 
(Or, Is that documented that it should?)

=> *If* this works at runtime (and if this is by intention), then there 
is a bug in the designer, in that the designer fails to set the parent 
(parent = designer) in time.

I have not tested the example from the bug. But I did a quick debug of a 
TFrame being loaded, at runtime:
- The TFrame is loading twice from lfm (the frames own lfm, and the 
changeds stored in the form)
-- the first loading, there is no parent set => so it would/could fail.
-- the 2nd loading, there is a parent

The exact "expected" (not tested) behaviour for the app from the bug 
would be:
- If the offending property has a default, and is not changed from the 
default => all good, property is not set during TReader
- If the default is changed in the Frame's lfm => crash, because the 
property is set, when there is no parent.
- if the default is only changed for the frame's instance on the form 
(stored in the form's lfm) => ok

So IMHO it is save to say, that this is not supported at runtime either.
Should it be? IMHO not, see below.

This leaves improving the designer, to add a better error message, and 
handle it more gracefully.


Otherwise Ondrej is right that code accessing the handle (and that 
includes canvas) must do checks.
And TFrame is not the only place were it this is needed.

   b := TPanel.Create(Form1);
   a := TGraphicControl.Create(b);

   //a.Parent := b;
   //b.Parent := Form1;


You must set both parents, or it crashes.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.lazarus-ide.org/pipermail/lazarus/attachments/20211130/17c809f9/attachment.html>

More information about the lazarus mailing list