Feb 94 Tips
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 its 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
Theres an easy way to change a Popup menus 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 youre 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
Its 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 doesnt 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 isnt 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