|
What is the value of txtEdit after the call to GetDlgItemText() ?
"Opinions are neither right nor wrong. I cannot change your opinion. I can, however, change what influences your opinion." - David Crow
|
|
|
|
|
When I display it in a messagebox its value is the decimal value read from the edit box.
|
|
|
|
|
Unless there is something else going on that is not being shown, the code snippet I provided will work.
"Opinions are neither right nor wrong. I cannot change your opinion. I can, however, change what influences your opinion." - David Crow
|
|
|
|
|
Actually I've only just realised that only the first digit is being converted. I.e. if I enter 2.3 I get 2.00 but if I enter 14.6 I get 1.00.
I must do something really wrong somewhere but I can't see where!
Thanks for your help!
|
|
|
|
|
Something's definitely amiss here. If you don't make the call to GetDlgItemText but, instead, just set txtEdit to "2.334" (for example), boxval ends up being 2.334 (or whatever you ste in txtEdit ). This works just fine...tested it m'self, I did.
So something's not right, and it's definitely something to do with the conditions under which GetDlgItemText is called. Maybe you're only responding to single keystrokes in the edit box, I'm not sure.
Some things to try testing:
* GetDlgItemText returns the number of characters copied. Store this returned value to an int and make sure it's returning the right number of characters.
* sscanf returns the number of arguments extracted from the string. So if your sscanf() isn't returning '1', then something's wrong.
Bob Ciora
|
|
|
|
|
First thanks for the help! Much appreciated!
Here's my exact code now;
void CmySpinButtonCtrl::OnDeltapos(NMHDR* pNMHDR, LRESULT* pResult) <br />
{<br />
NM_UPDOWN* pNMUpDown = (NM_UPDOWN*)pNMHDR;<br />
<br />
<br />
CString tmp, txtEdit="82.45";<br />
float boxval;<br />
<br />
char *txt = (char *) (LPCTSTR) txtEdit; <br />
sscanf(txt, "%f", &boxval);<br />
double d = atof(txt); <br />
<br />
tmp.Format(_T("atof is %f"), d);<br />
AfxMessageBox(tmp);<br />
tmp.Format(_T("sscanf is %f"), boxval);<br />
AfxMessageBox(tmp);<br />
<br />
<br />
*pResult = 0;<br />
}
Both Message boxes display the same value 8.0000.
This function is being called every time the spinner is clicked on.
I'm lost now! What am I doing wrong?
|
|
|
|
|
Try putting a breakpoint at the start of the function, then single step through it (with F10). Use your Watch window to watch the values of tmp , txtEdit , boxval , and d as each line is executed. Validate the values at each step, and make sure you see the following:
(code) (output)
CString tmp, txtEdit="82.45";
float boxval;
char *txt = (char *)(LPCTSTR)txtEdit;
sscanf(txt, "%f", &boxval);
double d = atof(txt);
tmp.Format(_T("atof is %f", d);
tmp.Format(_T("sscanf is %f", boxval);
Definitely a stumper, but it's definitely worth single stepping.
As a side note on programming practice, you should do the following:
const char * txt = (LPCTSTR)txtEdit; instead of your original char * txt = (char *)(LPCTSTR)txtEdit; . You may run into unintended consequences if you force a const to a non-const . It's not hurting you here, but it could bite you in bad places. I'm curious to know if you get a compiler warning from your original statement.
Bob Ciora
|
|
|
|
|
Thanks again for your precious help!
So using the debugger I've now realised that the line char *txt = (char *)(LPCTSTR)txtEdit; is the one causing the problem. In the debbuger the value for txt is 8.00. Funny the message box was returning the right charactere when reading from the edit box..
I have tried using char * txt = (char *)(LPCTSTR)txtEdit; instead but it gives me the error cannot convert from 'const unsigned short *' to 'const char *'.
|
|
|
|
|
Sorry tried using const char * txt = (LPCTSTR)txtEdit; and got the error!
|
|
|
|
|
I didn't say that was the line causing the problem I was just touching on coding practice. So have you single-stepped through the code and checked the values of the variables after each line is executed?
Bob Ciora
|
|
|
|
|
No no, I stepped throught the code and that's where the problem is!
I've tried atof and sscanf again defining the char instead of the Cstring and they work fine!
All I need to do now is copy my Cstring into a char, unfortunately const char * txt = (LPCTSTR)txtEdit; doesn't work!
Thanks again!!!
|
|
|
|
|
Actually... CString has a LPCTSTR operator that will perform the conversion automatically in many cases. So:
CString sFloat = "123.45";
const char * szText = sFloat;
float boxval;
int nArgs = sscanf(sFloat, "%s", &boxval);
double d = atof(sFloat);
In all three cases, the compiler understands (based on the l-value in the assignment statements and the prototypes for sscanf and atof ) that you're using the LPCTSTR operator for CString.
The code above will compile and run successfully, and boxval and d will be 123.45.
I have a sneaking suspicion that you've changed something elsewhere in the program, even a minor change, and it fixed the problem.
Bob Ciora
|
|
|
|
|
CString sFloat = "123.45";
const char * szText = sFloat;
This gives me the following error;
error C2440: 'initializing' : cannot convert from 'class CString' to 'const char *'
float boxval;
int nArgs = sscanf(sFloat, "%s", &boxval);
error C2664: 'sscanf' : cannot convert parameter 1 from 'class CString' to 'const char *'
double d = atof(sFloat);
error C2664: 'atof' : cannot convert parameter 1 from 'class CString' to 'const char *'
Thank you so much!!!
|
|
|
|
|
There are some underlying issues here that have not been explained. Did you use AppWizard to create the project? If so, what type of project is it?
"Opinions are neither right nor wrong. I cannot change your opinion. I can, however, change what influences your opinion." - David Crow
|
|
|
|
|
Sorry, I'm new to all of this.
I did use AppWizard to create the project with eMbedded visual C++ 3.0 for Pocket PC 2002 application.
Shall it change anything?
Sorry to keep on bothering you all!
Thanks.
|
|
|
|
|
Anonymous wrote:
I did use AppWizard to create the project with eMbedded visual C++ 3.0 for Pocket PC 2002 application.
By this I assume it is not Visual Studio v6.
Anonymous wrote:
Shall it change anything?
The compiler errors you are seeing hint at MFC not being properly defined within the project. As has already been pointed out, CString has an LPCTSTR operator and for that not to work means something is wrong further upstream.
Anonymous wrote:
Sorry to keep on bothering you all!
It's definitely not a bother. But, like most crime dramas on tv, it helps to provide the detective with all pertinent information up front so that s/he can look for clues in all the right places.
"Opinions are neither right nor wrong. I cannot change your opinion. I can, however, change what influences your opinion." - David Crow
|
|
|
|
|
Ok, you fixed the problem, so I'm done
Good luck with the rest of your app!
Bob Ciora
|
|
|
|
|
I'm not sure exactly what you are after here but converting text to double, as the subject implies, is as simple as the code snippet I provided earlier. The other code you have is definitely not necessary. You appear to be doing:
text --> double --> text
Is there a point to this exercise? If you are simply wanting to show in a message box what was typed, two lines of code will suffice:
GetDlgItemText(IDC_EDITBOX, txtEdit);
AfxMessageBox("Value is " + txtEdit); If you need the value for calculation reasons, just call atof(txtEdit) .
"Opinions are neither right nor wrong. I cannot change your opinion. I can, however, change what influences your opinion." - David Crow
|
|
|
|
|
Ah...again is it just me or, why don't you just set your edit box to value and float. That way you won't have to convert anything.
Tom Wright
tawright915@yahoo.com
|
|
|
|
|
That's right but if I do that I'd have to write my function as many times as I have Edit boxes with just the name of the float variable changing.
I'd like to do something more generic. It would all work fine if I could convert a string to a float!
Thanks for the help though!
|
|
|
|
|
How do I find out if a Dialog box is open?
I am trying to do a popup dialog box. When user holds down R mouse button a dialog appear and will disappear when R mouse button is release.
I am able to invoke the dialog but I am having problem terminating the dialog
|
|
|
|
|
Anonymous wrote:
I am able to invoke the dialog but I am having problem terminating the dialog
Is it modal or modeless?
"Opinions are neither right nor wrong. I cannot change your opinion. I can, however, change what influences your opinion." - David Crow
|
|
|
|
|
|
By definition, a modal dialog box remains active until it has been dismissed. This would keep the window that owns the dialog (i.e., parent) from seeing the right mouse button.
Perhaps if you provided a bit more information as to what you are doing, an alternative solution could be offered.
"Opinions are neither right nor wrong. I cannot change your opinion. I can, however, change what influences your opinion." - David Crow
|
|
|
|
|
Ahh that's why it wouldn't close it when I tried EndDialog.
Currently I am using Scrollview, I have a bunch of object draw on the screen. When user right click on the object it would pop up a dialog with information about the object, but would disappear once the mouse button is released.
Should I be doing it as modaless?
|
|
|
|