Sign in Join

Live chat for Free Pascal, Lazarus, Delphi and every Pascal programmer.

Mailing lists / lazarus / 2018-04

Component editors and related

7 messages · 4 people · –

Reply by email Subscribe to this list Your subscription

Read-only archive. Use j and k to move between messages.

Werner Pamler

Hi all,

currently I am porting those JVCL components which look interesting to me
(https://sourceforge.net/p/lazarus-ccr/svn/HEAD/tree/components/jvcllaz/), but at the moment I am stuck with the component editor of the TJvOutlookBar. This is some kind of two-level vertical menu. The top level is a list of TJvOutlookBarPage items, and each page has a list of TJvOutlookbarButton items as second level. Both lists inherit from TCollection. My problem is that in the component tree of the object inspector I see only the page items, but not the button "sub-items". See attached screen shot of Lazarus and the Delphi version for comparison. How can I make the button subnodes appear in the component tree?

Another problem: The component comes with a ComponentEditor for the entire class, which looks similar to that of a TCollection, but contains a treeview to display the page-button relationships. After some twiddling around I was able to make this work in Lazarus, i.e. when I add nodes to the tree in the component editor the corresponding buttons or pages are added to the control on the form designer; and when I navigate in the component editor's tree the selected object follows in the component tree and in the object inspector. But the opposite direction does not work:  When I add a page or button in the object inspector (by using the Pages and Buttons collection property editors) the tree in the component editor is not updated. How can I do this?

Any hints greatly appreciated.
Werner

-------------- next part --------------
A non-text attachment was scrubbed...
Name: JvOutlookBar_Delphi.png
Type: image/png
Size: 12397 bytes
Desc: not available
URL: <http://lists.lazarus-ide.org/pipermail/lazarus/attachments/20180425/06f79359/attachment-0002.png> -------------- next part --------------
A non-text attachment was scrubbed...
Name: JvOutlookBar_Laz.png
Type: image/png
Size: 15851 bytes
Desc: not available
URL: <http://lists.lazarus-ide.org/pipermail/lazarus/attachments/20180425/06f79359/attachment-0003.png>

Reply by email

Vojtěch Čihák

Hi,
 
ad 1: I never tried two level collection. Are they all published (both collections and their items)?  
ad 2: You can do (in your component editor) something like:  
var aHook: TPropertyEditorHook;
begin
  ...
  aHook:=nil;
      if not GetHook(aHook) then exit;
  ...
  //add or insert:
    AddedItem:=aComponent.Columns.Add;
    aHook.PersistentAdded(AddedItem, True);  //this notifies component tree     aHook.SelectOnlyThis(AddedItem);   //this selects added object   //deleting
   DeletedItem:=aComponent.Columns[aIndex];
   aHook.DeletePersistent(TPersistent(DeletedItem));   //this notifies component tree  
V.   
 

Reply by email

Werner Pamler
to Vojtěch Čihák
Vojtěch Čihák wrote
ad 1: I never tried two level collection. Are they all published (both collections and their items)?

Yes. And both collections are accessible in the object inspector: The JvOutlookBar has a property "Pages", the ellipsis button next to it opens the usual collection property editor which can be used to add, delete or rearrange pages. And when one of the pages is selected the object inspector displays the property "Buttons", again with an ellipsis button to open another collection property editor, now for the buttons. This part is working out of the box. The problem is the component tree which only shows the page nodes but no button nodes.

Show quoted text 29 lines
ad 2: You can do (in your component editor) something like: var aHook: TPropertyEditorHook; begin   ...   aHook:=nil;       if not GetHook(aHook) then exit;   ...   //add or insert: AddedItem:=aComponent.Columns.Add; aHook.PersistentAdded(AddedItem, True);  //this notifies component tree aHook.SelectOnlyThis(AddedItem);   //this selects added object   //deleting    DeletedItem:=aComponent.Columns[aIndex];  aHook.DeletePersistent(TPersistent(DeletedItem)); //this notifies component tree

This is for notification of the component tree by the component editor and this code is already there and working. What I want is notification of the component editor by the designer if pages or buttons are added while the component editor is open (the component editor is not modal).

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.lazarus-ide.org/pipermail/lazarus/attachments/20180425/8e8330f6/attachment.html>

Reply by email

Werner Pamler
to Werner Pamler
Werner Pamler wrote 14 lines
Am 25.04.2018 um 20:40 schrieb Vojtěch Čihák via Lazarus: > > ad 1: I never tried two level collection. Are they all published > (both collections and their items)? > Yes. And both collections are accessible in the object inspector: The JvOutlookBar has a property "Pages", the ellipsis button next to it opens the usual collection property editor which can be used to add, delete or rearrange pages. And when one of the pages is selected the object inspector displays the property "Buttons", again with an ellipsis button to open another collection property editor, now for the buttons. This part is working out of the box. The problem is the component tree which only shows the page nodes but no button nodes.

I am getting the impression that this is a bug of the component tree. The listed page items inherit from TCollectionItem, not from TComponent. The component tree somehow must be instructed to look for another collection within each page colletionItem.

Show quoted text 35 lines
> ad 2: You can do (in your component editor) something like: > > var aHook: TPropertyEditorHook; > > begin > >   ... > >   aHook:=nil; > >       if not GetHook(aHook) then exit; > >   ... > >   //add or insert: > > AddedItem:=aComponent.Columns.Add; > > aHook.PersistentAdded(AddedItem, True);  //this notifies component tree > > aHook.SelectOnlyThis(AddedItem);   //this selects added object > >   //deleting > >    DeletedItem:=aComponent.Columns[aIndex]; > >  aHook.DeletePersistent(TPersistent(DeletedItem)); //this notifies > component tree > This is for notification of the component tree by the component editor and this code is already there and working. What I want is notification of the component editor by the designer if pages or buttons are added while the component editor is open (the component editor is not modal).

I was able to solve this based on code I found in unit components/ideintf/fieldseditor. The key point is that handlers for GlobalDesignHook events/notifications must be added. BTW, there is a "GlobalDesignHook" and a "FDesigner.PropertyEditorHook" - are they the same, or: what is the difference?
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.lazarus-ide.org/pipermail/lazarus/attachments/20180426/edd1ae76/attachment-0001.html>

Reply by email