Juha Manninen wrote 14 lines
On Mon, Nov 29, 2021 at 11:14 PM Ondrej Pokorny via lazarus
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 loaded?
(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;
a.Canvas.Line(1,1,2,2);
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>