List Control anlegen und anzeigen lassen



  • Das Fenster wird mir ja angezeigt, nur ist meine List Control völlig leer, sprich die Methode, die ich bereits oben im Snippet erwänhte wird erst gar nicht aufgerufen. Ich weiß nicht, welchen Wert sie zurück gibt, da ich beim Breakpoint die meldung kriege: "The breakpoint will not currently be hit. No symbols have been loaded for this document." Funktioniert OnInitDialog() also gar nicht bzw. wird gar nicht aufgerufen? Muss ich diese Methode also auch irgendwo mit aufrufen?! Ach ja, wenn ich in OnInitDialog() meine Methode aufrufen will, wie beschrieben, die mein List Control Element mit Daten füttert, kriege ich ne Fehlermeldung nach dem beenden des Debugmodus. mit Spy++ kenne ich mich nicht aus, aber wieso sollte mit meiner bisherigen Lösung (auf das CRect) bezogen nicht funktionieren? Ich habe meine Variante aus einem bestehenden und funktionierenden Projekt übernommen.

    void CDieAndereKlasse::OnOptionShowLampenFaktor()
    {
    	WindowFactorsShowDlg* wFSDlg= new WindowFactorsShowDlg();
    	wFSDlg->DoModal();
    }
    

    das ist ein snippet aus der anderen Klasse in der ich halt ein Objekt der Dialogklasse anlege in der sich auch meine auszuführende Methode befindet.

    Items füge ich auch ein, hatte es bloß nicht mitaufgeführt.

    void WindowFactorsShowDlg::showWindowFactors()
    ....
    		std::stringstream buffer; // wird benötigt, da windowIter int-wert besitz
    		std::string ausgabeStr;
    
    		windowFactorsOutput.SetSelectedColumn(columnIter);
    		buffer << windowIter;
    		ausgabeStr = buffer.str();
    		buffer.str("");
    		windowFactorsOutput.InsertItem(windowIter,ausgabeStr.c_str());
    		ausgabeStr.erase(); // wird benötigt, da ausgabeStr mehrmals verwendet wird
    ....
    

    Ach ja, da fällt mir noch auf: kann ich die Methode erase überhaupt so auf meine String-Variable anwenden oder muss ich Werte eintragen, welche Bereiche gelöscht werden sollen?


  • Mod

    - Du bekommst mit Sicherheit eine Warnung weil Dein Objekt nicht korrekt zerstört wird.
    - Dein Code kann nicht gehen und ein Control anzeigen weil dazu gültige Koordinaten notwendig sind. Ist das so schwer?
    - Wenn Du eine Meldung bekommst, dass der Breakpoint nicht angelaufen werden kann, dann hast Du keine gültigen Debug Infos für Deine Exe.
    - Wenn Du Spy++ nicht kennst, dann lerne es kennen...



  • Martin Richter schrieb:

    Schau es Dir im Spy ++ an. Die Fensterkoordinaten Deines ctrlRect sind einfach undefiert. Das Fenster kann so nicht angezeigt werden. Gib dem Fenster korrekte Koordinaten und es geht.

    ➡

    DarthWaldee schrieb:

    CRect ctrlRect;
    windowFactorsOutput.Create(LVS_REPORT|LVS_SINGLESEL, ctrlRect, this, IDC_MYINPUTLIST);
    

    Ein ListCtrl ist auch ein Fenster. 😉



  • DarthWaldee schrieb:

    Ach ja, da fällt mir noch auf: kann ich die Methode erase überhaupt so auf meine String-Variable anwenden oder muss ich Werte eintragen, welche Bereiche gelöscht werden sollen?

    Kannst du machen. Damit löschst du den ganzen String. Es gibt auch die Methode empty. Siehe: http://msdn.microsoft.com/de-de/library/db438k92.aspx



  • _matze schrieb:

    DarthWaldee schrieb:

    Ach ja, da fällt mir noch auf: kann ich die Methode erase überhaupt so auf meine String-Variable anwenden oder muss ich Werte eintragen, welche Bereiche gelöscht werden sollen?

    Kannst du machen. Damit löschst du den ganzen String. Es gibt auch die Methode empty. Siehe: http://msdn.microsoft.com/de-de/library/db438k92.aspx

    Danke für den Tipp!

    Es klappt im Übrigen immernoch nicht so wie ich es gern hätte *g*
    Irgendwelche Fensterkoordinaten benötige ich glaube nicht. Die ListCtrl wird mir schließlich angezeigt und wie gesagt ist sie bloß leer.. momentan ist der code auch so korrekt. Ich muss jetzt also nur noch irgendwie korrekt meine Methode (showWindowFactors()) aufrufen, die meine List Control auch mit Daten füttert. Wenn ich dies in OnInitDialog(), tut sich nix. Wenn ich es über das Objekt "wFSDlg" mache, klappt es nicht.. Ich hab mir jetzt mal spy++ angesehen und komme damit nicht klar. Ich sollte vielleicht noch erwähnen, dass ich in C++ noch relativ unbefleckt bin und eigentlich aus der Java Welt komme. Wie dem auch sei: Ich vermute nun, dass OnInitDialog() vielleicht gar nicht aufgerufen wird, da, wie erwähnt, auch das aufrufen meiner methode in OnInitDialog() keinerlei Auswirkung auf meine ListControl hat. Muss der Aufruf der Methode OnInitDialog() manuell geschehen? Wenn ja, wo? Im Konstruktor?!

    Anbei noch ein Link von meinem List Control Fenster um zu beweisen, dass Sie doch angezeigt wird 😛
    http://de.tinypic.com/view.php?pic=e9ymvq&s=4

    Vielen Dank für Euer Verständnis 🙂



  • Sieht aus als wäre das ListCtrl kein Report.

    Normalerweise ist die View-Eigenschaft auf Icon gesetzt und da gibts keine Columns. Versuchs mal auf Report zu stellen

    lg
    Willie


  • Mod

    Aber nicht mit dem Code, denn Du gepostet hast!

    CRect ctrlRect;
        windowFactorsOutput.Create(LVS_REPORT|LVS_SINGLESEL, ctrlRect, this, IDC_MYINPUTLIST);
        windowFactorsOutput.ShowWindow(SW_SHOW);
    


  • OnInitDialog wird automatisch aufgerufen. Warum nutzt du nicht den Debugger? Setze einen Breakpoint, dann siehst du doch, ob die Methode angesprungen wird oder nicht. Oder hast du das in Java auch nicht gemacht? 😉

    Dein geposteter Code ist definitiv falsch. Martin hat dir die relevanten Stellen nochmal gepostet. Du deklarierst eine CRect-Variable, weist ihr aber keine Werte zu. Und diese undefinierte Variable übergibst du dann an Create, damit das Fenster (List Control) an diese (undefinierte) Stelle gesetzt wird. es leuchtet sir ein, dass das nicht richtig ist, oder? Ganz egal, ob du letztlich dein Control siehst oder nicht... Hast du denn wenigstens mal Martins Ratschlag beherzigt und das Rect versuchsweise gefüllt?



  • _matze schrieb:

    OnInitDialog wird automatisch aufgerufen. Warum nutzt du nicht den Debugger? Setze einen Breakpoint, dann siehst du doch, ob die Methode angesprungen wird oder nicht. Oder hast du das in Java auch nicht gemacht? 😉

    Dein geposteter Code ist definitiv falsch. Martin hat dir die relevanten Stellen nochmal gepostet. Du deklarierst eine CRect-Variable, weist ihr aber keine Werte zu. Und diese undefinierte Variable übergibst du dann an Create, damit das Fenster (List Control) an diese (undefinierte) Stelle gesetzt wird. es leuchtet sir ein, dass das nicht richtig ist, oder? Ganz egal, ob du letztlich dein Control siehst oder nicht... Hast du denn wenigstens mal Martins Ratschlag beherzigt und das Rect versuchsweise gefüllt?

    Debuggen tue ich grundsätzlich immer, aber bekam ich immer bei den Breakpoints die Meldung, dass diese nie erreicht werden. Der Grund hierfür war, dass unter dem Konfiguariontsmanager die release-konfiguration unter "Active Solution configuration" ausgewählt war. Habs jetzt wieder auf "Debug" umgestellt und kann normal debuggen. Vielen dank nochmals für die Hilfe! Der Rect teil war definitiv nicht korrekt bzw. nicht vollständig, allerdings hat sich das ganze relativiert, da VS2008 automatisch bei CListCtrl's die Create()-Methode aufruft und ich mich so damit nicht mehr beschäftigen muss. 🙂

    Gruß
    DarthWaldee



  • Debug-Informationen kann man in den Projekteinstellungen auch für die Release-Version einschalten, so dass du, denke ich, auch Breakpoints ansteuern kannst. Wann das Sinn macht, kann ich dir nicht sagen (zumal sich diese Optionen, glaube ich, mit den Compiler-Optimierungen beißen), ich wollte es nur der Vollständigkeit halber erwähnen...


Anmelden zum Antworten