Extending CStringArray
Environment: VC6 SP3, NT4 SP4
One of the reasons I left C and began to use C++ was CString and even more so CStringArray. These two classes are worth all the other aggravation when going OO. I don't claim that they are perfect. There are things missing in both of those classes and I would like to share this extension of CStringArray that I have made.
Finding an string in a CStringArray
One of the things that I think are missing in CStringArray is a Find method. I find myself wanting to get a specific string out of the array and I know part, or the whole, of it. Not the position in the array. So I added this method. It is very straight forward and uses CString::Find to find the string.Example:
meStringArray arr; // fill the array with strings using the normal Add() arr.Add("This is a String"); arr.Add("The second string"); arr.Add("the 3:rd string"); // find the third string int i=arr.Find("3:rd"); // i is now 2 CString sBuf; sBuf=arr.GetAt(i); // sBuf has now the value of "the 3:rd string"
Array of NULL terminating strings
Some SDK-functions and some classes still using an array of NULL terminating strings. e.g. CFileDialog uses this kind of array for the filters. GetProfileString("section",NULL,"",buf,sizeof(buf)); also uses it, and there are many more. So every time you need to use this class/function you have to go back to C and do a lot of loops. Well I finally got tired of it and extended CStringArray with two methods; AddBuf() and GetBuf(). The first will take an array of NULL terminating strings and add it to the StringArray, and the second will do the reverseExample GetBuf:
CFileDialog dlg; meStringArray filter; // init filter filter.Add("All files"); filter.Add("*.*"); filter.Add("Doc files"); filter.Add("*.doc"); filter.Add("Text files"); filter.Add("*.txt"); // Init file dialog dlg.m_ofn.lpstrFilter=filter.GetBuf(); dlg.m_ofn.lpstrInitialDir=initDir; dlg.m_ofn.Flags |= OFN_SHAREAWARE; int rc=dlg.DoModal(); if(rc==IDOK) { m_filepath=dlg.GetPathName(); UpdateData(FALSE); }
Example AddBuf:
meStringArray arr; char buf[1024]; // Get all printer names GetProfileString("devices",NULL,"",buf,sizeof(buf)); // add them to the array arr.AddBuf(buf); // Get the second printer name from the array CString sPrintName = arr.GetAt(2);
Well that's it! It's not a very large class so there is not so much to say. I hope that someone will find use for this and PLEASE let me know what you think! This is the first class I ever published so please say what you think about it, good, bad.
Comments