![](/file/12652/www.mactech.com.tar/www.mactech.com/sites/all/themes/custom_front/images/you_are_here_red.gif)
![](/file/12652/www.mactech.com.tar/www.mactech.com/sites/default/files/beta-site.gif)
|
Volume Number: | 10 | |
Issue Number: | 2 | |
Column Tag: | Tips & Tidbits |
Tips & Tidbits
By Neil Ticktin, Editor-in-Chief
Note: Source code files accompanying article are located on MacTech CD-ROM or source code disks.
Tip Of The Month
Playing a sound can be potentially disastrous. Suppose you have an init that plays a sound when a mail arrives on the network, but at the same time, e.g., HyperCard is playing, an (asynchronous) sound of its own. Both sounds will be stopped by a freeze or a crash.
I looked at the code of the _SysBeep trap, and came up with the ‘SafeSound’-procedure. It will only play the sound when it’s safe to do so. If the routine did not play the sound, it returns false so that you try again after, say, a few seconds.
/* 1 */ #define ExpandMem 0x02B6 #define WWExists 0x08F2 Boolean SafeSound (Handle snd) { asm { move SR, D0 ; this little piece of code checks if andi.w #0x0700, D0; we can play our sound ! bne @exit ; Took it from code of the SysBeep-trap! movea.l ExpandMem, A0 movea.l 0x0110(A0), A0 tst.w 0x0018(A0) beq @exit tst.b WWExists bne @exit } SndPlay (NULL, snd, false) ; return true ; // ok, sound is played exit: return false; // sound has not been played }
- Jan Bruyndonckx
Wave Research
Belgium
This column is your opportunity to spread the word about little bits of information that you find out about. These tidbits can be programming related or they can be user tips that are particularly useful to programmers.
MacTech Magazine will pay $25 for every tip used, and $50 for the Tip of the Month. Or you can take your award in orders or subscriptions.
To submit a tip, send in a letter to the magazine. E-mail is our preferred method, but feel free to send something via the US Mail. See page two for all addresses. If you do send snail mail, enclose a printed copy and a disk copy of the letter so that it does not have to be retyped.
Changing Popup Fonts
There’s an easy way to change a Popup menu’s font and size. To do that, you could of course use the new CDEF provided with the Comm Toolbox, but it will not work for Pre-System 7 users.
An alternative solution is to change system font and size before PopUpMenuSelect is called, and restore them afterwards. Typical code looks like:
/* 2 */ TYPE LomemPtrWord=^Integer; LomemPtrLong=^Longint; VAR SysFont, SysSize:Integer; PopUpResult:Longint; {-1 means hierarchical menu} InsertMenu(MyPopUpID, -1); { Let's save system font and size } SysFont := LomemPtrWord($0BA6) ^; {SysFontFam} SysSize := LomemPtrWord($0BA8) ^; {SysFontSize} {Modfy to our convenience (Geneva 10)} LomemPtrWord($0BA6) ^ := Geneva; LomemPtrWord($0BA8) ^ := 10; LomemPtrLong($0B4C) ^ := -1; { This line insure that system will } { load the right font in the cache } { for the next job--drawing my Popup } ResultPopUp := PopUpMenuSelect(MyPopUpHandle, Where.v, Where.h, DefaultItem); { Let's restore system configuration } LomemPtrWord($0BA6) ^ := SysFont; LomemPtrWord($0BA8) ^ := SysSize; LomemPtrLong($0B4C) ^ := -1; { Insure that usual system font will be back loaded } DeleteMenu(MyPopUpID); {...} {PopUp Process } {...}
Remark 1 : If you’re using CheckItem call, be sure that CheckMark character exists in the font and size you want popup menu to be drawn. If not, use SetItemMark instead.
Remark 2 : Modifying directly low memory globals is discouraged by Apple. Future system releases could break this tip. Keep this in mind.
- Laurent Haas
Paris, France
Often Used Field Positions
For data structures accessed via pointers or handles, place the most often used field in your program in the first place of your data structure declaration.
The Optimal Data Structure Declaration is:
/* 3 */ TYPE YourDataStructurePtr = ^YourDataStructure; YourDataStructure = RECORD often_Used_Field:LongInt; less_Often_Used_Field:LongInt; END; Less Optimal Data Structure Declaration: TYPE YourDataStructurePtr = ^YourDataStructure; YourDataStructure = RECORD less_Often_Used_Field:LongInt; often_Used_Field:LongInt; END;
The compiler will generate 66% faster code for the optimal data structure when it compiles the next line:
/* 4 */ yourDataStructurePtr^.often_Used_Field:=someValue;
- Marek Hajek
Incline Village, Nevada
It’s in the fine print
The integration of translators in Think C 6.0 has a few rough areas that are not so obvious, unless you read the fine print in the manual. Unless you never make assumptions about how a feature works, read on....
First, if you use both the C and C++ translators in the same project, you could have problems. The C translator allows you to choose whether you want two or four byte integers. The C++ translator doesn’t give you a choice. Integers are always four bytes. So if you want your C code to co-exist peacefully with your C++ code, you must tell the C translator to use four byte integers. Here is the menu/dialog selections you must make to select four byte integers - “Edit:Options:Think C...:Compiler Settings:4-byte ints”
Second, the project settings allow you to put strings in the data segment of the project, or in separate STRS resources. In the “Set Project Type...” option under the “Project” menu, there is a check box “Separate STRS” that you can use to toggle this setting. It isn’t obvious, but this toggle only affects the C translator. To toggle the same setting for the C++ translator you must make the following menu/dialog selections: “Edit:Options:Symantec C++:Compiler Settings:Place string literals in code”.
- Greg Johnson
WordPerfect Corp.
Orem, Utah
![](/file/12652/www.mactech.com.tar/www.mactech.com/sites/all/themes/custom_front/img/search_text.gif)
- SPREAD THE WORD:
- Slashdot
- Digg
- Del.icio.us
- Newsvine