[ROOT] Unable to call methods in GUI constructor!

From: cstrato (cstrato@aon.at)
Date: Sat Feb 15 2003 - 18:33:11 MET


Dear Rooters

The enclosed macro ".x mygui.C" contains two classes,
called MyFrame and SubFrame.

In the constructor of MyFrame I am able to call methods,
however, in the constructor of SubFrame I am unable to
call any method. Even calling the simple method "Test(1)"
(see line 321) causes ROOT to crash with:

root [7] .x mygui.C
---TEST - 1
  *** Break *** segmentation violation
Root > Function mygui() busy flag cleared
Function MyFrame() busy flag cleared
Function CreateShutterFrames() busy flag cleared
Function SubFrame() busy flag cleared
Function Test() busy flag cleared

Can anybody tell me, why I am not able to call a
method in the SubFrame constructor??

Note: Yesterday, I could run a similar macro in root
for about 50 times without problems, until root finally
crashed with the error described above. Since then, it
is no longer possible to call a method from the constructor.

I am using root 3.05/02 on MacOS X 10.1.2

Thank you in advance.

Best regards
Christian
_._._._._._._._._._._._._._._._
C.h.i.s.t.i.a.n S.t.r.a.t.o.w.a
V.i.e.n.n.a       A.u.s.t.r.i.a
_._._._._._._._._._._._._._._._


// Test for constructor

// Menu commands
enum EMenuCommands {
   M_FILE,
   M_FILE_NEW,
};

// Shutter commands
enum EShutterCommands {
   S_SHUT1 = 1001,
   S_SHUT1_A,
   S_SHUT1_B,

   S_SHUT2 = 1001,
   S_SHUT2_A,
   S_SHUT2_B,
};

const char *xpm_names[] = {
    "Folder.xpm",
    "Folder.xpm",
    0
};
const char *kShutterName[] = {
    "Shutter1",
    "Shutter2",
    0
};

struct ShutterData_t {
   const char *sPixmap_name;
   const char *sTip_text;
   Int_t       sId;
   TGButton   *sButton;
};

ShutterData_t kItems1[] = {
   { "folder_s.xpm", "xxx", S_SHUT1_A, 0 },
   { "folder_s.xpm", "xxx", S_SHUT1_B, 0 },
   { 0,               0,    0,         0 }
};

ShutterData_t kItems2[] = {
   { "folder_s.xpm", "xxx", S_SHUT2_A, 0 },
   { "folder_s.xpm", "xxx", S_SHUT2_B, 0 },
   { 0,               0,    0,         0 }
};

class MyFrame;
class SubFrame;

class MyFrame {

   RQ_OBJECT("MyFrame")

   private:
      TGMainFrame        *fMain;

   // MenuBar Frame
      TGPopupMenu        *fMenuFile;
      TGMenuBar          *fMenuBar;
      TGHorizontal3DLine *fLineH1;

   // Shutter Frame
      TGHorizontalFrame  *fHF1;
      TGShutter           *fShutter;
      const TGPicture     *fDefaultPic;
      SubFrame           *fSubFrame;

   // Layout hints
      TGLayoutHints      *fMenuBarLayout;
      TGLayoutHints      *fMenuBarItemLayout;
      TGLayoutHints      *fMenuBarHelpLayout;
      TGLayoutHints      *fLineLayout;
      TGLayoutHints      *fLayout;

      TList    *fTrash;

   public:
      MyFrame(const TGWindow *window, UInt_t w, UInt_t h);
      virtual ~MyFrame();

      void AddShutterItem(const char *name, ShutterData_t data[], Int_t id);

   // Slots
      void DoCloseWindow();
      void DoShutter(Int_t id = -1);

   private:
      void CreateMenuBar();
      void DeleteMenuBar();
      void CreateShutter();
      void DeleteShutter();
      void CreateShutterFrames();
      void DeleteShutterFrames();

//      ClassDef(MyFrame,0) //MainFrame
};

class SubFrame {

   RQ_OBJECT("SubFrame")

   private:
      MyFrame            *fMyFrame;
      TGCompositeFrame   *fShutterFrame;
      TGCompositeFrame    *fFrameA;
      TGGroupFrame         *fFG1;

      TList    *fTrash;

   public:
      SubFrame() {}
      SubFrame(TGCompositeFrame *parent, MyFrame *main, UInt_t w, UInt_t h);
      virtual ~SubFrame();

      void HandleShutter(Int_t id = -1);

   private:
      void Test(Int_t k) {cout << "---TEST - " << k << endl;}
      void CreateFrameA();
      void DeleteFrameA();

//      ClassDef(SubFrame,0) //SubFrame
};


//______________________________________________________________________________
//______________________________________________________________________________


//ClassImp(MyFrame);
//ClassImp(SubFrame);

//______________________________________________________________________________
MyFrame::MyFrame(const TGWindow *window, UInt_t w, UInt_t h)
{
   fTrash = new TList();

   fMain = new TGMainFrame(window, w, h);
   fMain->Connect("CloseWindow()", "MyFrame", this, "DoCloseWindow()");

// Create menus
   this->CreateMenuBar();

// Basic frame layout
   fLayout = new TGLayoutHints(kLHintsTop | kLHintsExpandX | kLHintsExpandY);
   fHF1 = new TGHorizontalFrame(fMain, 20, 20);
   fMain->AddFrame(fHF1, fLayout);

// Create shutter
   this->CreateShutter();
   this->CreateShutterFrames();

// Main settings
   fMain->SetWindowName("MyGui");
   fMain->MapSubwindows();
   fMain->Resize(fMain->GetDefaultSize());
   fMain->MapWindow();
   fMain->Move(20, 20);
}//Constructor

//______________________________________________________________________________
MyFrame::~MyFrame()
{
   this->DeleteMenuBar();
   this->DeleteShutterFrames();
   this->DeleteShutter();

   delete fHF1; 
   delete fMain;

   delete fLayout;

   fTrash->Delete();
   delete fTrash;
}//Destructor

//______________________________________________________________________________
void MyFrame::CreateMenuBar()
{
// File menu
   fMenuFile = new TGPopupMenu(gClient->GetRoot());
   fMenuFile->AddEntry("&New...",  M_FILE_NEW);

// Create menubar layout hints
   fMenuBarLayout = new TGLayoutHints(kLHintsTop | kLHintsLeft | kLHintsExpandX, 0, 0, 1, 1);
   fMenuBarItemLayout = new TGLayoutHints(kLHintsTop | kLHintsLeft, 0, 4, 0, 0);
   fMenuBarHelpLayout = new TGLayoutHints(kLHintsTop | kLHintsRight);

// Add menus to MenuBar
   fMenuBar = new TGMenuBar(fMain, 1, 1, kHorizontalFrame);
   fMenuBar->AddPopup("&File",        fMenuFile, fMenuBarItemLayout);

   fMain->AddFrame(fMenuBar, fMenuBarLayout);

// Line to separate menubar
   fLineH1 = new TGHorizontal3DLine(fMain);
   fLineLayout = new TGLayoutHints(kLHintsTop | kLHintsExpandX);
   fMain->AddFrame(fLineH1, fLineLayout);
   fLineH1->DrawBorder();
}//CreateMenuBar

//______________________________________________________________________________
void MyFrame::DeleteMenuBar()
{
   delete fLineH1; 
   delete fMenuBar;
   delete fMenuFile; 

   delete fMenuBarLayout;
   delete fMenuBarItemLayout;
   delete fMenuBarHelpLayout;
   delete fLineLayout;
}//DeleteMenuBar

//______________________________________________________________________________
void MyFrame::CreateShutter()
{
   fDefaultPic = gClient->GetPicture("folder_s.xpm");
   fShutter = new TGShutter(fHF1, kSunkenFrame | kFixedWidth | kDoubleBorder);

   this->AddShutterItem(kShutterName[0], kItems1, S_SHUT1);
   this->AddShutterItem(kShutterName[1], kItems2, S_SHUT2);

   TGLayoutHints *hint = 0;
   hint = new TGLayoutHints(kLHintsTop | kLHintsLeft | kLHintsExpandY);
   fTrash->Add(hint);
   fHF1->AddFrame(fShutter, hint);
   fShutter->Resize(100, 400);
}//CreateShutter

//______________________________________________________________________________
void MyFrame::DeleteShutter()
{
   delete fShutter;
}//DeleteShutter

//______________________________________________________________________________
void MyFrame::CreateShutterFrames()
{
   fSubFrame = new SubFrame(fHF1, this, 0, 0);
}//CreateShutterFrames

//______________________________________________________________________________
void MyFrame::DeleteShutterFrames()
{
   delete fSubFrame;
}//DeleteShutterFrames

//______________________________________________________________________________
void MyFrame::AddShutterItem(const char *name, ShutterData_t data[], Int_t id)
{
   TGShutterItem    *item;
   TGCompositeFrame *container;
   TGButton         *button;
   const TGPicture  *buttonpic;
   TGLayoutHints    *hint;

   hint = new TGLayoutHints(kLHintsTop | kLHintsCenterX, 5, 5, 5, 0);
   fTrash->Add(hint);

   item = new TGShutterItem(fShutter, new TGHotString(name), id);
   fTrash->Add(item);
   container = (TGCompositeFrame*)item->GetContainer();

   for (Int_t i=0; data[i].sPixmap_name != 0; i++) {
      buttonpic = gClient->GetPicture(data[i].sPixmap_name);
      if (!buttonpic) {
         printf("Shutter: missing pixmap \"%s\", using default",
                data[i].sPixmap_name);
         buttonpic = fDefaultPic;
      }//if

      button = new TGPictureButton(container, buttonpic, data[i].sId);
      fTrash->Add(button);
      button->Connect("Clicked()", "MyFrame", this, "DoShutter()");
      button->SetToolTipText(data[i].sTip_text);
      data[i].sButton = button;
      container->AddFrame(button, hint);
   }//for_i

   fShutter->AddItem(item);
}//AddShutterItem

//______________________________________________________________________________
void MyFrame::DoCloseWindow()
{
   delete this;  //does not exit root
//   gApplication->Terminate(0);  //exit root, needed for standalone App
}//DoCloseWindow

//______________________________________________________________________________
void MyFrame::DoShutter(Int_t id)
{
}//DoShutter


//______________________________________________________________________________
//______________________________________________________________________________
SubFrame::SubFrame(TGCompositeFrame *parent, MyFrame *main, UInt_t w, UInt_t h)
{
   fMyFrame = main;
   fTrash = new TList();

// Subframe for frame containing different shutter frames
   TGLayoutHints *hint = 0;
   hint = new TGLayoutHints(kLHintsTop | kLHintsExpandX | kLHintsExpandY);
   fTrash->Add(hint);
   fShutterFrame = new TGCompositeFrame(parent, w, h);
   parent->AddFrame(fShutterFrame, hint);

//THIS DOES WORK!!
   fFrameA = new TGCompositeFrame(fShutterFrame,0,0, kHorizontalFrame);
   fShutterFrame->AddFrame(fFrameA, hint);
   fFG1 = new TGGroupFrame(fFrameA, "Group frame for A", kVerticalFrame);
   fFrameA->AddFrame(fFG1, hint);

// Create shutter subframes
   this->Test(1);
//THIS DOES NOT WORK!!
//   this->CreateFrameA();
//   this->Test(2);

// Show first frame
   fShutterFrame->ShowFrame(fFrameA);
}//Constructor

//______________________________________________________________________________
SubFrame::~SubFrame()
{
   this->DeleteFrameA();

   fTrash->Delete();
   delete fTrash;

   fMyFrame = 0;
}//Destructor

//______________________________________________________________________________
void SubFrame::HandleShutter(Int_t id)
{
}//HandleShutter

//______________________________________________________________________________
void SubFrame::CreateFrameA()
{
   TGLayoutHints *hint1 = 0;
   hint1 = new TGLayoutHints(kLHintsTop | kLHintsExpandX | kLHintsExpandY);
   fTrash->Add(hint1);

   fFrameA = new TGCompositeFrame(fShutterFrame,0,0, kHorizontalFrame);
   fShutterFrame->AddFrame(fFrameA, hint1);
   fFG1 = new TGGroupFrame(fFrameA, "Group frame for A", kVerticalFrame);
   fFrameA->AddFrame(fFG1, hint1);

   fShutterFrame->HideFrame(fFrameA);
}//CreateFrameA

//______________________________________________________________________________
void SubFrame::DeleteFrameA()
{
   delete fFG1; delete fFrameA;
}//DeleteFrameA


//______________________________________________________________________________
void mygui()
{
   new MyFrame(gClient->GetRoot(), 400, 220);
}



This archive was generated by hypermail 2b29 : Thu Jan 01 2004 - 17:50:09 MET