Hi Olivier, you have to do: .L mymain.C++ (while the file is called mymain.C) the ++ extension will trigger the compilation of the code in the script mymain.C. Then it will work. If you interpret the code I mailed you should only see: entering processmesg entering kcCommand switch text button id 1 pressed (unsigned char)1 If you compile it using the ++ extension then the rest will work too. The ClassDef/ClassImp etc. is if you want to access yoyr compiled code via the interpreter. Cheers, Fons. Olivier D'Arcy wrote: > > It doesn't work ! I tried exactly what you told me and there is no > reaction when I pressed abutton or select an item from the listbox. > There even is a bus error when I press on the version button and the > fButton1->SetCommand(cmd); is not commented out. > Is there something missing? Do I have to declare my ProcessMessage method > as virtual? > > My real program is a lot more complex than this simple example but I would > like to understand before continuing my real application. > > I just read about classDef and ClassImp and How to generate a dictionnary > Should I compile my code following the example on Dictionary Generation at > http://root.cern.ch/root/CintGenerator.html ? > > On Tue, 6 Jun 2000, Fons Rademakers wrote: > > > Hi Olivier, > > > > you cannot interpret a class derived from a compiled class. Here > > TGMainFrame is a compiled class. If you look in the $ROOTSYS/tutorials/dialogs.C > > example you see that the classes don't derive from any compiled class. > > The "trick" with the cmd string is only needed in the interpreter because > > ProcessMessage() is normally called via a virtual function of the base class > > which won't work if the class is interpreted (because the baseclass is > > compiled). > > > > A solution is to use the ROOT script compiler. The script compiler creates a > > dictionary, compiles the script into a shared library and links the shared lib > > into the root session. > > > > I've modified you script to work with the script compiler (you need to specify > > the right include statements) and fixed some other small typos in your code. > > > > To use it with the script compiler do: > > > > root [1] .L mymain.C++ > > root [2] mymain() > > > > > > Cheers, Fons. > > > > > > Olivier D'Arcy wrote: > > > > > > Hi, I'm trying to run the following simple GUI example in order to > > > understand how does the function ProcessMessage() work. I read that when a > > > button is pressed, the message (kC_COMMAND, kCM_BUTOON,button_id,...) is > > > sent and when an item from the listbox is selected, the message > > > (kC_COMMAND, kCM_LISTBOX, listbox_id, item_id) is sent. Still the > > > ProcessMessage() of the following code is never called even if I press > > > one of the button or click an item in the list box. Why? > > > > > > > //---------------- fixed version of macro > > #ifndef __CINT__ > > #include <TGButton.h> > > #include <TGFrame.h> > > #include <TGListBox.h> > > #include <iostream.h> > > #else > > class TGTextButton; > > class TGLayoutHints; > > class TGListBox; > > class TGWindow; > > #endif > > #include <TGFrame.h> > > > > > > class MyMainFrame : public TGMainFrame { > > > > private: > > TGTextButton *fButton1, *fButton2; > > TGLayoutHints *fLayout; > > TGListBox *fListBox; > > > > public: > > MyMainFrame(const TGWindow *p, UInt_t w, UInt_t h); > > ~MyMainFrame(); > > Bool_t ProcessMessage(Long_t msg, Long_t parm1, Long_t parm2); > > }; > > > > > > MyMainFrame::MyMainFrame(const TGWindow *p, UInt_t w, UInt_t h) > > : TGMainFrame(p, w, h) > > { > > // set the cmd string, cmd is a string that calls the processmessage > > // method when any of the button is called > > > > char cmd[128]; > > sprintf(cmd, "{long > > r__ptr=0x%lx;((MyMainFrame*)r__ptr)->ProcessMessage($MSG,$PARM1,$PARM2);}", > > (Long_t)this); > > > > fLayout = new TGLayoutHints(kLHintsCenterX | kLHintsTop); > > > > fButton1 = new TGTextButton(this, "&Version", 1); > > AddFrame(fButton1, fLayout); > > fButton1->Associate(this); > > fButton1->SetCommand(cmd); // ProcessMessage will be executed twice > > // for fButton1 (via Associate and SetCommand) > > fButton2 = new TGTextButton(this, "&Exit", 2); > > AddFrame(fButton2, fLayout); > > fButton2->Associate(this); > > > > > > fListBox = new TGListBox(this, 3); > > fListBox->Associate(this); > > AddFrame(fListBox, fLayout); > > fListBox->Resize(180,200); > > fListBox->AddEntry("entry 1", -1 ); > > fListBox->AddEntry("entry 2", -1 ); > > fListBox->AddEntry("entry 3", -1 ); > > fListBox->AddEntry("entry 4", -1 ); > > fListBox->MapSubwindows(); > > fListBox->Layout(); > > > > > > MapSubwindows(); > > > > > > SetWindowName("Listbox test"); > > Resize( GetDefaultSize()); > > > > MapWindow(); > > } > > > > MyMainFrame::~MyMainFrame() > > { > > delete fListBox; > > delete fButton2; > > delete fButton1; > > delete fLayout; > > } > > > > Bool_t MyMainFrame::ProcessMessage(Long_t msg, Long_t parm1, Long_t parm2) > > { > > // Process events generated by the buttons in the frame. > > cout<<"entering processmesg"<<endl; > > > > switch (GET_MSG(msg)) > > { > > case kC_COMMAND: > > cout<<"entering kcCommand switch"<<endl; > > switch (GET_SUBMSG(msg)) > > { > > case kCM_BUTTON: > > printf("text button id %ld pressed\n", parm1); > > break; > > case kCM_LISTBOX: > > printf("item id %ld selected from listbox id %ld \n", parm2, > > parm1); > > break; > > default: > > break; > > } > > default: > > break; > > } > > return kTRUE; > > } > > > > > > void mymain() > > { > > new MyMainFrame(gClient->GetRoot(), 600, 1000); > > } > > > > > > //--------------------------------------- > > -- > > 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 7677910 > > -- 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 7677910
This archive was generated by hypermail 2b29 : Tue Jan 02 2001 - 11:50:27 MET