Steuerelement (Edit Control) immer up to date halten, funktioniert aber nicht bei mir
-
Kannst Du das SetWindowText() etwas ausführen,w ie ich das in meine Schleife nun genau einsetzte.
Vielen Dank!
-
mach ich was falsch? Ich verändere mit dieser Funktion nur den Namen des Dialogfeldes!
-
Ja
die Fkt. SetWindowText(..) ändert den Text eines CWnd-Objektes (Dialogfelder, Fenster, Eingebafelder, Listboxen... gehören alle dazu)
du mußt natürlich das richtige Objekt ansprechen. In deinem Fall wäre es das Eingabefeld. Du kannst das Objekt direkt ansprechen, wenn du zu dem Eingabefeld eine Membervariable vom Typ Control (mit dem Assi, m_cDeinEingabefeld) erstellt hast, nämlich mitm_cDeinEingabefeld.SetWindowText(..);
Oder du beschaffst dir das Objekt mit:
GetDlgItem(ID_DEINEINGABEFELD)->SetWindowText("hier den Text eintragen");
Das sieht also dann so aus:
void CSW_GraphDlg::OnBnClickedStart() { // TODO: Add your control notification handler code here InitGPIB(); set_analyzer(m_freq,m_ref_level); for(int r=1;r<20;r++){ //MessageBox(m_test); Send("mka?"); Receive(); sscanf(DataBuf,"%f", &m_dbm); //!!!! GetDlgItem(ID_DEINEINGABEFELD)->SetWindowText("hier den Text eintragen"); } }
Gruß
-
Also ich hab nun das Objekt direkt angesprochen, wie Du meintest...
mit GetDlgItem(IDC_MKA)->SetWindowText(test);
wenn ich nun die schleife 20 mal durchlaufen hab ich trozdem wieder nur den letzten wert drin bzw. wurde nie ein andere anzeigt, einfach immer nur der letzte. wenn ich eine unendliche schleife erzeugt habe ich nie einen wert drin. Ich müsste das werte in der variable "online" in dem Feld sehen.
Hab echt keine Ahnung was ich mehr machen soll...
void CSW_GraphDlg::OnBnClickedStart()
{
// TODO: Add your control notification handler code here
InitGPIB();
UpdateData(TRUE);
set_analyzer(m_freq,m_ref_level);
char test[20]="";
//for(int r=0;r<10;r++){
while(1==1){
Send("mka?"); //abfrage routine
Receive(); //lese routine->DataBuf mit Wert kommt zurück
sscanf(DataBuf,"%f", &m_dbm); //brauche nur zahl
sprintf(test ," %.2f " , m_dbm); //test mal das
GetDlgItem(IDC_MKA)->SetWindowText(test);
//UpdateData(FALSE);
}}
-
Hab auch die andere Variante ausprobiert. KOmme immer auf das selbe Ergenis, immer den letzte Wert, dabei sollte ich kontinuierlich die Werte haben.
void CSW_GraphDlg::OnBnClickedStart() { // TODO: Add your control notification handler code here InitGPIB(); UpdateData(TRUE); set_analyzer(m_freq,m_ref_level); char test[20]=""; float m_dbm; for(int r=0;r<10;r++){ //while(1==1){ Send("mka?"); Receive(); sscanf(DataBuf,"%f", &m_dbm); sprintf(test ," %.2f " , m_dbm); m_ldbm.SetWindowText(test); //GetDlgItem(IDC_MKA)->SetWindowText(test); //UpdateData(FALSE); } }
-
Auch das neuzeichen einen Fenstern wird bei Codeausführung unterbrochen.
Dh.:
Wärend der ausführung deines Codes kann dein Fenster keine Messages entgegennehmen da es in einem Singlethreadprogramm nur möglich ist eine Codezeile nach der anderen auszuführen.Es werden zwar Messages an dein Programm zum Neuzeichen gesendet aber du fragst sie nicht ab.
Wenn du in einem Dialog nichts machst nimmt die MessageLoop des Dialogs die Messages für dich entgegen. z.B. WM_Timer,Buttonklick, etc.
Da du hier aber eine Schleife hast und in dieser die Messsages nicht selbst entgegennimmst wird es erst nach folenden der Schleife durchgeführt und daher kommt es, daß du deine Eingabe erst zum Schluss siehst.
-
Verflixt, ich hätte gedacht das funktioniert dann.
Na gut, dann mußt du alles vieeel komplizierter machen. Auf jeden Fall muß die while-Schleife aus deine OnBnClickedStart-Fkt. raus und etwas Rechenzeit freimachen, wie oben beschrieben.
Also, du köntest beim Knopfdruck einen Arbeitsthread starten, der die besagte while-Schleife enthält und immer Nachrichten an dein Dialog schickt (am besten erstmal Bücher lesen)
Oder: beim Knopfdruck wird ein Timer erstellt SetTimer() (mußt mal irgendwo nachlesen, mit 10 millisekunden oder so). In deinem Dialog erstellt du eine Nachrichtenbehandlung für ein Timerereignis: CSW_GraphDlg::OnTimer(..). In diese Funktion fügst du den Inhalt deiner while-Schleife ein, dann gehts. Sobald du erkennst das alles eingelesen wurde (bzw nach den 19 Schleifendurchläufen) stoppts du den Timer: StopTimer()
Also so:void CSW_GraphDlg::OnBnClickedStart() { // TODO: Add your control notification handler code here InitGPIB(); set_analyzer(m_freq,m_ref_level); SetTimer(10); //ich glaube so hieß die Funktion //die Anzahl der Timerereignisse mitzählen AnzahlTimerEreignisse=0; } } void CSW_GraphDlg::Timer() { // TODO: Add your control notification handler code here //hier steht jetzt das was vorher in der while-Schleife steht Send("mka?"); Receive(); sscanf(DataBuf,"%f", &m_dbm); //!!!! UpdateData(FALSE); //und hier!!! AnzahlTimerEreignisse++; //Abbruchbedingung if (AnzahlTimerEreignisse>=19) StopTimer(); }
-
Was kann ich elegant dagegen tun? Ich bin relativ neu in der Visual C++ Welt. Ist das nun grosse Sach oder sehr komplex das so hinzurkiegen wie ich mir das Vorstelle? Ich brauche ienfahc die aktuellen Werte im Fenster... Ich würd emich sehr über Vorschläge freuen! Danke!
-
Also ich hab so mal etwas modifiziert eingefügt, aber das Problem ist das StopTimer(); nicht da ist. meintest Du, dass ich die sleber schreiben soll?
-
Das mit dem Timer ist schon die einfachste und eleganteste Lösung. Hab mich auch schon mal mit sowas rumgeärgert und zum Schluss sowohl einen Arbeitsthread (für eine lange Berechnung) als auch einen Timer (für eine Fortschrittsanzeige) verwendet.
-
hab mich geirrt, es muß KillTimer(nIDEvent) heißen. nIDEvent wird von SetTimer(..) zurückgegeben um den Timer zu identifizieren.
-
Ok, also ich hab das mal etwas angepasst eingefügt, aber ich verstehe das mit der Bahandlung der Fkt Timer nich ganz, die müsste doch automatisch gestartet werden. Ich hab sie jetzt manuell inzugefügt, oder brauche dafür eine separate Behandlungsroutine?
void CSW_GraphDlg::OnBnClickedStart() { // TODO: Add your control notification handler code here InitGPIB(); UpdateData(TRUE); set_analyzer(m_freq,m_ref_level); //SetTimer(10); //ich glaube so hieß die Funktion SetTimer(1, 10, 0); //die Anzahl der Timerereignisse mitzählen AnzahlTimerEreignisse=0; } void CSW_GraphDlg::Timer() { // TODO: Add your control notification handler code here //hier steht jetzt das was vorher in der while-Schleife steht Send("mka?"); Receive(); float m_dbm; sscanf(DataBuf,"%f", &m_dbm); //!!!! UpdateData(FALSE); //und hier!!! AnzahlTimerEreignisse++; //Abbruchbedingung if (AnzahlTimerEreignisse>=19) KillTimer(1); }
-
Einfach und funktionen.
UpdateWindow();
In deine SchleifeSpäter solltest du dich aber mit Softwaredesig beschäftigen und Oberfläche von Funktion getrennt Designen da UpdateWindows in einer Schleife nicht notwendig und sehr unschön ist.
[ Dieser Beitrag wurde am 13.01.2003 um 15:34 Uhr von Unix-Tom editiert. ]