GetWindowText Anfängerfrage
-
void CZinsenDlg::OnBnRechnen() { // TODO: Add your control notification handler code here double Startkapital, Zinssatz; int Laufzeit; double Ertrag; CString str; // alte Werte aus Liste löschen m_Ausgabe.ResetContent(); // Benutzereingaben einlesen m_Startkapital.GetWindowText(str); Startkapital = atof(str); m_Zinssatz.GetWindowText(str); Zinssatz = atof(str); m_Laufzeit.GetWindowText(str); Laufzeit = (int) atof(str); //Kapitalentwicklung über die Jahre for(int i = 0;i <= Laufzeit; i++) { Ertrag = ErtragOhneZinseszins(Startkapital, Zinssatz, i); str.Format("%lf", Ertrag); m_Ausgabe.AddString(str); } m_Ausgabe.SetCurSel(Laufzeit); }
-
cremlin schrieb:
zinsendlg.cpp(108) : error C2664: 'int CWnd::GetWindowTextW(LPTSTR,int) const' : cannot convert parameter 1 from 'char [100]' to 'LPTSTR'
Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style castFalsche Projekteinstellungen - GetWindoeTextW() ist die UNICODE-Variante und erwartet ein wchar_t-Array als Ziel für die Ausgabe. Das heißt, du brauchst einen
wchar_t str[100];,TCHAR str[100];(funktioniert unabhängig von den Projekteinstellungen) oderCString str;(wohl die beste Alternative).
-
Danke für die schnelle Antwort. Jetzt hab ich zwar kein Problem mit GetWindowText mehr, dafür aber mit atof:
zinsendlg.cpp(140) : error C2664: 'atof' : cannot convert parameter 1 from 'CString' to 'const char *'
No user-defined-conversion operator available that can perform this conversion, or the operator cannot be calledzinsendlg.cpp(142) : error C2664: 'atof' : cannot convert parameter 1 from 'CString' to 'const char *'
No user-defined-conversion operator available that can perform this conversion, or the operator cannot be calledzinsendlg.cpp(144) : error C2664: 'atof' : cannot convert parameter 1 from 'CString' to 'const char *'
No user-defined-conversion operator available that can perform this conversion, or the operator cannot be calledzinsendlg.cpp(150) : error C2664: 'void ATL::CStringT<BaseType,StringTraits>::Format(const wchar_t *,...)' : cannot convert parameter 1 from 'const char [4]' to 'const wchar_t *'
with
[
BaseType=wchar_t,
StringTraits=StrTraitMFC_DLL<wchar_t>
]Blickt da wer durch??
Hab das Beispiel Zeichen für Zeichen aus dem Buch "Jetzt lerne ich Visual C++ .NET" übernommen und es funktioniert trotzdem nicht
ärgerlichSollte ich also die Projekteinstellungen ändern? Und wo/wie ändere ich das auf die "nicht-unicode-variante"?
lg cremlin
-
Wenn Du MFC verwendest dann bitte nicht sprintf oder ähnliches.
Nimm Format von CString.Eine CString zu int
int t = 0; CString cs("2"); t = atoi(cs);
-
cremlin schrieb:
zinsendlg.cpp(140) : error C2664: 'atof' : cannot convert parameter 1 from 'CString' to 'const char *'
No user-defined-conversion operator available that can perform this conversion, or the operator cannot be calledJa, atof() wiederum erwartet char-Daten und keine wchar_t's - ergo mußt du es ersetzen durch die UNICODE-Variante '_wtof()' (bzw. '_ttof()').
-
Ok, jetzt ist nurnoch die letzte Fehlermeldung aktuell. str.Format erwartet also "const wchar_t*"....
Wie krieg ich das jetzt noch hin?
Ich muss doch irgendwo die Projekteinstellungen so ändern können, dass kein unicode verwendet wird, oder? Sonst muss ich jedes Programm aus dem Buch umschreiben damit es bei mir funktioniert.
-
cremlin schrieb:
Ok, jetzt ist nurnoch die letzte Fehlermeldung aktuell. str.Format erwartet also "const wchar_t*"....
Wie krieg ich das jetzt noch hin?Klammere den Formatstring in _T(...) oder TEXT(...).
Ich muss doch irgendwo die Projekteinstellungen so ändern können, dass kein unicode verwendet wird, oder? Sonst muss ich jedes Programm aus dem Buch umschreiben damit es bei mir funktioniert.
In den Projekteinstellungen unter C/C++ -> Präprozessor kannst du den Eintrag UNICODE aus den Präprozessor-Definitionen rausnehmen, dann compiliert er wieder im ANSI-Modus (alles verwendet char-Daten).
-
Bei den Präprozessordefinitionen steht nur WIN32;_WINDOWS;_DEBUG , nichts von UNICODE...
Tut leid wenn ich mich etwas dumm anstelle, aber was genau soll ich mit _T() einklammern? Hab schon alle Kombinationen versucht. Am längsten hat er kompilliert, wie ich %lf eingeklammert hab, aber funktioniert hats trotzdem nicht.
-
Schreib statt "blablaZeichenkette" einfach _T("blablaZeichenkette").
-
Ok, auch auf die gefahr hin, dass ich wie ein mensch ohne hirn klinge: Was genau soll ich in _T() einklammern?? Den quelltext hab ich ja schon gepostet und es geht jetzt nur noch um die zeile str.Format("%lf", Ertrag); wenn ich das richtig sehe. Und was in dieser zeile soll ich jetzt einklammern? Will doch nur das Programm mal zum laufen kriegen, dann lass ich euch schon in ruhe...
lg, cremlin
-
Du brauchst uns nicht in Ruhe lassen, allerdings versuchen wir hier, eher generell zu erklären als nur schnell den Code hinzurotzen.
zeile str.Format(_T("%lf"), Ertrag);So war das gemeint.