String Width XCMD
Volume Number: | | 5
|
Issue Number: | | 3
|
Column Tag: | | HyperChat
|
Related Info: Quickdraw
String Width XCMD
By Fred Stauder, HyperChat Editor, Zurich, Switzerland
Note: Source code files accompanying article are located on MacTech CD-ROM or source code disks.
Here Come the Clones
Well the time has finally arrived, we have HyperCard Clones. Congratulations, Bill and the gang; imitation is the sincerest form of flattery.
I predicted over a year ago that HyperCard is the MacPaint of MultiMedia. The question now is who will make the Pagemaker of MultiMedia? The scene is now set for a rapid increase in the performance and features wars. Will they be compatible? How can you compete against a bundled product. This is probably sounding like DeJa vu to the people who have been with the Mac from the start.
Should you rush out and start to develop on the clones or should you wait for Apples version? I feel it will take some teething time to get the compatabilities right, but eventually they will be compatible. I will have a report on the clones next month. What about Hypertalk? Is it here to stay? My prediction is a definite, Yes. I also find it a pain to program in Hypertalk sometimes to do things that would be faster and more concise in C or Pascal. The beauty of Hypertalk is that it can be expanded to become more like English. I feel it will eventually evolve into a description language; something like this:
If this button is clicked then I will get the stuff from the stack with the funny pictures until you tell me I have found the right one.
How can I program like this you say, you wont. First Lets look at what the Programming Agent is telling us. The initial section, If this button is clicked; not very specific unless you want to know the details; I can click it or handle it on mouseDown or mouseUp. If it is not important in this case, dont bother to be specific. The same goes for the next bit about stuff. If I cant remember what stuff it was, it will fill in the details. If I am reading (you actually interact with the code) for the first time that someone else has written, the agent will give me a broad outline or specifics if I ask for them.
If this becomes reality do we need programmers anymore? The answer is NO. We will not need people agonizing over syntax; what we will need is designers of applications. There is a big difference.
Will the whizz bang of the new HyperCards and Clones make our lives easier? The answer is No. There will be more commands to remember, and it will get harder before it gets easier. The programming should get easier as the functionality increases. MacDraw II is a good example; it actually reduced the number of menu items. Are you listening Microsoft?
The other thing is that people have not mastered black and white graphics on a small screen, so we will see horrors during the teething period.
The bottom line is can we keep up to the Clones especially if they all have there own script extensions which are similar but not the same. What we need is a background interpreter engine that will be able to recognize all the various nuances. We have computers to make things easier for us so let them remember so we dont have to.
String Width XCMD
Last month I showed you an example of a gestural device. It was a bit complicated to set up with different words in the message box because the width of the words has to be calculated by looking at the mouseH manually. I wrote a simple XCMD that given a string returns the width in pixels in the result.
{$R-}
(* strWidth -- sample HyperCard external command
that gets the width of a string.
Written in MPW Pascal by Fred Stauder for MacTutor 1989.
pascal :Sources:XCMD:strWidth.p
link -o AJS:test -rt XCMD=7002 -sn
Main=strWidth :Sources:XCMD:strWidth.p.o
{MPW}PLibraries:PasLib.o -m ENTRYPOINT *)
{$S strWidth } { Segment name must be same as command name. }
UNIT Fred_Stauder;
INTERFACE
USES MemTypes, QuickDraw, OSIntf, ToolIntf, PackIntf, PasLibIntf, HyperXCmd;
PROCEDURE ENTRYPOINT(paramPtr:XCmdPtr);
IMPLEMENTATION
TYPE Str31 = String[31];
PROCEDURE strWidth(paramPtr:XCmdPtr);FORWARD;
PROCEDURE ENTRYPOINT(paramPtr:XCmdPtr);
BEGIN
strWidth(paramPtr);
END;
PROCEDURE strWidth(paramPtr:XCmdPtr);
VAR
tempStr: Str255;
tempInt: Integer;
{$I XCmdGlue.inc } {includes the glue routines}
PROCEDURE Error(errStr:Str255); {return an error message}
BEGIN {put error into the result}
paramPtr^.returnValue := PasToZero(errStr);
EXIT(strWidth); {leave the XCMD}
END; {Error}
PROCEDURE ParamCheck;
CONST paramCount: Integer;
VAR params: Integer;
BEGIN
params := paramPtr^.paramCount;
IF (params <> paramCount)
THEN Error(strWidth String or Container);
END; {ParamCheck}
BEGIN {Main}
CheckParamCount;
ZeroToPas(paramPtr^.params[1]^,tempStr);{get first Param}
tempInt := StringWidth(tempStr) ; {get the width}
tempStr := NumToStr(tempInt);
paramPtr^.returnValue := PasToZero(tempStr);
END; {Main}
END. {strWidth}