Introduction
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 reverse
Example 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.