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