Jan 96 Top 10
Volume Number: 12
Issue Number: 1
Column Tag: Symantec Top 10
Symantec Top 10
This monthly column, written by Symantec’s Technical Support
Engineers, aims to provide you with technical information based on the
use of Symantec products.
By Michael Hopkins, Symantec
Note: Source code files accompanying article are located on MacTech CD-ROM orsource code disks.
Q: I want to be able to add files to my project, such as ReadMe files and notes,
without having the project manager attempt to compile them. Is there any way to
create an extension such as a .note extension in the SPM that does not use a
translator?
A: Yes, there is. Quit the SPM and open your Symantec C++ folder. Copy the file
none from your Translators folder (the one with the THINK Project Manager
icon) to your (Translators) folder (the one with the Symantec Project
Manager icon). With ResEdit, open the copy and choose Get Info for none
from the File menu. Change the creator from KAHL to None. Save the file, and quit ResEdit. Now go back and launch your project in the Symantec Project
Manager and choose Options from the Project menu and go to the Extensions page. Type the name of the extension that you want to use for your non-compiled source files in the File Extension edit text box. Choose none
from the Translator popup menu, click the Add button and then click the Save
button.
Adding .note to the File Extensions List
Q: When I run my program with the Symantec Debugger from the Symantec Project
Manager, the source code window does not come up and the debugger palette
buttons Go, Step, In, etc. are not active. What is causing this, and how can I fix
it?
A: This behavior is a result of your application being compiled with incorrect
'SIZE' flags. The debugger requires that your project has Background Null
Events and MultiFinder Aware checked on the Flags popup menu in the Project Type page of the Project Options dialog. Without these flags, Power Mac
DebugServices will not be able to communicate with your application.
Q: I have written a brief program in the THINK Project Manager that is crashing my
machine big time. The code is as follows:
typedef struct {
int a, b;
} Foo, *FooPtr;
main()
{
FooPtr foobuf;
int i, size = 100;
foobuf = (FooPtr) malloc( size*sizeof(Foo) );
if (foobuf == NULL)
exit(0);
for ( i = 0; i < size; i++ )
{
foobuf[i].a = 0;
foobuf.b = 0;
}
}
Why is this causing me so much trouble? Is something wrong with malloc?
A: No, malloc is not at fault. By not including and , your
compiler does not have a function prototype for malloc, so it is guessing
(incorrectly) about the size of the argument to malloc. Instead of using the type
size_t, it is assuming an int. To avoid this problem, always choose Require
Prototypes on the Language Settings page of your THINK C Options dialog.
With that option selected, this would have resulted in a compilation error instead
of a runtime error.
Q: Can I use Quickdraw GX with TCL and VA?
A: Yes, it is possible. For starters, initialize Quickdraw GX in CApp::ICApp() in
the following manner:
void CApp::ICApp()
Ix_CApp(4, 24000L, 20480L, 2048L);
// Initialize your own application data here.
long graphicsHeapSize = 375; // about 25K
theGXClient = GXNewGraphicsClient( nil, gGraphicsHeapSize * 1024L,
0L );
FailNIL( theGXClient );
GXEnterGraphics();
assert (GXGetGraphicsError( nil ) != out_of_memory);
// etc.
}
You will need to declare theGXClient as a member function of CApp of type
gxGraphicsClient and include the proper header files in CApp.cp.
Additionally, it is a good idea to override CApplication::InspectSystem() to
check for the presence of QuickDraw GX. It is considered programmer error to
call GX routines without verifying via Gestalt() that GX is present. Finally,
override CApplication::Exit() in CApp using the following example:
void CApp::Exit( )
GXDisposeGraphicsClient( myGXClient );
// etc...
x_CApp::Exit();
}
Q: Why does printf crash when I use it in a TCL project? Is there any way to use
TCL in conjunction with the console?
A: Yes, there is. The console package does some special initialization that needs to be
done in place of the standard toolbox initialization that TCL does. To use the
console with TCL, you should override CApplication::InitToolbox(), like
this:
void CApp::InitToolbox( void )
cout<< "Initialize console package"<
}
The call to cout in place of the standard CApplication::InitToolbox() will
initialize the toolbox and the console package. This will enable the use of printf
and iostreams routines with the console window. Note: You will need to add the IOStreams library and replace ANSI_small with ANSI.
Q: How do I make an application (or the Project Manager) multi-session, so I can
throw it on a server and have several users run the application off of the server
at the same time?
A: Use ResEdit to open the application you want to share. From the File menu, choose Get File Info for the application, and click the Sharable flag. Save the
application, and Quit ResEdit. Your application can now be used by multiple users simultaneously.
Q: I am working on an application that prompts the user for a password. I need to be
able to filter the edit text so that it displays bullet characters instead of the
actual password. Is there an easy way to do this in VA?
Example of an Application that uses a Password Edit Text Filter
A: Yes. You must first create a derived class from CDialogText in VA. Then
override the DoKeyDown() method in the following manner:
void cPasswordText::DoKeyDown( char theChar, Byte keyCode,
EventRecord *macEvent )
Boolean pass = TRUE;
short ID;
Str255 textString;
switch (theChar)
{
case TCL_CR:
case '\t':
case kEnterKey:
pass = FALSE;
break;
case kEscapeOrClear:
if (keyCode == KeyEscape) pass = FALSE;
break;
default:
GetTextString( textString );
if ( ! isalnum( theChar )) // pass spaces and delete keys
inherited::DoKeyDown( theChar, keyCode, macEvent );
pass = false;
}
}
if (pass)
textString[textString[0]] = ‘•’;
SetTextString( textString );
// add code to store actual characters typed here
if (itsTypingTask && itsTypingTask->CanStillType())
BroadcastChange(dialogTextChanged, &ID);
}
}
else
itsSupervisor->DoKeyDown(theChar, keyCode, macEvent);
}
Q: Can I use STL with Symantec C++?
A: Yes, Symantec C++ supports a modified version of STL. For best results, you
need to use 8.0.3 of our Symantec C++ compiler. Patches are available via
anonymous ftp at ftp://devtools.symantec.com/updaters/sym.cpp-va-tcl.update.
Q: I’m using your new Pascal Universal Headers for THINK Pascal and I get pages of
link errors. Why is this?
A: When you use our Universal Headers, you need to make sure that you have the
proper uses statements for the toolbox routines that you are using. You can no
longer rely on the correct uses being used automatically. You will need to be
very conscious of which interface file you use. See the Readme for further
details.
Q: I call the Place() method of a CPanorama object I have created in the Main view
using VA, but nothing happens. Place() works fine for other objects derrived
from CPane. What gives?
A: Place(), inherited from CPane, sets the data members hEncl and vEncl, which
indicate the pane’s position relative to itsEnclosure. In the case of
CIconButton, for instance, itsEnclosure will be the itsMainPane member of
the Document (itsMainPane is the CPanorama object that acts as the background
of every view of type Main Window). Hence, calling the Place() member of a
CIconButton visibly moves the button relative to the window. In the case of a
CPanorama object however, itsEnclosure is actually itsScrollPane. A
panorama’s Place() function will not visibly change its postion. You should
instead call itsScrollPane-> Place() to move a panorama relative to the
window.
If you have a question or topic for a future Top Ten article, please send us your
ideas. If you have found an answer to an obscure problem that has been eluding you, or
you have a stumper, send it to topten@devtools.symantec.com. If we choose to use your
question in our column, your submission will be immortalized in print, and we will
mail you a cool Symantec T-shirt.
Special thanks to: Glenn Austin, Mark Baldwin, Levi Brown, Craig Conner, Andy
McFarland, Christopher Prinos, and Kevin Quah.