By Fred Stauder, HyperChat Editor, Zurich, Switzerland
At Macworld in San Fransisco, I will be presenting the First Annual HyperChat Award. It will be judged in all areas and will be an award of excellence for a certain contribution to the overall Hypercard base. It will cover both Commercial and Non-Commercial products. So we hope to see you all at MacWorld.
-- Script Tips
This month I bring you couple of interesting script tips.
The first occurred to me when I was typing in the message box and I wished I could quickly type in an alias. The script first checks to see if procedure or function has the chosen name, this is done with the offset function.
If it exists it pops up alert and exits the routine.
Next I check to see if the routine to be aliased has parameters. This is done with the paramCount function. Then I put the script of the home stack, where alias is located, into a temp container and put the alias script after it. The last thing I do is to write the modified script back to the home stack.
-------------- Alias --------------
on alias New,Old,Param1,Param2,Param3,Param4,as many as you want
if offset(on && New,the script of me) >0
answer It already exists
put the script of me into temp
if the paramCount >2
repeat with x=3 to the ParamCount
if x the ParamCount
then put param(x) & , after Pms
else put param(x) after Pms
put empty into pms
put on && New &&pms & return & Old &&pms & Return¬
& end && New & return after temp
set the script of me to temp
------All rights reserved Fred Stauder 1988------
The second Script tip is a popup menu field.
I here you groaning not another popup. Yes it is another popup but not an ordinary one. Firstly it is all in Hypertalk it is fast and you can do searchs of the fields unlike with an XCMD popup.
Here is how it works.
You have a locked field which you have put in the menu items. You set the size, justification, font etc. Note you must leave the top line blank i.e. a carriage return in it, I will explain why later. When the mouse is pressed on the field the field expands downwards and deletes line 1. You get what looks like the right side of fig. 1. You do the selection with the mouse, I will go into detail later, and when you release the mouse the selection gets copied before line 1. The reason I chose to do it this way is simple if you want to retain the order of your menu (which is important from a human interface guideline point of view) you have to store the selection in line one because that is the one displayed. I thought of storing what two lines were swapped and restoring them but it was too complicated.
So after the selection is copied into line 1 the rect of the field collapses again.
In the selection process I work out the line number by textheight and number of lines. This tells me what line I am on so all I have to do is say select line x right? Wrong. You can do that with right justification and it is just bearable, the selection doesnt go quite to the edge of the field. With left or center justification the selection (hilite) stops at the end of the word. Annoying. I tried a number of approaches including pre calculating the character numbers for the selection. It was much too slow. So what I finally did is use the offset of the line to get the char number from the end of the line before to the line after. I encountered an error when I tried to get the offset of more lines than I had I got zero and offset reports the error. Not good enough. So I had to selectthe line in a different way. I did it the normal way because the last line always selects all the line not just the word on the line.
Once I have the selection I can do a number of things with them such as if the first line of the card field is .. the do this or that.
What can you do with this? Well as I have mentioned in a previous tip when you search for text it is faster than searching for a name of attribute of an object. So it is ideal for say preferences on an inventory program.
put the rect of me into RectOfMeTemp
put the topleft of me into MyTopLeft
delete line 1 of me
put the textheight of me into txtHt
put number of lines of me into NumLines
set Height of me to txtHt*NumLines+2
set the topleft of me to MyTopLeft
-- This Routine does the Selection --
repeat until the mouse is up
put trunc((the mouseV - top of me)/txtHt)+1 into sel
if sel = numlines
select line sel of me
--check to see if mouse is in menu
if the mouseloc is not within the rect of me
select char offset(line sel of me,me) to¬
(offset(line sel+1 of me,me)-1) of me
if the selection is not empty
if the selection is one then beep
if last char of the selection is return
then put the selection before line 1 of me
else put the selection & return before line 1 of me
put return before line 1 of me
set the rect of me to RectOfMeTemp
--This routine handles the Menu Items--
if line 1 of me is one then beep
else if line 1 of me is two then flash(2)
else if line 1 of me is three then beep 3
---- or you can do it this way ------
--do line 1 of me
------All rights reserved Fred Stauder 1988------