CEdit-Controls "bearbeiten"

Michbeck1983

Mitglied
Hallo Leute,

habe folgendes Problem bzw. möchte folgendes machen (in Visual Studio .NET 2003):

Habe auf einem Dialog mehrere Edit-Controls. Alle haben jeweils eine Membervariable vom Typ CEdit, und eine Membervariable vom Typ float.
Ich möchte nun, dass der Benutzer in die Controls Zahlen eingibt, welche dann unten in einem separaten Edit-Control (welches der Benutzer nicht bearbeiten kann) die Werte zusammengezählt werden.

Leider weiß ich nicht wie ich das machen soll. Wenn ich die Werte a la
m_summary += m_value_1_float;
UpdateData(TRUE);
Setze, passiert gar nichts (die Variablen sind beide vom Typ float). Kann mir da jemand einen Tipp geben

Danke schon mal im voraus.
 
UpdateData(TRUE) überträgt die Daten der Controls in deine Membervariablen.
Du solltest UpdateData(FALSE) verwenden, da du die Daten der Membervariablen ja in deine Controls bringen willst.
Das überschreibt dir aber alle Werte in den Controls. Du solltest also zuerst ein UpdateData(TRUE) durchführen, dann die Berechung und dann UpdataData(FALSE).

Oder du holst dir nur die betroffenenen Controls mit GetDlgItem(...) und setzt die entsprechenden Werte direkt mit SetWindowText(...)
 
Wahnsinn - das funktioniert ja wunderbar - dankeschön :)

Komisch ist jetzt nur: die Felder werden mit 0 initialisiert. Wenn man eines der Felder anklickt und die Zahl darin ganz löscht, kommt auf einmal eine Meldung, dass man eine Zahl ausgeben soll (insofern komisch, weil mein ganzes Programm auf Englisch ist, die MessageBox kommt also nicht von mir).
 
So wie es aussieht berechnest du das jeweilige Ergebnis bei/nach Eingabe in ein einzelnes Feld.
Durch UpdateData() werden die noch "unbearbeiteten" Felder mit dem aktuellen Wert der Variable gefüllt, was ja vor einer Eingabe 0 ist.
Hier ist es sicher besser das Ausgabefeld "manuell" mit dem Ergebnis zu belegen, indem du SetDlgItemText() / SetWindowText() verwendest.


Die Fehlermeldung bei dir kommt durch die Überprüfung in der entspechenden DDX_... Methode in DoDataExchange(). dessen Aufruf durch UpdateData() initiiert wird (was bei Betätigen von OK auch passiert)

Wenn das nicht passieren soll, darfst du entweder die Membervariablen für die Zahlen nicht an die Controls binden (die Datenübernahme musst du dann selbst implementieren) oder du führst in DoDataExchange() eine Prüfung durch, ob das Feld leer ist und rufst die entsprechende DDX_.. Methode in diesem Fall nicht auf.

Dann kannst du das mit dem UpdateData(TRUE/FALSE) auch lassen wie es ist.
Um die Datenübernahme in DoDataExchange auszulassen überprüfst du
bei pDX->m_bSaveAndValidate=TRUE auf ein leeres Feld
bei pDX->m_bSaveAndValidate=FALSE auf 0 in deiner Variable.

Gruss
Dora
 
Das stimmt - ich habe auf meinem Dialogfeld mehrere Edit-Felder, in der der Benutzer Daten (float) eingeben kann. Diese sollen dann unten in einem gesicherten Feld als Summe angezeigt werden.

Zurzeit wird die Berechnung noch in der Funktion "OnEnChange***" vorgenommen - wobei dies sicherlich absolut falsch ist, das habe ich schon bemerkt, weil er die Berechnung bei jeder einzelnen Ziffer vornimmt.

Ideal wäre eine Funktion, die überprüft, welches Edit-Feld gerade den Fokus hat, und bei Verlieren des Fokusses die Berechnung vornimmt - nur habe ich bisher noch keine solche Funktion gefunden und konnte mich noch nicht dazu motivieren, eine selbst zu schreiben. Bei VB gibt es solche Funktionen bzw. Ereignisse - gibt es die auch bei VC
 
Es gibt die Message WM_KILLFOCUS und das MFC Pendant CWnd::OnKillFocus()
Das sollte dir weiterhelfen.

Gruss
Dora
 
Danke allen für eure Hilfe! :)

Ja, das mit der Message WM_KILLFOCUS habe ich (nach langem Suchen) in der MSDN auch herausgefunden, und jetzt es einwandfrei :)
 

Neue Beiträge

Zurück