MacTech Network:   MacForge.net  |  Computer Memory  |  Register Domains  |  Printer Supplies  |  Cables  |  iPod Deals  |  Mac Deals  |  Mac Book Shelf


  MacTech Magazine

The journal of Macintosh technology

 
 

Magazine In Print
  About MacTech  
  Home Page  
  Subscribe  
  Archives DVD  
  Submit News  
  Submit a Tip!  
  Get a copy of MacTech RISK FREE  
Google
Entire Web
mactech.com
Mac Community
More...
MacTech Central
  by Category  
  by Company  
  by Product  
MacTech News
  MacTech News  
  Previous News  
  MacTech RSS  
Article Archives
  Show Indices  
  by Volume  
  by Author  
  Source Code FTP  
Inside MacTech
  Writer's Kit  
  Editorial Staff  
  Editorial Calendar  
  Back Issues  
  Advertising  
Contact Us
  Customer Service  
  MacTech Store  
  Legal/Disclaimers  
  Webmaster Feedback  
ADVERTISEMENT
Click Here
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 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: 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.



Click here to find out more about our best subscription bundle deal ever!
2 years of the magazine, and the all new MacTech DVD ... at 70% off!



Click on the cover to
see this month's issue!

TRIAL SUBSCRIPTION
Get a RISK-FREE subscription to the only technical Mac magazine!
 
 


MacTech Magazine. www.mactech.com
Toll Free 877-MACTECH, Outside US/Canada: 805-494-9797

Register Low Cost (ok dirt cheap!) Domain Names in the MacTech Domain Store. As low as $1.99!
Save on brand compatible and name brank ink jet and laser supplies.
Save on long distance * Upgrade your Computer
Movies with No Late Fees!

See local info about Westlake Village
SJ * BRJ * BJ * OJ * NITS
Staff Site Links



All contents are Copyright 1984-2007 by Xplain Corporation. All rights reserved.

MacTech is a registered trademark of Xplain Corporation. Xplain, Video Depot, Movie Depot, Palm OS Depot, Explain It, MacDev, MacDev-1, THINK Reference, NetProfessional, NetProLive, JavaTech, WebTech, BeTech, LinuxTech, Apple Expo, MacTech Central and the MacTutorMan are trademarks or service marks of Xplain Corporation. Sprocket is a registered trademark of eSprocket Corporation. Other trademarks and copyrights appearing in this printing or software remain the property of their respective holders.