Jan 96 Top 10
Volume Number: | | 12
|
Issue Number: | | 1
|
Column Tag: | | Symantec Top 10
|
Symantec Top 10
This monthly column, written by Symantecs 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 or source 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 <stdio.h> and <stdlib.h>, 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( )
{
GXExitGraphics();
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"<<endl;
}
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[0]++;
textString[textString[0]] = ;
SetTextString( textString );
// add code to store actual characters typed here
if (itsTypingTask && itsTypingTask->CanStillType())
{
ID = this->ID;
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: Im 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 panes 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 panoramas 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.