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@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 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.
-- 
_______________________________________________
lazarus mailing list
lazarus@lists.lazarus-ide.org
https://lists.lazarus-ide.org/listinfo/lazarus

Reply via email to