[ROOT] Severe problem with TQObject in root 3.02/06 (Re:Bug in TGNumberEntry?)

From: cstrato@EUnet.at
Date: Sun Dec 16 2001 - 12:41:07 MET


Dear Rooters, dear Fons

Enclosed I add the original macro displaying a frame containing
a TGTextEntry field (see macro guiTxt.C below).

In contrast to macro "guiNum.C" I can restart the macro from
root without getting a segmentation violation.

This macro uses the signal/slot mechanism of root, which worked
without any problem in root 3.02/05.

Sorrowly, the new version 3.02/06 can no longer emit the signal.
Running the macro, I get now the following message:
   Error in <TQObject::CheckConnectArgs>:
   signal TQObjSender::FReturnPressed() does not exist

This time, even compilation does not work (.x guiTxt.C++).
This means that my whole gui code breaks!!

Can you tell me what has changed between 3.02/05 and 3.02/06,
so that I can no longer use the signal/slot mechanism?

I realize that the static function "CheckConnectArgs" has been
completely re-written in 3.02/06. Could this be the problem?

Regarding the problem with TGNumberEntry, would it help to
add the following destructor?
TGNumberEntryLayout::~TGNumberEntryLayout()
{
   fBox = 0;
}

Thank you in advance for your help

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

//--------------guiTxt.C-----------------------
class XEntryGroup {

   RQ_OBJECT()

   private:
      TGCompositeFrame *fCF;
      TGLabel           *fLab;
      TGTextEntry       *fText;
      TGTextBuffer      *fBuf;

      TList  *fTrash;

   public:
      XEntryGroup(TGCompositeFrame *vFrame, UInt_t vWidth, UInt_t vHeight,
         const char *vLabel, const char *vText = "", Bool_t vIsEnabled = kTRUE,
         UInt_t vHDist = 5, UInt_t vVDist = 5);
      virtual ~XEntryGroup();

      void FSetEnabled(Bool_t vIsEnabled) {fText->SetEnabled(vIsEnabled);}
      void FSetFocus()                    {fText->SetFocus();}
      void FSetText(TString vText)        {fText->SetText(vText);}
      const char *FGetText()              {return fText->GetText();}

      void FReturnPressed();                        //*SIGNAL*
      void FTabPressed();                           //*SIGNAL*
      void FTextChanged(const char *vText = 0);     //*SIGNAL*

//      ClassDef(XEntryGroup,0) //EntryGroup
};

class MyClass {

   RQ_OBJECT()

   private:
      TGMainFrame  *fMain;
      TGCompositeFrame   *fFrameLB;
      TGButton            *fOkBtn;
      TGButton            *fCancelBtn;
      TGGroupFrame       *fF1V1;
      XEntryGroup         *fEGText;

      TGLayoutHints *fLH1, *fLH2;
      TList         *fTrash;

   public:
      MyClass(const TGWindow *vWindow,
         UInt_t vWidth, UInt_t vHeight, UInt_t vOptions = kVerticalFrame);
      virtual ~MyClass();

   // slots
      void FCloseWindow();
      void FClickOK();
      void FClickCancel();

//      ClassDef(MyClass,0) //NewProjectDlog
};

//ClassImp(XEntryGroup)
//ClassImp(MyClass)

//----------------------------------------------------------------------//
XEntryGroup::XEntryGroup(TGCompositeFrame *vFrame, UInt_t vWidth, UInt_t
vHeight,
             const char *vLabel, const char *vText, Bool_t vIsEnabled,
             UInt_t vHDist, UInt_t vVDist)
{
   fTrash = new TList;
   TGLayoutHints *vLH;

   fCF = new TGCompositeFrame(vFrame, vWidth, vHeight, kHorizontalFrame);
   vLH = new TGLayoutHints(kLHintsTop | kLHintsLeft | kLHintsExpandX);
   vFrame->AddFrame(fCF, vLH);
   fTrash->Add(vLH);

   fLab = new TGLabel(fCF, new TGString(vLabel));
   vLH = new TGLayoutHints(kLHintsTop | kLHintsLeft, vHDist, 2, vVDist, vVDist);

   fCF->AddFrame(fLab, vLH);
   fTrash->Add(vLH);

   fText = new TGTextEntry(fCF, fBuf = new TGTextBuffer(255), -1);
   fText->SetText(vText);  //needs to be before Connect()!!
   fText->SetEnabled(vIsEnabled);
   fText->Connect("TextChanged(char *)", "XEntryGroup", this, "FTextChanged(char
*)");
   fText->Connect("TabPressed()", "XEntryGroup", this, "FTabPressed()");
   fText->Connect("ReturnPressed()", "XEntryGroup", this, "FReturnPressed()");
   vLH = new TGLayoutHints(kLHintsTop | kLHintsRight, 2, vHDist, vVDist,
vVDist);
   fCF->AddFrame(fText, vLH);
   fText->Resize(vWidth, fText->GetDefaultHeight());
   fTrash->Add(vLH);
}//Constructor

XEntryGroup::~XEntryGroup()
{
   delete fText; delete fLab; delete fCF;

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

void XEntryGroup::FReturnPressed()
{
   Emit("FReturnPressed()");
}//FReturnPressed

void XEntryGroup::FTabPressed()
{
   Emit("FTabPressed()");
}//FTabPressed

void XEntryGroup::FTextChanged(const char *vText)
{
   Emit("FTextChanged(char*)", this->FGetText());
}//FTextChanged


//----------------------------------------------------------------------//
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", kVerticalFrame);
   vLH = new TGLayoutHints(kLHintsTop | kLHintsLeft | kLHintsExpandX, 5, 5, 5,
5);
   fMain->AddFrame(fF1V1, vLH);
   fTrash->Add(vLH);

   // Text
   fEGText = new XEntryGroup(fF1V1, 200, 20, "Enter text:", "", kTRUE);
   fEGText->Connect("FReturnPressed()", "MyClass", this, "FClickOK()");

// Main frame settings
   fMain->MapSubwindows();
   fMain->Resize(fMain->GetDefaultSize());
   fMain->SetWMSizeHints(500,300,500,300,0,0);  //no grow

   fMain->SetWindowName("Test");
   fMain->MapWindow();
}//Constructor

MyClass::~MyClass()
{
   delete fEGText; 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 guiTxt()
{
   new MyClass(gClient->GetRoot(), 400, 220);
}



This archive was generated by hypermail 2b29 : Tue Jan 01 2002 - 17:51:12 MET