May 97 develop QA
Volume Number: 13 (1997)
Issue Number: 5
Column Tag: develop
Macintosh Q & A
by Apple Developer Support Center
Q: How can I determine whether my 680x0 program is running on a PowerPC machine?
A: The best way to do this is to use the Gestalt selectors as described in the Universal Interface file Gestalt.h:
enum {
gestaltSysArchitecture = 'sysa', // Native system architecture
gestalt68k = 1, // Motorola MC680x0 architecture
gestaltPowerPC = 2// IBM PowerPC architecture
};
A snippet of code that uses this would look something like the following in your 680x0 program:
long myattr;
OSErr err;
err = Gestalt( gestaltSysArchitecture, &myattr);
if (err == noErr) {
if (myattr == gestaltPowerPC)
// Do some PowerPC thing.
...
} else {
// Handle the error condition.
...
}
Q: I've created a dialog box that has two editable text fields in it and I've used an 'ictb' resource to change the font and the size of the fields to 10-point Geneva. When I move the insertion point into the second field and delete a character, the character just before the one I deleted drops down a couple of pixels and overwrites itself. What can be done about this?
A: You've run into a problem with the Dialog Manager's support of 'ictb' resources. The Dialog Manager forgets to reset some of the fields of the TextEdit record when it swaps the font and font size information stored in the 'ictb'. You need to reset the fontAscent and lineHeight fields of the TextEdit record to match the size of the font specified in the 'ictb'. By default those fields are set to the lineHeight and fontAscent of 12-point Chicago.
The following code shows how to set up the TextEdit record properly.
static void SetUpEditField(DialogRef dlog, short fontNum, short fontSize)
{
FontInfo info;
DialogPeek dpeek = (DialogPeek)dlog;
if (dpeek != nil) {
TEHandle te = dpeek->textH;// Get the TEHandle.
if (te != nil) {
short oldFont = dlog->txFont; // Save old font info.
short oldSize = dlog->txSize;
TextFont(fontNum);// Set correct font info.
TextSize(fontSize);
GetFontInfo(&info);
// Fix the TE record.
te[0]->txFont = fontNum; // Set font.
te[0]->txSize = fontSize;
// Calculate the correct line height.
te[0]->lineHeight = info.ascent + info.descent + info.leading;
te[0]->fontAscent = info.ascent;
TextFont(oldFont);// Reset the font info.
TextSize(oldSize);
}
}
}
Then call SetUpEditField in your dialog routine, like this:
static short DoDialog(short resID)
{
DialogRefdlog;
GrafPtroldPort;
short itemHit = 0;
GetPort(&oldPort);
dlog = GetNewDialog(resID, nil, (WindowRef)-1);
if (dlog) {
SetPort(dlog);
SelectDialogItemText(dlog, 2, 0x8000, 0x8000);
// Set the cursor.
SetUpEditField(dlog, geneva, 10);
// Set the edit field.
(void)SetDialogDefaultItem(dlog, 1);// Highlight OK button.
ShowWindow(dlog); // Show the dialog.
while (itemHit != ok)
ModalDialog(nil, &itemHit);
SetPort(oldPort);
DisposeDialog(dlog);
}
return itemHit;
}
Of course, an alternative to all this is to avoid the Dialog Manager altogether and thereby avoid these obscure Dialog Manager problems.