Please let's continue the discussion here, not in Mantis.

Obviously we differ very much in our concepts, so that we should either come to a consent, or leave everything as bad as is.

Felipe Monteiro de Carvalho schrieb:

General concepts:
1> Avoid changing the current TPageControl as much as possible,
because it is extensively used and changes here might cause a pletora
of problems
2> I think it is no problem to introduce heavy changes to TTabControl
because it is rarely used
3> Use exactly the same class hierarchy as Delphi:

TCustomNotebook (in Delphi called TCustomTabControl)
--> TPageControl
--> TTabControl

This hierarchy would require to make the widgetsets independent from specialized Pages (TCustomPage descendants), and this is just what I have in mind.

Just because this hard distinction of a control with pages and one
without makes sense in Windows it doesn't mean at all that it makes
sense in all widgetsets. Plus, just 1 implementation is better then 2
spread across various classes for the widgetset interfaces.

Do you know of any widgetset, whose tabbed control has an idea of related pages?

Now at your notes in Mantis #19575:

>>>>>>>>>>>>>>>>>>>>>
> IMO it's overkill to base the widget on a TCustomNotebook - the internal
> representation of the page data is of no interest to the widgetset. A simpler
> base control would serve the same purpose, and would allow to implement a
> Delphi compatible TTabControl.

overkill is not a problem. The LCL can have more functionality then Delphi, what is a problem is having a component based on a wrong class hierarchy or having less functionality then Delphi.
<<<<<<<<<<<<<<<<<<<<

You address the wrong class hierarchy of TTabControl, I assume?
I fully agree that TTabControl should inherit from LCL TCustomNotebook.


>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
Ummm, I'm not sure about this patch. Some issues:

1> TPagedNotebook is a bad choice for a name, TPagedTabControl is better.
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
Feel free to rename it as you like.


>>>>>>>>>>>>>>>>>>>>>>>>
2> You started by modifying TCustomNotebook ... I would much prefer if you started by fixing TTabControl instead.
<<<<<<<<<<<<<<<<<<<<<<<

Since TTabControl has no Pages, some methods and properties have to become at least virtual in TCustomNotebook.

Unlike in Delphi, where Pages are introduced only in TPageControl, the LCL TCustomNotebook *and* the widgetsets currently do not work without pages. But as I proved they *can* work without an PageList :-)

>>>>>>>>>>>>>>>>>>>>>>>>
3> Your entire description of the bug seams to be based on a wrong understanding of how TTabControl should work. Why are you putting a TPanel inside a TTabControl??? TTabControl can only contain ... tabs. It can never contain a Panel nor a Page, nor anything else.
<<<<<<<<<<<<<<<<<<<<<<<<<

You misunderstand the demo application. In contrast, why does a TPageControl put TabSheets into the tabbed widget???

The panels in the demo program only demonstrate that a TTabControl *can* have associated controls, *not* bound to TCustomPage derivates, and *not* bound to the TTabControl as their parent.


>>>>>>>>>>>>>>>>>>>>
4> Why do you expect Tabs.Tabs.AddObject to work at all? You should not use this AFAIK, you should use TTabControl.Tabs.Add()

http://docs.embarcadero.com/products/rad_studio/delphiAndcpp2009/HelpUpdate2/EN/html/delphivclwin32/ComCtrls_TTabControl_Tabs.html [^]
<<<<<<<<<<<<<<<<<<<<

Please look at the sample program in that webpage - it does exactly this: hold related components (here an dialog) in the Objects[] property of the TTabControl.Tabs. This does *not* work with the LCL TTabControl, and this was the reason for my bug report.

Delphi TPageControl *also* uses the Tabs.Objects[] to hold the visible pages, associated with the tabs.


>>>>>>>>>>>>>>>>>>>
I took a deeper look at the problem now and I am even more sure that you are starting at the wrong side of it.

TCustomNotebook cannot handle a tab control without pages at the moment, the very first thing should be implementing that in all widgetsets. I see two solutions:

1> Modify TCustomNotebook in all widgetsets so that it can handle a tab control without pages, in this case we would have:

-> TCustomNotebook <-- This class has a WS implementation
---> TPageControl
---> TTabControl
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

This essentiall is what I already did. Not in all widgetsets, but it should be easy to fix according problems everywhere. When a TCustomPage parameter is used only for passing further parameters to the widgetset, e.g. Page.Caption for the tab title, a widgetset should never try to deal with such an invisible (dummy) page - no window placement...

I used "ANotebook is TPagedNotebook" in the determination, whether the TabCtrl has associated *visible* pages. You can suggest any other notebook or page property for that purpose :-)


>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
2> Change our hierarchy to this:

TCustomTabControl <-- Without a WS implementation
--> TCustomNotebook <-- This class has a WS implementation
-----> TPageControl
--> TTabControl <-- This class will gain a WS implementation
<<<<<<<<<<<<<<<<<<<<<<<<

Since both paged and unpaged controls are based on the same widget, and have much functionality in common, I'd suggest instead:

TCustomTabControl   <-- With basic WS implementation
--> TCustomNotebook <-- With extended WS implementation
-----> TPageControl
--> TTabControl

Then the TWSNotebook class can inherit from TWSTabControl.

Or associate TWSNotebook directly with TPageControl, however you like.


>>>>>>>>>>>>>>>>>>>>>>>>>>>
The Delphi design of having a base class with tabs and a derivated one with pages is stupid and very windows-centric ... we won't be able to fully replicate that.
<<<<<<<<<<<<<<<<<<<<<<<<<<<

Sorry, that' nonsense :-(

*Every* tabbed widget can live without associated pages, at least it can be shrunk to only show the tabs and nothing else. This is what the current TTabControl does: show only the tabs of the embedded TCustomNotebook. But why use an embedded control for that purpose, when the widget already can do all that itself?


>>>>>>>>>>>>>>>>>>>>
The closest solution is option 2, with the difference that TCustomTabControl will not be usable alone, because it won't have a WS implementation.
<<<<<<<<<<<<<<<<<<<<

That's the crappy workaround, currently used in TTabControl :-(


>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
Option 1 would require making public a lot of tab stuff into TPageControl and a lot of page stuff into TTabControl
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

Please give at least one concrete example.

Didn't I prove that a separation of paged from unpaged tabbed controls/widgets is feasable with little efforts?

I have already moved the affected stuff from TCustomNotebook into TPagedNotebook, and you can move that stuff from TPagedNotebook into TPageControl, and remove TPagedNotebook entirely, if you like.

DoDi


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

Reply via email to