[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: Objects and Widgets

Mark Guagenti (mgenti@evansville.net) writes:

> I am trying to learn how to use objects and widgets together and I have
> ran across a question for all of you.  When I am creating a widget button
> such as:
> openID = Widget_Button(fileID, Value='Open...', Event_Pro='XPU_RI_Open')
> Do I have to make a procedure XPU_RI_Open such as:
> PRO XPU_RI_Open, event
> 	Widget_Control, event.top, Get_UValue=info, /No_Copy
> 	info.obj->open
> 	Widget_Control, event.top, Set_UValue=info, /No_Copy
> How come you can't call the object method directly from Event_Pro?  

How come pigs is purple and my girlfriends don't love me no more?
It just is, is why.

> I will be using a lot of methods. Will I always have to make a procedures 
> to call them? 

You will unless you can figure out a way to be clever. :-)

I like to write my event handler "methods" to accept a single
positional parameter--the event structure--just like I write
my event handlers. Then, for every widget that is going to
generate an event in my object widget program, I fill the
user value of the widget with a simple structure containing
the object reference and the event handler method to call.
It looks like this:

   openID = Widget_Button(menuID, Value='Open File...', $
      UValue={object:self, method:'Open'})
   quitID = Widget_Button(menuID, Value='Quit', $
      UValue={object:self, method:'Quit'})

All my events go to one giant event handler. (I learned this
from Stein Vidar. :-) And I write the event handler like this:

   PRO Handle_All_Events, event
   Widget_Control, event.id, Get_UValue=info
   Call_Method, info.method, info.object, event

Pretty clever, huh? I always use the same event handler, so I never
have to write it over. And my object methods are written essentially
like my event handler procedures. :-)


David Fanning, Ph.D.
Fanning Software Consulting
Phone: 970-221-0438 E-Mail: davidf@dfanning.com
Coyote's Guide to IDL Programming: http://www.dfanning.com/
Toll-Free IDL Book Orders: 1-888-461-0155