Re: [ROOT] Ownership of GUI elements

From: Fons Rademakers (Fons.Rademakers@cern.ch)
Date: Sat Jun 08 2002 - 00:17:14 MEST


Hi John,

   besides the TGLayoutHints the widgets added to a composite frame must
also be deleted by the user. I've updated the comments in
TGCompositeFrame::AddFrame() accordingly. If you update your code most
of your leaks should disappear.

Cheers, Fons.


On Fri, 2002-06-07 at 23:36, J.D. Frankland wrote:
> Hello RootPeople,
> 
> First: sorry, this is a bit long...
> 
> I have succeeded in getting a GUI of the ground by learning from the 
> example guitest.cxx
> However, one of the things which remains unclear to me is to know 
> exactly which TG****
> objects I need to delete when any of my frames is closed/deleted etc....
> 
> It is explicitly written in the source code that TGLayoutHints need to 
> be deleted by the user,
> this I do as in the example by putting their pointers in a TList which I 
> delete in the dtor.
> I thought I understood that any TGCompositeFrame-derived object (which 
> includes, I think,
> MainFrames, Tabs, HorizontalFrames, VerticalFrames etc.) keeps a track 
> of all the frames/widgets which are added to it using AddFrame(...) and 
> then deletes them all at the end,
> so all of these I should not have to worry about. However, what about 
> e.g. TGNumberEntry widgets ? (I have rather a lot of them). In the 
> example it is not clear, as it seems that one or two 
> TGTextButtons/TGTextEntry widgets are added to the fCleanup TList for 
> user-deletion in the dtor, whereas most of the others are left to the 
> mother-frame.
> 
> The reason I ask is: my GUI is dynamically created to represent and 
> configure the structure of a multidetector array, with a set of tabs 
> describing different layers, each of these tabs has a set of tabs 
> describing the rings in each layer, and on each of these "ring tabs" are 
> a set of buttons and TGNumberEntry fields for setting e.g. the number 
> and angular ranges of the telescopes in the rings. Every time the 
> detector structure is altered by the user (i.e. changing the number of 
> telescopes, changing the angles covered by the rings, removing/adding a 
> ring...) the GUI must be updated in order to reflect these changes. The 
> only way I can see of doing this is to wipe (i.e. delete) everything 
> except the MainFrame and reconstruct the whole lot whenever the user 
> presses the "Update Array Structure" button. But although I carefully 
> delete all my TGLayoutHints I seem to have memory leaks, because 
> repeated pushing of the "Update" button gives increasing memory 
> occupation by my application, increasingly slow response of the GUI 
> redrawing, and eventually segmentation faults (although it doesn't 
> actually crash, the buttons just stop working, or the interface goes 
> weird...)
> 
> Can anyone help ? Is there an easier way to do this ? Can one for 
> example link the TGNumberEntry fields to the data member they are 
> representing so that they are always automatically up to date without 
> intervention from me ? (although this would not be sufficient for 
> example in the case where I need to add a new button for a new 
> telescope, or remove a ring tab etc. etc. ....)
> 
> Thankyou for reading all this
> John Frankland
-- 
Org:    CERN, European Laboratory for Particle Physics.
Mail:   1211 Geneve 23, Switzerland
E-Mail: Fons.Rademakers@cern.ch              Phone: +41 22 7679248
WWW:    http://root.cern.ch/~rdm/            Fax:   +41 22 7679480



This archive was generated by hypermail 2b29 : Sat Jan 04 2003 - 23:50:56 MET