|
Volume Number: | 5 | |
Issue Number: | 1 | |
Column Tag: | HyperChat™ |
ScriptTips II
By Fred Stauder, HyperChat Editor, Zurich, Switzerland
on HyperChat
-- HyperEditorial
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 then answer “It already exists” exit alias end if put the script of me into temp if the paramCount >2 then repeat with x=3 to the ParamCount if x the ParamCount then put param(x) & “,” after Pms else put param(x) after Pms end repeat else put empty into pms end if put “on” && New &&pms & return & Old &&pms & Return¬ & “end” && New & return after temp set the script of me to temp end alias ------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 search’s 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 doesn’t 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.
----PopupMenu Field-------------- on mousedown --Setup-- put the rect of me into RectOfMeTemp put the topleft of me into MyTopLeft lock screen 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 unlock screen -- 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 then select line sel of me else --check to see if mouse is in menu if the mouseloc is not within the rect of me then select empty exit repeat end if select char offset(line sel of me,me) to¬ (offset(line sel+1 of me,me)-1) of me end if end repeat lock screen if the selection is not empty then 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 else put return before line 1 of me end if set the rect of me to RectOfMeTemp unlock screen --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 ---- etc ---- etc -------------------------------------- ---- or you can do it this way ------ --do line 1 of me -------------------------------------- end mousedown on five beep 5 end five ------All rights reserved Fred Stauder 1988------
--end HyperChat
- SPREAD THE WORD:
- Slashdot
- Digg
- Del.icio.us
- Newsvine