May 97 develop QA
Volume Number: 13
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.