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 cast

    Falsche 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) oder CString 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 called

    zinsendlg.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 called

    zinsendlg.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 called

    zinsendlg.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 😞 ärgerlich

    Sollte 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 called

    Ja, 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.


Anmelden zum Antworten