|
Oh, sorry, I didn't finish my thought in my earlier post. It would probably be easier to draw the entire thing yourself (that's where I was going with the "so it looks the same on all OSes"). Use some other control like a button that has an owner-draw style, and then do all the drawing in response to the WM_DRAWITEM message sent by the control.
--Mike--
Visual C++ MVP
LINKS~! Ericahist | PimpFish | CP SearchBar v3.0 | C++ Forum FAQ
VB > soccer
|
|
|
|
|
I've tried this:
CString str = "0x1";
char *ps;
ps = str.GetBuffer(4);
str.ReleaseBuffer();
// Check if the string starts with a '0x'
if(nStringSize > 2 && ('0' == string[0]) && (('x' == string[1]) || ('X' == string[1])))
{
for(i = 2; i < nStringSize; i++)
{
cReturn = cReturn*16;
// Decode ASCII
if((string[i] >= '0') && (string[i] <= '9'))
cReturn += string[i] - '0';
else if((string[i] >= 'A') && (string[i] <= 'F'))
cReturn += string[i] - 'A' + 0xa;
else if((string[i] >= 'a') && (string[i] <= 'f'))
cReturn += string[i] - 'a' + 0xa;
else
// Incorrect character
return 0;
}
return cReturn;
}
else return atol(string);
I get the following error:
error C2440: '=' cannot convert 'wchar_t*' to 'char*'
I've also tried many other ways to convert CString to char* but I still get errors...
Kitty5
|
|
|
|
|
|
okey yes i did that but now i'm getting a corruption problem.
I did this:
sscanf( userIn, "%s %s %s %s", device.GetBuffer(25), cmd.GetBuffer(25), input1.GetBuffer(25), input2.GetBuffer(25) );
I know that:
input1 has been assigned 0x1 b/c I do an AfxMessageBox(input1)
then when I do:
char *str = input1.GetBuffer();
AfxMessageBox(input1); //to check to see if input1 is still ok.
input1.ReleaseBuffer();
I find that input1 has been corrupted:
input1 is not equal to garbage.
how do I assign the value of the CString input1 to a char*?
Kitty5
|
|
|
|
|
kitty5 wrote: sscanf( userIn, "%s %s %s %s", device.GetBuffer(25), cmd.GetBuffer(25), input1.GetBuffer(25),
Don't use sscanf for string parameters; you will always get unexpected behaviors.
kitty5 wrote: char *str = input1.GetBuffer();
AfxMessageBox(input1); //to check to see if input1 is still ok.
input1.ReleaseBuffer();
When you call GetBuffer, you cannot do ANYTHING with the CString object until you call ReleaseBuffer. In the above case, you should just be calling AfxMessageBox(input1); without the GetBuffer/ReleaseBuffer calls.
CString has an explicit conversion operator to LPCTSTR (which is a const TCHAR* -- which equates to const char* in non-UNICODE builds).
To simply your code, write a split function that takes a delimiter (which would be a space in this case) and parses a given CString and places the split CStrings into a CString Array. You will make your life much easier.
If you decide to become a software engineer, you are signing up to have a 1/2" piece of silicon tell you exactly how stupid you really are for 8 hours a day, 5 days a week
Zac
|
|
|
|
|
Zac Howland wrote: To simply your code, write a split function that takes a delimiter (which would be a space in this case) and parses a given CString...
Why not just use AfxExtractSubString() ?
"The largest fire starts but with the smallest spark." - David Crow
"Judge not by the eye but by the heart." - Native American Proverb
|
|
|
|
|
AfxExtractSubString is too clumbsy.
Something like this works well for splitting multiple values:
void Split(CString strText, CString strSeparators, CStringArray& strArray)<br />
{<br />
int start = 0;<br />
while (start >=0 && start < strText.GetLength())<br />
{<br />
int stop = strText.Find(strSeparators, start);<br />
if (stop < 0 || stop > strText.GetLength())<br />
stop = strText.GetLength();<br />
strArray.Add(strText.Mid(start, stop - start));<br />
start = stop + 1;<br />
}<br />
}
If you decide to become a software engineer, you are signing up to have a 1/2" piece of silicon tell you exactly how stupid you really are for 8 hours a day, 5 days a week
Zac
|
|
|
|
|
Zac Howland wrote: AfxExtractSubString is too clumbsy.
How so?
"The largest fire starts but with the smallest spark." - David Crow
"Judge not by the eye but by the heart." - Native American Proverb
|
|
|
|
|
To get the desired result from it for this problem, you would have to make several subsequent calls to it while keeping track of where you are in the original string. Since the problem involves splitting a string by spaces, it is very simple to use the split method I gave to put each substring in the array as it is found and return the array.
The method is also reusable for future parsing of delimited strings (where using AfxExtractSubString would require either using it in another implementation of Split, or changing to code each time you want to use a different delimiter).
Finally, it is very easy to change the CString objects to std::string objects (and CStringArray to std::vector< std::string > ) to make the Split method portable outside of just MFC (or even Windows altogether).
If you decide to become a software engineer, you are signing up to have a 1/2" piece of silicon tell you exactly how stupid you really are for 8 hours a day, 5 days a week
Zac
|
|
|
|
|
Zac Howland wrote: ...while keeping track of where you are in the original string.
Are you sure?
Since the goal was to simply split the user input into four pieces, what's wrong with replacing:
sscanf( userIn, "%s %s %s %s", device.GetBuffer(25), cmd.GetBuffer(25), input1.GetBuffer(25), input2.GetBuffer(25) ); with:
AfxExtractSubString(device, userIn, 0, ' ');
AfxExtractSubString(cmd, userIn, 1, ' ');
AfxExtractSubString(input1, userIn, 2, ' ');
AfxExtractSubString(input2, userIn, 3, ' '); All of the array stuff was not part of the original problem.
"The largest fire starts but with the smallest spark." - David Crow
"Judge not by the eye but by the heart." - Native American Proverb
|
|
|
|
|
Sorry, you are correct. I forgot about the index argument. However, my portability argument still holds.
If you decide to become a software engineer, you are signing up to have a 1/2" piece of silicon tell you exactly how stupid you really are for 8 hours a day, 5 days a week
Zac
|
|
|
|
|
Zac Howland wrote: kitty5 wrote:
char *str = input1.GetBuffer();
AfxMessageBox(input1); //to check to see if input1 is still ok.
input1.ReleaseBuffer();
When you call GetBuffer, you cannot do ANYTHING with the CString object until you call ReleaseBuffer. In the above case, you should just be calling AfxMessageBox(input1); without the GetBuffer/ReleaseBuffer calls.
do you have to release the buffer right after getBuffer?
i.e.:
char *str = input1.GetBuffer();
input1.ReleaseBuffer();
AfxMessageBox(input1); //to check to see if input1 is still ok.
Kitty5
|
|
|
|
|
kitty5 wrote: do you have to release the buffer right after getBuffer?
You release it as soon as you are done with it. However, since you are not modifying the CString object in your example, there's no need to call either method.
"The largest fire starts but with the smallest spark." - David Crow
"Judge not by the eye but by the heart." - Native American Proverb
|
|
|
|
|
kitty5 wrote: how do I assign the value of the CString input1 to a char*?
Why do you need to? What is it that the CString object is not doing that char* will?
"The largest fire starts but with the smallest spark." - David Crow
"Judge not by the eye but by the heart." - Native American Proverb
|
|
|
|
|
DavidCrow wrote: Why do you need to? What is it that the CString object is not doing that char* will?
You can't parse each char of the CString string like a char*...?
i.e. :
char *string = "0x2";
int cReturn = 0;
for(i = 2; i < nStringSize; i++)
{
cReturn = cReturn*16;
// Decode ASCII
if((string[i] >= '0') && (string[i] <= '9'))
cReturn += string[i] - '0';
else if((string[i] >= 'A') && (string[i] <= 'F'))
cReturn += string[i] - 'A' + 0xa;
else if((string[i] >= 'a') && (string[i] <= 'f'))
cReturn += string[i] - 'a' + 0xa;
else
// Incorrect character
return 0;
}
Kitty5
|
|
|
|
|
kitty5 wrote: You can't parse each char of the CString string like a char*...?
Sure you can. Just use either the GetAt() method or the [] operator.
"The largest fire starts but with the smallest spark." - David Crow
"Judge not by the eye but by the heart." - Native American Proverb
|
|
|
|
|
You will save yourself a LOT of trouble by reading up on the CString class: MSDN.
If you decide to become a software engineer, you are signing up to have a 1/2" piece of silicon tell you exactly how stupid you really are for 8 hours a day, 5 days a week
Zac
|
|
|
|
|
kitty5 wrote: // Check if the string starts with a '0x'
if(nStringSize > 2 && ('0' == string[0]) && (('x' == string[1]) || ('X' == string[1])))
{
for(i = 2; i < nStringSize; i++)
{
cReturn = cReturn*16;
// Decode ASCII
if((string[i] >= '0') && (string[i] <= '9'))
cReturn += string[i] - '0';
else if((string[i] >= 'A') && (string[i] <= 'F'))
cReturn += string[i] - 'A' + 0xa;
else if((string[i] >= 'a') && (string[i] <= 'f'))
cReturn += string[i] - 'a' + 0xa;
else
// Incorrect character
return 0;
}
return cReturn;
}
else return atol(string);
Why don't you save yourself a lot of grief and use strtol() instead?
"The largest fire starts but with the smallest spark." - David Crow
"Judge not by the eye but by the heart." - Native American Proverb
|
|
|
|
|
b/c atol's and strtol's parameter is const char*... not CString
Kitty5
-- modified at 15:33 Wednesday 21st June, 2006
|
|
|
|
|
Are you not familar with CString 's LPCTSTR() operator?
"The largest fire starts but with the smallest spark." - David Crow
"Judge not by the eye but by the heart." - Native American Proverb
|
|
|
|
|
How can i access(by iterating)list in the file, which is supplied dynamically(browsing to select file using CFileDialog)during the execution in vc++(mfc) project??
kamalesh
|
|
|
|
|
Use CFileDialog::GetPathName() to get the path of the file. Then open the file. Then read the data from the file.
|
|
|
|
|
ya i already used that.frm thre i can read only the 1st list.but iterating the list using Clist, it's not happening. can u tell me that? how to iterate in this file?
kamalesh
|
|
|
|
|
If you set the OFN_ALLOWMULTISELECT flag for the dialog, you use the following code to iterate through the list of path names:
CFileDialog dlg(...);
if (dlg.DoModal() == IDOK)<br />
{<br />
POSITION pos = dlg.GetStartPosition();<br />
while (NULL != pos)<br />
{<br />
CString newPath = dlg.GetNextPathName(pos);<br />
}
Is that what you are trying to do?
If you decide to become a software engineer, you are signing up to have a 1/2" piece of silicon tell you exactly how stupid you really are for 8 hours a day, 5 days a week
Zac
-- modified at 15:29 Wednesday 21st June, 2006
|
|
|
|
|
kamalesh82 wrote: frm thre i can read only the 1st list
What list? Are you trying to read the contents of the selected file?
kamalesh82 wrote: ...but iterating the list using Clist...
How are you using CList ?
"The largest fire starts but with the smallest spark." - David Crow
"Judge not by the eye but by the heart." - Native American Proverb
|
|
|
|