<div dir="ltr">Kostas,<div><br></div><div>We already have an object oriented layer to interact with controls. That layer is the LCL. What you are saying is it makes sense for each widgetset to create their own separate and independent class hierarchy, or to use TWidgetInfo, or have something akin to:</div><div><br></div><div>  LCL-> WSClasses -> TSomePlatformWidgets (ie TGtk3Widget class and derivitatives) -> Flat C API</div><div><br></div><div>What would make more sense to me would be:</div><div><br></div><div>  LCL Object -> IWidget -> Flat C API</div><div><br></div><div>Where any control would need to fill implement the requirements of IWidget to be complete. In this way we could have a contract between the LCL and what is expected of a control (IWidget), a button (IButton), a listbox (IListBox), a page control (IPageControl), and so on.</div><div><br></div><div>You might ask how does this fix anything? Well first it nails down three layers instead of four of five. Second, it creates a contact between the LCL and someone writing the part to go between the LCL and flat C APIs. Third, it provides a consistent model for  ANYONE wanting to implement a widgetset, thus making it MUCH easier for people to understand what is going on. Forth, implementors can look at other widgetsets to understand how to create a new or fix a malfunctioning part of the widgetset they are working on.</div><div><br></div><div>Again, I would support the idea of using Handles on platform specific objects, like a Canvas (DC on Windows, CairoRed of gtk3), a WinControl (HWND on Windows, PGtkObject on gtk2/Gtk3)</div><div><br></div><div>IN ADDITION TO</div><div><br></div><div>A well described non reference counted interface model for platform specific objects (IWidget, ICanvas, IButton, IListBox) which the LCL would depend on to automatically take care of the platform and widget specific glue.</div><div><br></div><div>uses</div><div>  { This unit would defines the contract between the LCL and all Widgetset be defining all relevant</div><div>  interfaces  that must be implemented to make a LCL widgetset }</div><div>  Widgets,</div><div>    ...</div><div>  ; </div><div><br></div><div>type</div><div><div>  TWinControl = class(TControl, IWidget)</div><div>  private</div><div>    FWidget: IWidget;</div><div>  protected</div><div>    property Widget: IWidget read FWidget  implements IWidget;<br></div><div>    ....<br></div><div>  end;</div></div><div><br></div><div>...</div><div><br></div><div>  TCustomListBox = class(TWinControl, IListBox)</div><div>  private</div><div>    function GetListBox: IListBox;</div><div>  protected</div><div>    property ListBox: IListBox read GetListBox implements IListBox;</div><div>    ....</div><div>  end;</div><div><br></div><div>...</div><div><br></div><div>function TCustomListBox.GetListBox: IListBox;</div><div>begin</div><div>  Result := Widget as IListBox;</div><div>end;</div></div>