We make software for humans. Custom Mac, Windows, iOS and Android solutions in HyperCard, MetaCard, and RunRev LiveCode
HC Tips and Tricks
You can drop into the debugger at any time while a script is running by typing option-command-period. The debugger will stop on the line of script currently being executed. You can also break into the debugger when an "answer" or "ask" dialog is on screen. Type the same key combination, then click one of the buttons in the dialog. As soon as the dialog disappears, you will drop into the debugger.
Jacqueline Landman Gay
Copying a card, changing a card property such as "dontSearch", and then pasting in the new card, will create the new card with a new background. Another way to create a new background is to change a shared field after copying the card but before pasting it.
When you use HyperCard 2.3.5 to create a new text file with the "open file
" command, QuickTime 3 will look at that file to see if it has a suffix relating to QuickTime, for example ".gif". QuickTime 3 then instructs Finder to modify the files based on their suffixes. The files' creator and type is then changed to conform to the suffix. This behavior is controlled by a setting in the QuickTime Settings control panel. Open that control panel and select the QuickTime Exchange panel. Uncheck the box labeled "Enable QuickTime Exchange". Restart your machine, and your new files will remain TEXT/ttxt files.
White Feather Software
A few script editor changes didn't make it into the HyperCard 2.4 Read Me file. Here is a summary: - Not everyone likes losing the area in the window occupied by the menus, so the script editor removes them if the HyperTalk global "scriptHidePopups" is true. - Not everyone likes the "annoying flashing" of the script's length label, so the label is not drawn if the HyperTalk global "scriptHideLengthItem" is true. - Cmd-E grabs the selected text for the "find" string (the same as cmd-H but without doing a search). - The HyperTalk global "scriptReverseSearch" controls the search direction. Holding down the shift key while doing a search toggles the search direction for that search only.
In the Home stack there are paths stored that let HyperCard know where to find files and stacks. Normally, once you have used a document, HyperCard remembers where it was, and therefore doesn't ask you for it the next time. You can avoid having HyperCard ask you where a document is even if its path is not stored in the Home stack. HyperCard stuffs those paths into three variables, Stacks, Applications, and Documents. In your OpenStack handler you could append the paths your program might need to those variables. As an easy example, if you have a CD-ROM that holds the QuickTime movies in a folder, and the HyperCard application is run from somewhere on the user's hard disk, the openstack handler could include: global documents put "my cd:movies folder:" into mymovies if mymovies is not in documents then put documents & return & mymovies into documents Checking to see if documents already contains your movies path is just to make sure you don't keep on appending your path to the documents variable everytime that there is an openstack that day.
HyperCard's paint text is limited to 100 characters per line and 20 lines.
Jacqueline Landman Gay
You can prompt the user to insert a particular disk, if you can access the diskettes ahead of time, by using an alias. HC 2.3 lets you do something like this (where the alias to the diskette is stored on your hard drive): on mouseUp insertDisk "Sample Diskette" if the result is empty then -- do something with that disk end if end mouseUp on insertDisk diskName if NOT (there is a disk diskName) then put "Mac HD:My Folder:" & diskName && "alias" into aliasPath if NOT there is a file aliasPath then return "Alias not found" end if -- next shows "Please insert disk:" open file aliasPath end if if NOT (there is a disk diskName) then return "Cancel" end insertDisk
A way to bypass the 32K script limit is to split up the scripts and put a "send" handler in the script which is about to overflow, which sends the message to another object like the script of a button. For example, the background script is almost full and I need a handler "showEditor" which can be called all over the background. I put the actual handler in the script of a background button "xScripts1", and in the background script I put the following script: on showEditor send the params to bg btn "xScripts1" end showEditor "the params" includes the "showEditor" command as well as all the parameters passed to "showEditor". There is one caveat here: when using "send", the parameters are evaluated before sending. This means that the following command will cause problems: showEditor "line1"&return&"line2",param2 because what the xScripts1 button will receive, is: showEditor "line1" "line2",(the value of param2) and the command gets split into two lines. The same thing happens with "quote". The only way to get round this is include a script in the passing handler which parses all parameters so that they are sent under the form 'quote&"text1"&return&"text2"...'
Here's a quick way to write a temporary script for something you are only going to do once, such as moving all the buttons on a card, or collecting a one-time list. You don't even need to open the script editor. Show the Variable Watcher window. If you don't already have one, type "get it" into the message box to create a global "it" variable. In the Variable Watcher, load the value of "it" with your list of commands. Your temporary script can be as many lines as you like. (Omit any "on" or "end" handler lines, just list the actual command lines.) You can use if-then conditionals, repeat loops, or any other valid HyperTalk syntax. Next type "do it" into the message box. The commands will run and there won't be a script left over to remember to erase later. It is also possible to paste multiple command lines into the message box and hit the return key to accomplish the same thing, but to do so, you have to first type the commands into a script or a text editor before you can paste them. Using the Variable Watcher shortens the process to one step.
Jacqueline Landman Gay
You can turn the arrow keys on while typing in fields, but off the rest of the time, with this: on arrowKey set the textArrows to (the selectedChunk is not empty) pass arrowKey end arrowKey Don't recall where I got this but it could have been from HyperTalk 2.2 The Book. I use it as an "else" statement with all the other arrowKey directions.
Program Manager, Monitoring Times Magazine
Double-clicking on the viewing rectangle in the Scroll window restores the viewing area to the entire card (if there is enough memory.) Another double-click in the rectangle shrinks the viewing area to its previous smaller size.
Jacqueline Landman Gay
Since HyperCard faithfully manages the clipboard behind the scene, HyperTalk can easily and reliably remind you what is there to be pasted. function ClipBoardType -- ex: the fifth menu item of menu Edit reads something like: -- "Paste Picture", so... return (word 2 of menuitem 5 of menu "edit") end ClipBoardType Of course, the function assumes that the top five menuitems of menu Edit have not been changed. Otherwise, you just take the longer but safer scripting route... if there is a menuitem "Paste Picture" of menu "Edit" then return "picture" else if -- etc...
Research Scientist, Hydro-QuŽbec Research Institute
HyperCard can get confused if you have multiple copies of a stack in different folders or on different disks. Unless long stack names are used in go statements, it's not always clear which of several identically named stacks a "go stack" command will navigate to. It would be nice to be able to check where you are. Set the longWindowTitles property to true. When it is true the title bar of the stack window contains the long name of the stack. Note this is only useful when the titleBar of the stack window is visible.
Given that hard disk access is much slower than RAM acess, writing to disk frequently can slow down an export. Repeatedly writing records of a few Kbytes per record to disk is inefficient. However, concatenating your data into a single buffer variable and then writing it to disk all at once is also inefficient. This is because, as the buffer variable grows in length, HyperCard takes ever longer to perform a concatenation. Additionally, having a large buffer variable in RAM taxes HyperCard's memory usage. In the worst case, HyperCard can crash if the buffer grows too large. The solution is to find a compromise that will allow the use of a buffer to cache records, but not allow the buffer to grow to an unmanageable size. If data records tend to be fairly uniform in length, the buffer can be flushed (written to disk and then emptied) at regular intervals (for exmple, every time it contains 10 records.) If the length of data records is less uniform, the buffer size can be monitored and the buffer flushed only when it is about to exceed some arbitrary maximum size.
For years now I've been double-clicking just after the leading quote mark of a quoted phrase to select the entire phrase. For example: This is a "quoted phrase" to select. If you double-click immediately after the first quote mark, you get the entire phrase selected, without the quote marks. (Only works in the Script Editor, not in a field.) With parenthetical expressions, it works differently. If you double-click after the leading parenthesis, you get just the first word selected. However, if you double-click immediately before the trailing parenthesis, you select the entire expression. For example: This is (a parenthetical expression) to select. Double-clicking between the "n" & ")" gets you "a parenthetical expression" selected, without the parentheses.
White Feather Software
The 'Handler too long' message pops up whenever the executable code that HyperTalk generates when compiling your handler exceeds its limit -- which is currently 32K. The HyperTalk compiler for Macintoshes with 680x0 microprocessors generates 68000 instructions, while the HyperTalk compiler for Macintoshes with PowerPC microprocessors generates pseudocode that requires fewer instructions per operation. Therefore you can get away with slightly longer handlers in one version of HyperCard than you can in the other.
Apple Computer, Inc.
When setting up menuItems from a script, you can set the itemDelimiter to whatever you want before passing the list of menu items to HyperCard. So if the itemDelimiter is "/", then passing "Menu One/Menu Two/Menu Three" when setting the contents of a menu will give you menu items: Menu One Menu Two Menu Three just as though you had comma-delimited the list.
Command-Delete deletes a card without warning. However, in version 2.2 or higher, Undo works, so you can recover easily. However, while the Command-Delete generates the proper closeCard, deleteCard messages, the Undo doesn't generate any messages at all, making it impossible to tell from a script that the user did this.
There is a way to stop text from going into the message box when you command-click in a field. You can put the following handler into the script of the field: on mouseDown click at the mouseLoc end mouseDown This handler could be useful if you want unlocked fields to respond to mouse clicks, while maintaining access to the message box.
HC requires that all xWindows close before HyperCard Quits. In other words, if you have an xWindow open when you Quit HyperCard, HC will send the window a "close" message before HC Quits. If the window fails to respond properly to that message, HC won't Quit. And it won't tell you of the window's error.
You can hide the card window at startup before it is displayed. The name of the window in which your stack is displayed is usually just the name of the stack. At startUp time (i.e., when the startUp system message is sent), that window has A) yet to be displayed and B) yet to be named. So, one must refer to it as window "Card". For example: on startUp set the loc of window "Card" to 100,100 end startUp will center the window at 100,100 when it is displayed.
There are several reasons for getting large stacks opening up in small windows. 1. not enough memory allocated to HyperCard 2. you opened a colorized stack first then tried to open a larger stack (colorized or not) 3. you opened a color PICT with the Picture XCMD, then tried to open a larger stack 4. you opened a small stack, then used the Open Stack menu item in the File menu to open a larger stack All of those ways of getting small windows for large stacks are nasty, egregious bugs that are not, however, bugs in HyperCard so for the moment we're stuck with them. The workaround is to open your largest (meaning window-size, not number of cards) stack first.
White Feather Software
If a stack exists, this usually returns TRUE: there is a stack "Sample Stack" But if "Sample Stack" is already open in another application it returns FALSE. When the stack is open in ResEdit, for example. Or open in another version of HyperCard. Or open in a standalone. On the other hand, this returns TRUE, even when a stack is open in another app: there is a FILE "Sample Stack" Conclusions 1. if a *stack* is open in another app, the stack doesn't exist. 2. but if a *file* is open is another app, it continues to exist.
Hiding the menubar when altering the menus will speed up menu customization. on customMenu lock screen hide menuBar -- customize menus here show menuBar end customMenu
If you are typing in a field, or you have an object selected, and you need to type a command in the message box, instead of picking up the mouse and clicking in the message box, just type Cmd-M to hide it, Cmd-M to show it again, and start typing. What you type will go into the message box. This also works if your insertion point is in the message box and you want to start over. In HyperCard 2.2, if your insertion point is blinking in the message box and you want to replace what's there, just type Cmd-A (Select All) and start typing. When your insertion point is in a field, you can also type Enter followed by Delete. THis gives you a blinking insertion point in the message box, as well as empties it.
White Feather Software
Private Access can't be removed. Setting the Private Access button scrambles the stack header randomly based on the password. Without the proper password, you can't unscramble the header, and you can't access the stack. You can still pull all of your scripts out with an editor that can open anything (like BBEdit), but the stack layout is inaccessible.