Pointer auf Element eines nicht modalen Dialogs



  • Hallo zusammen! Ich hätt da mal ne Frage:
    Ich hab eine Anwendung, die mir ein Dialogfenster öffnet. Dieses enthält eine Liste. Bisher war es so gehandhabt, dass der Dialog modal angezeigt wurde. Um die Liste füllen zu können, wurde in OnInitDialog ein Pointer auf ((CListBox*)GetDlgItem(IDC_LISTE)) gesetzt, der global definiert ist.
    Jetzt wollte ich das ganze auf nicht modal umstellen und habe Create und ShowWindow benutzt. Dabei hab ich aber andauernd Fehlermeldungen bekommen, die darauf hindeuten, dass die Liste nicht richtig instanziert wurde. Ich hab das Setzen des Pointers dann in die OnShow ausgelagert, ging immer noch nicht. Dann hab ichs aus der Hauptanwendung mit einem Pointer auf das Dialogfenster versucht und darüber den Pointer auf die Liste gesetzt. Nichts hat funktioniert. Und dann hatte ich keine Lust mehr und hab den Pointer entfernt und greife nur noch über GetDlgItem auf die Liste zu. Und siehe da, keine Probleme! Woran kann das liegen?



  • Hi,

    ich kann dir leider auch nicht sagen woran das liegt, aber ich hatte das selbe Problem auch vor ein paar Wochen. Bei mir gings um ein FormView, in dem ich als Member einen Pointer auf ein CListCtrl gespeichert hatte.

    Ich hatte dann eine Funktion mit der ich verschiedene Werte in das ListControl eintrage, und beim ersten Aufruf der Funktion den Pointer initialisiere:

    if(m_pListCtrl == NULL)  //wurde im Konstruktor auf NULL gesetzt
        m_pListCtrl = GetDlgItem(...)
    
    m_pListCtrl->InsertItem(...)
    ...
    

    Dort hatte ich dann das Problem, dass der erste Aufruf der Funktion problemlos klappte, alle weiteren jedoch zu ASSERT-Fehlern führten. Hab dann mal als Test das if(...) rausgenommen, so dass das GetDlgItem jedes mal aufgerufen wird, und dann funktionierte alles! (also genau wie bei dir)

    Per Debugger habe ich dann herausgefunden, dass in m_pListCtrl jedes mal eine andere Adresse stand!?! 😕
    (Es war nicht jedes mal eine andere Adresse, und eigentlich waren es auch immer nur 2 Adressen, zwischen denen gewechselt wurde)

    Wie gesagt, es funktioniert jetzt auch, mich würde es aber ebenfalls interessieren woran das liegt...

    Gruß Brainiac

    PS: Der Formview wurde bei mir ab und zu versteckt und wieder angezeigt (SW_SHOW <-> SW_HIDE), kann das der Grund sein? Es war auch nach dem Wiederanzeigen des Views oft die gleiche Adresse, ich konnte keine Regelmäßigkeit feststellen.



  • Welche Fehlermeldung kam denn?



  • Er hat bei InsertItem auf den ASSERT(IsWindow(m_hWnd)) gezeigt. Was ja logisch ist, wenn in m_pListCtrl die falsche Adresse zum Control steht.

    Das seltsame ist ja nur warum sich die Adresse des Controls ändert?!?



  • Vor kurzem hatten wir hier im Forum einen gleich gelagerten Fall, den ich bis jetzt noch nicht richtig verstehe, vor allem, weil es gemäß MSDN auch anders gehen müsste:
    http://www.c-plusplus.net/forum/viewtopic-var-t-is-149366-and-postdays-is-0-and-postorder-is-asc-and-start-is-10.html

    Hier lag das Debugger-Problem auch bei der winocc.cpp bei

    ASSERT(::IsWindow(m_hWnd));
    

    Durch Beschaffen eines Handles mit GetSafeHwnd() und Anwenden der Funktion in WinAPI-Stil gelang es, den Punkt zu überwinden.

    CRect myRect;
    GetClientRect(&myRect);
    HWND hWnd = m_List1.GetSafeHwnd(); //Wir beschaffen uns ein gültiges Handle!
    ::MoveWindow(hWnd, myRect.left, myRect.top, myRect.Width(), myRect.Height(), TRUE);
    

    Aber wie gesagt, laut MSDN hätte es auch einfacher gehen müssen.


Anmelden zum Antworten