Anständige Lösung für OnTimer gesucht - Laufschrift in MFC?



  • must halt ne abfrage machen, das erst dann der Text in der Liste geändert wird, wenn er unterschiedlich zum vorherigen eintrag ist.

    und While 1+1 ist jetzt nicht unbedingt eine sinnvolle bedingung
    wäre eher eine Boolische Member Variable die du von auserhalb des Threads steuern kannst.



  • @rT!f@Ct schrieb:

    must halt ne abfrage machen, das erst dann der Text in der Liste geändert wird, wenn er unterschiedlich zum vorherigen eintrag ist.

    und While 1+1 ist jetzt nicht unbedingt eine sinnvolle bedingung
    wäre eher eine Boolische Member Variable die du von auserhalb des Threads steuern kannst.

    HM.. naja auf die schnelle find ich keine sinnvolle bedingung.. 🙂

    Also ich hab jetzt folgende Abfrage gemacht, respektive wie geht das denn mit GetWindowText?

    CListCtrl *pListCtrl = (CListCtrl*)pParam; 
       if(!pListCtrl->GetWindowTextA() == s)
       {
       pListCtrl->SetWindowTextA(s);
       }
       else
       {
    	   //Rien ne vas plus!
       }
    

    Ich muss ja von dem erneut gelesenen Wert überprüfen ob der schon drin steht, also in "s". Mit GetWindowText möcht ich eigentlich den vorhandenen Text auslesen. Soweitsogut, wäre da nicht wieder die Fehlermeldung:

    1>c:\users\wolf\documents\visual studio 2008\projects\scmt\scmt\hauptdlg.cpp(205) : error C2661: 'CWnd::GetWindowTextA' : no overloaded function takes 0 arguments
    

    Und frag mich nicht wieso immer A kommt.. egal ob Postmessage, SetWindowText egal was, überall kann ich nur das mit dem A am ende auswählen.. entferne ich das A erhalte ich zwar keine FEhlermeldung, aber wird trotzdem als bsp. GetwindowtextA behandelt..



  • Du solltest dir mal die Member der Klasse CListCtrl anschauen. Set- und GetWindowText sind nicht unbedingt die geeigneten Funktionen und den Inhalt deines ListCtrl auszulesen.

    Und nebenbei eine Sinnvolle Variable währe eine Boolsche Membervariable deine Klasse die du vor dem start deines Threads auf True setzt und beim beenden deines Dialoges auf False damit der Thread auch Beendet wird wenn dein Dialog geschlossen wird, sonnst knallt es da eventuell.



  • Hm jo ok.. mag sein, allerdings stellte ich jetzt fest dass es ein STATIC-Text feld ist und kein Listenfeld?? ... Komisch komisch 🙂 Oder bin ich nun falsch? Sonst würde ja ListCtrl nicht funktionieren...

    Und wenn GetWindowTextA keine richtige variante wäre.. was dann?
    Hab schon GetItemData o.Ä versucht, null Chance,



  • CTecS schrieb:

    Du solltest dir mal die Member der Klasse CListCtrl anschauen.

    LOL hast recht, is mir jetzt nicht aufgefallen. 🙄
    spätestens aber mit pListCtrl->GetWindowText 😮

    Wolf1985 schrieb:

    HM.. naja auf die schnelle find ich keine sinnvolle bedingung.. 🙂

    hudeln bringt nix, dadurch passiern dir ja die fehler pListCtrl->SetWindowText/GetWindowText.

    den Letzten eintrag in der Liste bekommst du mit

    int iCount = pListCtrl->GetItemCount( )-1;
    
    CString sText =  pListCtrl->GetItemText( iCount , 0);
    

    Wolf1985 schrieb:

    Und frag mich nicht wieso immer A kommt

    bin mir jetzt nicht sicher, aber ich halte das fürn bug von vc.
    SetWindowTextA ist die Ansi Version und SetWindowTextW ist die Unicode Version von SetWindowText je nach Kompiler einstellung ist
    SetWindowText = SetWindowTextA;
    bzw.
    SetWindowText = SetWindowTextW;

    wenn du das A bzw. das W der jeweiligen funktion wegläst, schadet das nix und du hast in jedem fall die richtige funktion.

    [NEW EDIT]
    mit GetItemData kannst du dir werte holen die NICHT SICHTBAR an das jeweilige element der Liste gehängt wurden. diese must du allerdings mit SetItemData vorher setzen.

    bist du dir denn sicher, das du deine anderen versuche, an das Listenelement zu kommen, richtig ausgeführt hast 😕


  • Mod

    @rT!f@Ct schrieb:

    bin mir jetzt nicht sicher, aber ich halte das fürn bug von vc.

    Wieso ein Bug? Alle Vorkommen von GetWindowtext werden in GetWindowTextA bei einer MBCS und in GetWindowTextW bei einer Unicode Version getauscht.
    Das gilt eben für alle Vorkommen dieses Identifiers!

    Entsprechend gilt dasauch für Memberfunktionen in den Klassen wie bei CWnd::GetWindowText!



  • Ich war die ganze Zeit falsch.. 🙂 LOL

    Grund: Das angebliche Listenfeld war ein Textfeld! *g* hab es jetzt mit einem Listenfeld ersetzt. Allerdings wenn ich da nun SetWindowText("Test"); mache, dann wird nichts angezeigt, respektive der Text ist ev weiss??

    Langsam verwirr ich mich glaub selbst... 😃



  • Wie schon mehrfach gesagt, wenn du ein Listenfeld hast, wobei es wieder drauf an kommt was für eins, solltest du doch in der lage sein die Member der entsprechenden Klasse in der MSDN anzuschauen und dir die entsprechenden Fuinktion Raussuchen zu können. SetWindowText und GetWindowText sind nun mal nicht die alles heilenden Methoden um in jeden Objekt scvhreiben bzw. Lesen zu können.

    An sonsten schau dir Beispiele an wie das gemacht wird im Netz findest du genügend dazu. Solange wie du selbst nicht einmal weisst ob das nun ein CStatic, CListCtrl oder CListBox oder was auch immer das ist wird dir nicht wirklich jemand helfen können



  • Hi Martin,
    du hast mich glaub ich falsch verstanden, das mit dem bug beziehe ich darauf das SetWindowTextA/W in der liste steht, die aufpopt, wenn ich eine Klassenvariable habe und den punkt oder den zeiger darauf anwende.
    Bei VS 6 stand SetWindowTextA/W nicht in dieser list.



  • Da CListCtrl von CWnd abgeleitet ist und CWnd Methoden für Get/SetWindowText enthält, zeigt die Codevervollständigung diese natürlich auch für CListCtrl an. Nur dass diese dann eben nicht das machen, was man erwartet, weil die Fensterklasse sich anders verhält.



  • Hab jetzt ein Editfeld genommen. Allerdings bekomm ich beim Programm folgende Warnmeldung:

    Hier der Code:

    UINT CHauptDlg::WarnList(LPVOID pParam)
    {
    	//Aktuelle Warnungen laden und im Editfeld anzeigen
    	CString somecode, s;      
         CInternetSession session("Warnlist",1,INTERNET_OPEN_TYPE_PRECONFIG);
    
         CStdioFile* pFile = NULL;   
    	 CString strUrl("http://www.nfws.ch/inc/warnlist.php");
    do
    {
    
       try  
       {  
               pFile = session.OpenURL(strUrl,1,INTERNET_FLAG_TRANSFER_BINARY,NULL,0);
    
            if(pFile)  
            {           
                while (pFile->ReadString(somecode) != NULL)  
                {  
                    s = s + somecode;  
                }  
                pFile->Close();  
            }       
       }  
       catch (CInternetException* e)  
       {        
            e->Delete();
            session.Close();
            CloseHandle(session);  
       }
    
       CEdit *pEdit = (CEdit*)pParam;
       CEdit *pEdit = (CEdit*)pParam;
       int iCount = pEdit->GetLineCount()-1;
    
       CString sText =  pEdit->GetWindowTextA ( iCount , 0);
       if(!sText == s)
       {
       pEdit->SetWindowText(s);
       }
    
       else
       {
    	   //RIEN NE VAS PLUS
       }
       pEdit->SetWindowText(s);
    
    }while(1+1);
    
    return 0;
    }
    

    Was muss ich jetzt beim Editfeld verwenden?? Beim ListCtrl war die Variable sText jeweils immer leer, hat also nicht geklappt. Beim EditCtrl werd ich auch aus der MSDN nicht so ganz schlau weil GetWindowText (die Fehlermeldung kommt) entweder hier bei mir nicht constchar ist oder sonst keine 0 Parameter akzeptiert..


  • Mod

    Wie wäre es einfach mal mit MSDN lesen?
    CEdit::GetWindowText nimmt als ersten Parameter ein CString oder einen LPSTR und als zweiten die Länge und es gibt nur im zweiten Fall die Länge zurück.
    http://msdn.microsoft.com/de-de/library/db50wx7h.aspx



  • Hab ich ja gelesen, genau das 🙂 Was mich trotzdem nicht weiter bringt.
    Hab es jetzt mal gelöst mit Clearen, denn anstatt der neue Text erneut angezeigt wird, wird er immer angehängt.

    CEdit *pEdit = (CEdit*)pParam;
       pEdit->SetWindowText(s);
       Sleep(5000);
       pEdit->SetSel(0,-1);
       pEdit->Clear();
       Sleep(5000);
    

    pEdit->Clear löst keine Reaktion aus und nichts wird gelöscht. 🙂

    EDIT:
    Gecleart wird, aber dann erscheint der Text erneeut mit Anghängsel!! Anstatt erneut zu laden! ... hm.. so ne kacke.. liegt das am Cache ? Wenn ja wie und wo kann der daktiviert werden ??
    lg
    Wolf


  • Mod

    Die Sleeps nützen gar nichts. Es wird keien Anzeige aktualisiert.
    Wenn kein Message Pump läuft wird auch kein WM_APINT ausgelöst.
    Insofern verstehe ich nicht was Dein Code soll.
    Er macht nicht mehr als SetWindowText("");


Anmelden zum Antworten