[comp.sys.mac.programmer] Control Bars

peterbak@microsoft.UUCP (Peter Bako) (05/12/89)

I have recently started to program the macs, and am experimenting
with control bars.  I have written a simple application, which opens
a window up, puts a horizontal control bar in the middle, and will
eventually display its current value above it.  At the moment I
am having problems with incrementing the value by one, if the user
clicks on the down arrow.  (problems means Bus Error!)

Here is a scaled version of the code:

     case inContent:
       MousePoint = AnEvent.where;
       GlobalToLocal(&MousePoint);
       tempInt = FindControl(&MousePoint, myWindow, &whichControl);
       switch (tempInt)
       {
           case inThumb:
		TrackControl(whichControl, &MousePoint, nil);
            break;

	   case inUpButton:
	   case inDownButton:
	   case inPageUp:
	   case inPageDown:
		TrackControl(whichControl, &MousePoint, MoveScrollbar);
	   break;
	}

ok thats part of my control loop...  Now the routime MoveScrollbar...

MoveScrollbar(theControl, partCode)
ControlHandle	theControl;
int		partCode;
{
	int	amount, current;

	switch (partCode)
	{

case inUpButton:

/*  I go thru case inUpButton, inDownButton, inPageUp, inPageDown.
    then my case statement is over, and the following three lines are
    left */

	current = GetCtlValue(theControl);
	current += amount;		/*amount set by switch */
	SetCtlValue(theControl, current);
}

Ok now as far as I can tell, I always break while performing the
SetCtlValue in the routine above.  As far as I can tell everything 
is in the right place, yet each time I click either of the arrows
I crash.  Any suggestions?

Peter Bako

PS.  I try to read this group, but I dont always get a chance to,
so please send me mail....

ksitze@nmsu.edu (Kevin Sitze) (05/16/89)

Relatively simple...  Your call to FindControl:

	tempInt = FindControl(&MousePoint, myWindow, &whichControl);

Should be

	tempInt = FindControl(MousePoint, myWindow, &whichControl);

and accordingly the calls to TrackControl should be:

	For Thumb:
	TrackControl(whichControl, MousePoint, nil);

	For rest:
	TrackControl(whichControl, MousePoint, MoveScrollbar);

A point is 4 bytes long and should be passed directly.  A pointer to
the point will give the wrong value.

Finally, the reason everything blows up in your face:

You have to tell C that the routine is expected to be called from the
toolbox.  E.g. Pascal compatable:

pascal MoveScrollbar(theControl, partCode)
ControlHandle	theControl;
int		partCode;
{
}

Have fun!!

			-Kelesi
--
------------------------------------+-------------------------------
From the Macintosh of: Kevin Sitze  | Disclamer: Who the heck needs
                                    |   a disclamer?  After all, Dan
EMail: ksitze%NMSU.edu              |   Quayle doesn't.
SMail: 601 S. Melendres             +-------------------------------
       Las Cruces, NM  88005        | "We have the answers, the
------------------------------------+  trouble lies in finding the
"The difference between intelligence|  questions..."
and stupidity is that intelligence  | "The information is there,
has a limit."           - anonymous |  finding it is another story."
The dolt confuses you -- more --    |	   	    - Any consultant
------------------------------------+-------------------------------