Zinseszinsen mit mehreren Dialogfenstern
-
Hallo
Ich weiß immer noch nicht, ob ich es verstanden habe, aber die Fehlermeldung ist eigentlich eindeutig. Du übergibst der Funktion kein double, sondern CEdit und wird nicht gecastet. Welchen Typ hat den die Variable m_anfangskapital, weil das der Übeltäter zu sein scheint. Ich bin aber selber noch Anfänger und bin mir nicht ganz sicher, ob ich gerade auf dem Holzweg bin.
chrische
-
chrische5 schrieb:
Welchen Typ hat den die Variable m_anfangskapital
Auf dem Holzweg warst du nicht, aber wie man in der Compilermeldung sehen kann ist die übergebene Variable (m_anfangskapital) vom Typ CEdit und das ist ein Edit-Feld. Um auf den Wert eines GUI-Controls zugreifen zu können muss man immer eine entsprechende Methode oder Eigenschaft (Property) dafür aufrufen (in Delphi und .NET sind es Properties mit Namen wie "Text" und "Value"). Diese liefern (meistens) einen Wert des Typs den das Control verwaltet (wenn es nur Text anzeigt, einen String, wenn es nur Zahlen anzeigt oft einen Zahlentyp).
-
@Vellas: Ich arbeite (versuche es wenigstens) mit GetWindowText. Wobei ich mir nicht vorstellen kann, dass es in meiner q_hoch_n.cpp funktioneren kann. Kann ja auch sein, dass ich jetzt etwas um die Ecke denke.
Aber ich hab es gelernt, dass ich nur eine Membervariable mit GetWindowText versehen kann. Doch in der genannten CPP hab ich keine Membervariablen deklariert.Hab es jetzt aber trotzdem mal so probiert.
#include "stdafx.h" #include "q_hoch_n.h" double anfangsk=0, zsatz=0, ergebnis; int jahr=0; char str[100]; void hole_anfangsk() { m_anfangskapital.GetWindowText(str, 100); anfangsk=atof(str); }Ende vom Lied... q_hoch_n.cpp(10) : error C2065: 'm_anfangskapital' : nichtdeklarierter Bezeichner, q_hoch_n.cpp(10) : error C2228: Der linke Teil von '.GetWindowTextA' muss eine Klasse/Struktur/Union sein, ZinseszinsrechnungDlg.cpp(183) : error C2660: 'hole_anfangsk' : Funktion akzeptiert keine 1 Parameter
@Chrische: m_anfangskapital ist vom Typ CEdit. Wenn ich daraus eine double machen würde, wäre die Aufgabe kein Problem.
Aber das CEdit brauch ich laut meinem Lehrer, damit ich die Daten später in einem Listenfeld ausgeben kann. 
-
Du bist doch schon auf dem richtigen Weg gewesen, nur machst du was du vor hast an der falschen Stelle. Du musst die Umwandlung vor dem Aufruf von hole_anfangsk machen, also an der Stelle wo auch m_anfangskapital bekannt ist.
char str[100]; void CZinseszinsrechnungDlg::OnzuFenster2() { UpdateData(true); m_anfangskapital.GetWindowText(str, 100); hole_anfangsk(atof(str)); Fenster2 dlg; dlg.DoModal(); EndDialog(IDOK); }Wie man den Wert aus einem Control in MFC holt wusste ich nicht, habe damit noch nicht programmiert.
-
Okay, hab also wieder um zig Ecken gedacht.

Hab es jetzt mit gib_anfangsk auch probiert...
BOOL Fenster2::OnInitDialog() { char str[100]; CDialog::OnInitDialog(); m_anfangskapital.GetWindowText(str, 100); gib_anfangsk(atof(str)); UpdateData(false); return true; }Wollte eigentlich mit SetWindowText arbeiten. Einfach vom Gefühl her. Aber das macht er nicht... Aber so wie ich es jetzt geschrieben hab, macht er es auch nicht, sondern spuckt mal wieder die Fehlermeldung mit dem 1 Parameter aus.
Kannst du mir auch hier sagen, was ich nun schon wieder falsch gemacht habe?
-
Chaosdevil schrieb:
Aber so wie ich es jetzt geschrieben hab, macht er es auch nicht, sondern spuckt mal wieder die Fehlermeldung mit dem 1 Parameter aus.
Wie lautet der denn jetzt?
'error C2660: 'gib_anfangsk' : Funktion akzeptiert keine 1 Parameter ' ??
Dann liegt es daran, dass die Funktion gib_anfangsk keine Parameter entgegennimmt, du ihr aber welche gibst. Ist doch total logisch oder?
mfg.
-
Hallo
Chaosdevil schrieb:
@Chrische: m_anfangskapital ist vom Typ CEdit. Wenn ich daraus eine double machen würde, wäre die Aufgabe kein Problem.
Aber das CEdit brauch ich laut meinem Lehrer, damit ich die Daten später in einem Listenfeld ausgeben kann. 
Was wunderst du dich denn dann, dass der Compiler meckert? Er erwartet halt etwas anderes als du ihm anbietest.
chrische
-
@chrische: Soweit war ich längst, nur wusste ich nicht, wie ich CEdit sinnvoll umwandeln konnte.

@joomoo: Momentan ist bei mir nichts mehr logisch... Vor allem, weil ich in einem Monat meine Abschlussprüfung schreibe und einige Sachen nacharbeiten muss.
Aber jetzt wo du es so erwähnst und ich länger darüber nachdenke, hast du vollkommen Recht.
Hab jetzt den Quellcode ersetzt und GetWindowText mit SetWindowtext ausgetauscht. Wieso war ich zu dem Zeitpunkt krank, als wir die Sachen durchgenommen hab?
Okay, im Hauptdialog hab ich jetzt keine Probleme mehr.
void CZinseszinsrechnungDlg::OnzuFenster2() { char str[100]; UpdateData(true); m_anfangskapital.GetWindowText(str, 100); hole_anfangsk(atof(str)); m_laufzeit.GetWindowText(str, 100); hole_jahr(atoi(str)); m_zinssatz.GetWindowText(str, 100); hole_zsatz(atof(str)); Fenster2 dlg; dlg.DoModal(); EndDialog(IDOK); }Nur im zweiten Fenster mit der Übernahme. Nein, keine Fehlermeldung.
Viel mehr übergibt er nicht die Daten. Woran könnte das liegen? Würde mal jemand den Quellcode überfliegen?BOOL Fenster2::OnInitDialog() { CDialog::OnInitDialog(); char str[100]; sprintf(str, "%10.2lf", gib_anfangsk); m_anfangskapital.SetWindowText(str); sprintf(str, "%10.2lf", gib_jahr); m_laufzeit.SetWindowText(str); sprintf(str, "%10.2lf", gib_zsatz); m_zinssatz.SetWindowText(str); UpdateData(false); return true;
-
Dieser Thread wurde von Moderator/in HumeSikkins aus dem Forum C++ in das Forum MFC (Visual C++) verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.
-
Das mit den globalen Variablen ist ein schlechter Stiel in C++. Übernimm einfach die Variablen in deine Klasse Fenster2.
im Header von Fenster2:
class CFenster2 :public CDialog { ... public: double anfangsk; double zsatz; int jahr; ... }void CZinseszinsrechnungDlg::OnzuFenster2() { char str[100]; UpdateData(true); Fenster2 dlg; m_anfangskapital.GetWindowText(str, 100); dlg.anfangsk = atof(str)); m_laufzeit.GetWindowText(str, 100); dlg.jahr = atoi(str)); m_zinssatz.GetWindowText(str, 100); dlg.zsatz = atof(str)); dlg.DoModal(); EndDialog(IDOK); }BOOL Fenster2::OnInitDialog() { CDialog::OnInitDialog(); char str[100]; sprintf(str, "%10.2lf", anfangsk); m_anfangskapital.SetWindowText(str); sprintf(str, "%10.2lf", jahr); m_laufzeit.SetWindowText(str); sprintf(str, "%10.2lf", zsatz); m_zinssatz.SetWindowText(str); UpdateData(false); return true; }So sollte es gehen. UpdateData wird nur benötigt, wenn Du Membervariablen auf deine Controlls hast (zB: CString auf ein CEdit-Control).
Gruß Matthias