Dear Rooters I would like to use a TGCheckButton to add/delete a Tab (see the enclosed macro guiAddTab.C). Sorrowly, this is not possible since activating the CheckBox results in signal "down" followed immediately by signal "up", finally giving the following error: root [9] .x guiAddTab.C root [10] down up Error in <RootX11ErrorHandler>: BadWindow (invalid Window parameter) (XID: 79692109) When I test the function in the following way: void MyClass::FClickCheck1(Bool_t vIsOn) { if (vIsOn) { cout << "down" << endl; } else { cout << "up" << endl; }//if fTab->MapSubwindows(); fTab->Layout(); }//FClickCheck1 then everything is ok, but in the final function the signal Toggled(Bool_t) or Clicked() is always emitted twice. When I use "Pressed()", then I can add the Tab, but I can no longer uncheck the CheckBox and delete the Tab! Thus, is not clear to me when I have to use Pressed(), Clicked(), Released() or Toggled(). Can you tell me what is wrong in my code, and why the signal is emitted twice? Thank you very much in advance. Best regards Christian ---------------------------------- C.h.r.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 //--------------------------------------// // macro guiAddTab.C // //--------------------------------------// class MyClass { RQ_OBJECT() private: TGMainFrame *fMain; TGCompositeFrame *fFrameLB; TGButton *fOkBtn; TGButton *fCancelBtn; TGGroupFrame *fF1V1; TGTab *fTab; TGCompositeFrame *fT0; TGTextEntry *fTxt0; TGTextBuffer *fBuf0; TGCompositeFrame *fT1; TGTextEntry *fTxt1; TGTextBuffer *fBuf1; TGCheckButton *fCheck1; TGCompositeFrame *fT2; TGTextEntry *fTxt2; TGTextBuffer *fBuf2; TGCompositeFrame *fT3; TGTextEntry *fTxt3; TGTextBuffer *fBuf3; TGLayoutHints *fLH1, *fLH2; TList *fTrash; Bool_t fHasTab2; public: MyClass(const TGWindow *vWindow, UInt_t vWidth, UInt_t vHeight, UInt_t vOptions = kVerticalFrame); virtual ~MyClass(); // slots void FCloseWindow(); void FClickOK(); void FClickCancel(); void FClickCheck1(Bool_t vIsOn); // void FClickCheck1(); private: void FCreateTab0(); void FDeleteTab0(); void FCreateTab1(); void FDeleteTab1(); void FCreateTab2(); void FDeleteTab2(); void FCreateTab3(); void FDeleteTab3(); // ClassDef(MyClass,0) //MyClass }; //ClassImp(MyClass) //----------------------------------------------------------------------// MyClass::MyClass(const TGWindow *vWindow, UInt_t vWidth, UInt_t vHeight, UInt_t vOptions) { fTrash = new TList; TGLayoutHints *vLH; fMain = new TGMainFrame(vWindow, vWidth, vHeight, vOptions); fMain->Connect("CloseWindow()", "MyClass", this, "FCloseWindow()"); // FrameLB for OK, Cancel fFrameLB = new TGHorizontalFrame(fMain, 120, 20, kFixedWidth); fLH1 = new TGLayoutHints(kLHintsBottom | kLHintsCenterX, 2, 2, 5, 1); fMain->AddFrame(fFrameLB, fLH1); fTrash->Add(fLH1); fOkBtn = new TGTextButton(fFrameLB, "&OK", 1); fOkBtn->Connect("Clicked()", "MyClass", this, "FClickOK()"); vLH = new TGLayoutHints(kLHintsTop | kLHintsLeft | kLHintsExpandX, 2, 15, 2, 2); fFrameLB->AddFrame(fOkBtn, vLH); fTrash->Add(vLH); fCancelBtn = new TGTextButton(fFrameLB, "&Cancel", 2); fCancelBtn->Connect("Clicked()", "MyClass", this, "FClickCancel()"); vLH = new TGLayoutHints(kLHintsTop | kLHintsRight, 5, 2, 2, 2); fFrameLB->AddFrame(fCancelBtn, vLH); fTrash->Add(vLH); fF1V1 = new TGGroupFrame(fMain, "Text Info", kHorizontalFrame); vLH = new TGLayoutHints(kLHintsTop | kLHintsLeft | kLHintsExpandX, 5, 5, 5, 5); fMain->AddFrame(fF1V1, vLH); fTrash->Add(vLH); // Frame for Tab widgets fTab = new TGTab(fF1V1, 150, 150); this->FCreateTab0(); this->FCreateTab1(); this->FCreateTab3(); fHasTab2 = kFALSE; vLH = new TGLayoutHints(kLHintsTop | kLHintsLeft); fF1V1->AddFrame(fTab, vLH); fTrash->Add(vLH); // Main frame settings fMain->MapSubwindows(); fMain->Resize(fMain->GetDefaultSize()); fMain->SetWMSizeHints(300,200,300,200,0,0); //no grow fMain->SetWindowName("Test"); fMain->MapWindow(); }//Constructor MyClass::~MyClass() { this->FDeleteTab3(); // this->FDeleteTab2(); this->FDeleteTab1(); this->FDeleteTab0(); delete fTab; delete fF1V1; delete fOkBtn; delete fCancelBtn; delete fFrameLB; delete fMain; if (fTrash) fTrash->Delete(); delete fTrash; }//Destructor void MyClass::FCloseWindow() { delete this; }//FCloseWindow void MyClass::FClickCancel() { fMain->SendCloseMessage(); }//FClickCancel void MyClass::FClickOK() { if (fOkBtn->GetState() != kButtonDisabled) { fMain->SendCloseMessage(); }//if }//FClickOK /* void MyClass::FClickCheck1(Bool_t vIsOn) { // if (fCheck1->GetState() == kButtonDown) { if (vIsOn) { cout << "down" << endl; } else { cout << "up" << endl; }//if fTab->MapSubwindows(); fTab->Layout(); }//FClickCheck1 */ void MyClass::FClickCheck1(Bool_t vIsOn) { this->FDeleteTab3(); if (fHasTab2) { fTab->RemoveTab(3); } else { fTab->RemoveTab(2); }//if fTab->Layout(); if (fCheck1->GetState() == kButtonDown) { cout << "down" << endl; this->FCreateTab2(); this->FCreateTab3(); } else { cout << "up" << endl; if (fHasTab2) { this->FDeleteTab2(); fTab->RemoveTab(2); }//if this->FCreateTab3(); }//if fTab->MapSubwindows(); fTab->Layout(); }//FClickCheck1 void MyClass::FCreateTab0() { TGLayoutHints *vLH; TGCompositeFrame *vTabFrame; vTabFrame = fTab->AddTab("Tab 0"); fT0 = new TGCompositeFrame(vTabFrame, 60, 20, kVerticalFrame); vLH = new TGLayoutHints(kLHintsTop | kLHintsLeft, 2, 2, 5, 2); vTabFrame->AddFrame(fT0, vLH); fTrash->Add(vLH); fTxt0 = new TGTextEntry(fT0, fBuf0 = new TGTextBuffer(255), -1); fTxt0->Resize(200, fTxt0->GetDefaultHeight()); vLH = new TGLayoutHints(kLHintsLeft | kLHintsTop | kLHintsExpandX, 2, 2, 5, 5); fT0->AddFrame(fTxt0, vLH); fTrash->Add(vLH); }//FCreateTab0 void MyClass::FDeleteTab0() { delete fTxt0; delete fT0; }//FDeleteTab0 void MyClass::FCreateTab1() { TGLayoutHints *vLH; TGCompositeFrame *vTabFrame; vTabFrame = fTab->AddTab("Tab 1"); fT1 = new TGCompositeFrame(vTabFrame, 60, 20, kVerticalFrame); vLH = new TGLayoutHints(kLHintsTop | kLHintsLeft, 2, 2, 5, 2); vTabFrame->AddFrame(fT1, vLH); fTrash->Add(vLH); fTxt1 = new TGTextEntry(fT1, fBuf1 = new TGTextBuffer(255), -1); fTxt1->Resize(200, fTxt1->GetDefaultHeight()); vLH = new TGLayoutHints(kLHintsLeft | kLHintsTop | kLHintsExpandX, 2, 2, 5, 5); fT1->AddFrame(fTxt1, vLH); fTrash->Add(vLH); fCheck1 = new TGCheckButton(fT1, "Add Tab 2", 10); fCheck1->Connect("Toggled(Bool_t)", "MyClass", this, "FClickCheck1(Bool_t)"); // fCheck1->Connect("Pressed()", "MyClass", this, "FClickCheck1()"); // fCheck1->Connect("Clicked()", "MyClass", this, "FClickCheck1()"); fT1->AddFrame(fCheck1, vLH); }//FCreateTab1 void MyClass::FDeleteTab1() { delete fTxt1; delete fT1; }//FDeleteTab1 void MyClass::FCreateTab2() { TGLayoutHints *vLH; TGCompositeFrame *vTabFrame; vTabFrame = fTab->AddTab("Tab 2"); fT2 = new TGCompositeFrame(vTabFrame, 60, 20, kVerticalFrame); vLH = new TGLayoutHints(kLHintsTop | kLHintsLeft, 2, 2, 5, 2); vTabFrame->AddFrame(fT2, vLH); fTrash->Add(vLH); fTxt2 = new TGTextEntry(fT2, fBuf2 = new TGTextBuffer(255), -1); fTxt2->Resize(200, fTxt2->GetDefaultHeight()); vLH = new TGLayoutHints(kLHintsLeft | kLHintsTop | kLHintsExpandX, 2, 2, 5, 5); fT2->AddFrame(fTxt2, vLH); fTrash->Add(vLH); fHasTab2 = kTRUE; }//FCreateTab2 void MyClass::FDeleteTab2() { delete fTxt2; delete fT2; fHasTab2 = kFALSE; }//FDeleteTab2 void MyClass::FCreateTab3() { TGLayoutHints *vLH; TGCompositeFrame *vTabFrame; vTabFrame = fTab->AddTab("Tab 3"); fT3 = new TGCompositeFrame(vTabFrame, 60, 20, kVerticalFrame); vLH = new TGLayoutHints(kLHintsTop | kLHintsLeft, 2, 2, 5, 2); vTabFrame->AddFrame(fT3, vLH); fTrash->Add(vLH); fTxt3 = new TGTextEntry(fT3, fBuf3 = new TGTextBuffer(255), -1); fTxt3->Resize(200, fTxt3->GetDefaultHeight()); vLH = new TGLayoutHints(kLHintsLeft | kLHintsTop | kLHintsExpandX, 2, 2, 5, 5); fT3->AddFrame(fTxt3, vLH); fTrash->Add(vLH); }//FCreateTab3 void MyClass::FDeleteTab3() { delete fTxt3; delete fT3; }//FDeleteTab3 //----------------------------------------------------------------------// void guiAddTab() { new MyClass(gClient->GetRoot(), 300, 120); }
This archive was generated by hypermail 2b29 : Tue Jan 01 2002 - 17:51:12 MET