Apr 95 Top 10
Volume Number: | | 11
|
Issue Number: | | 4
|
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 Steve Howard and Glenn Austin, Symantec Technical Support
Note: Source code files accompanying article are located on MacTech CD-ROM or source code disks.
Due to the frequency of calls and mail on the following problem, we are repeating a question published earlier.
Q: Why do derived classes of ifstream cause a bus error when they read in a stream?
A: Any class indirectly derived from the virtual base class ios needs to explicitly call the constructor for ios to initialize the data streams buffer. For example:
class myifstream : public ifstream {
myifstream(char * s) : ios(&buffer),
ifstream(s){}
}
Q: When I set project options for new projects, the options do not transfer to any of new projects I create. How do I get the options to remain set when I create new projects?
A: The new project option will only work if you remove the project model folder for new projects contained within the (Project Models) folder. The THINK Project Manager will then honor the new project options.
Q: I am trying to use Gestalt to find out whether the system has asynchronous SCSI abilities, or whether Quickdraw GX is present, but cant find the right selectors to use. Where do I get this information?
A: There are some Gestalt selectors that are not in GestaltEqu.h. Lists of most known Gestalt selectors and selector codes are available at various ftp sites (see the URL page for possible sites). Once you find the selectors you need, you can add them to GestaltEqu.h, and then re-precompile your MacHeaders, MacHeaders++, and TCLHeaders with the newly-modified GestaltEqu.h.
A simpler way, if your project allows it, would be to add your new selectors into one of your own header files. This would allow you to not need to rebuild your prebuilt header files, as well as allow you to safely replace your GestaltEqu.h with a new one sometime later (without worrying about losing any of your custom-added equates).
To find the answer to your question, we went to MIDnets Info-Mac searcher (http://www.mid.net/INFO-MAC) and did a keyword search on gestalt. We found the following file:
ftp://ftp.hawaii.edu/mirrors/info-mac/dev/info/gestalt-selectors-27.hqx
and have excerpted a few useful lines (in Pascal terminology):
const
gestaltGraphicsVersion = 'grfx'; {Gestalt version selector}
gestaltSCSI = 'scsi'; {SCSI Manager attributes}
gestaltAsyncSCSI = 0; {Supports asynchronous SCSI}
The file we found has much more interesting data, so be sure to go see what other selectors might better suit your purposes.
Q: I want to use the 68881 option in my C++ project. What libraries will I need to recompile?
A: To use the 68881 option, turn on Generate 68881 for both THINK C and C++, then rebuild the following libraries: CPlusLib, ANSI++, unix++, and IOStreams. Some libraries contain both .c and .cp files, and thats why youll need to turn on the option for both C and C++.
Q: How do I get my CIconButtons to print?
A: In VA, create a new subclass of CIconButton, called CPIconButton. Change your icon buttons to type CPIconButton, then save and generate. In TPM, open CPIconButton.h, and add the following method to the class:
virtual void DrawIcon(Boolean fHilite)
{
short drawState = CalcDrawState(fHilite);
// Set up the correct icon
if (printing)
cicnH = nil;
else
cicnH = itsCicnH[drawState];
BlockMove(&itsIcon[drawState], &icon, kIconBytes);
Prepare();
// Let base class hilight only if color hilighting
CIconPane::DrawIcon(fHilite && colorHilite);
}
This will force the icon to draw in black & white on the printer, and it will draw correctly on the screen.
Q: I have created a subview that has a CDialogText item and I need a pointer to the item. Can you show me the easiest way to do this?
A: This is a simple two step process. First, get the ID of your CDialogText resource; these IDs are in the generated header file. The header files name is the subview name with the word Items.h appended (e.g. SubviewItems.h). Second, call the FindViewByID method, passing this ID.
#include SubviewItems.h // list of resource IDs for objects in the subview
CDialogText *myText;
// kMyDialogTextID is found in SubviewItems.h
myText = (CDialogText*)fMain_SubviewName->
FindViewByID(kMyDialogTextID);
Q: I am trying to convert a Pascal record that has a data type of Byte into a C++ structure. I am using the C type char as the equivalent of Byte. Why am I getting bizarre results?
A: The Pascal type Byte is equivalent to an unsigned char in C or C++.
Q: How do I get CTable to show only 3 columns, no matter what the size of the window?
A: To make the table show a constant number of columns, override the Draw method and resize the columns based on the current width of the window. For example:
void CDerivedArray::Draw(Rect *area)
{
LongRect r;
GetFrame(&r); // Get current frame of table pane
static int oldWidth=0;
int width=r.right-r.left; //find width
if(width!=oldWidth) //If width hasnt changed, dont do anything
{
int numCol=GetColCount();
for(int x=0;x<numCol;x++)
{
SetColWidth(x,width/numCol);
}
oldWidth=width; //Update width
}
inherited::Draw(area); //Draw table
}
Q: I am using the default console window and want to change the foreground and background colors. Is there any way that THINK C will allow me to do that?
A: You cannot change the foreground or background colors on the default console window. You can to control some aspects of the console like the text font, size and face. You can also control how input to the console window is read. For more information on using the console window, you can refer to the Online Documentation that came with your THINK C/ Symantec C++ product or in THINK Reference under Console Package Intro and Console Input Mode.
Q: I have created a Visual Architect project, added some views and selected generate all. I have not added any of my own code but, when I try to bring the project up to date, I get an error -192 (resource not found). If I have not added code, what causes this error?
A: In VA, you will get this error if you have defined commands that have the following format in the Command Dialog:
In Class: CMain
Do: Open
View: None
When that command is generated, VA will attempt to create an Open command and associate it with an existing CVue resource. Since you have not assigned a view to the command, there is no corresponding CVue resource. Assign a view to the command to alleviate the problem.
Special thanks to: Kevin Quah, Chris Prinos, Scott Morison, Yuen Li,
Kevin Irlen, Michael Hopkins, Rick Hartmann, Colen Garoutte-Carson,
Craig Conner, Celso Barriga, and Mark Baldwin