Avatar billede dejbjerg Nybegynder
30. oktober 2001 - 15:01 Der er 7 kommentarer og
1 løsning

CListBox::ResetContent() - ASSERT fejl

Jeg er ved at lave mit første rigtige MFC program - et simpelt regnskabsprogram - og der er noget som driller.

Jeg har lavet et view, som indeholder en Form, som igen indeholder en ListBox (m_ctlList).

I IndBilagView.h er m_ctlList defineret som:
public:
    //{{AFX_DATA(CIndBilagView)
    enum { IDD = IDD_INDBILAG };
    CListBox    m_ctlList;
    int        m_nBilagnr;
    (....)


I IndBilagView.cpp har jeg overloaded OnInitialUpdate til:

void CIndBilagView::OnInitialUpdate()
{
    m_ctlList.ResetContent();    // Det er her den er gal

    CBilagsliste& Bilagsliste = GetDocument()->m_Bilagsliste;
    POSITION pos = Bilagsliste.GetHeadPosition();
    while(pos)
    {
        CBilag* pBilag = Bilagsliste.GetNext(pos);
        FoejBilagTilListBox(pBilag);
    }
}

Når jeg skifter til mit view får jeg følgende meddelse:
REGNSKAB forårsagede en undtagelse 03H i modul MFC42D.DLL på adressen 0157:5f484d3b.
Indhold af registrene:
(...)

Hvis jeg vælger ignorer i dialogboxen kommer mit view frem som planlagt og programmet fortsætter.

Hvis jeg vælger forsøg igen kommer jeg ud i debuggeren, som stopper ved denne linie i \"Inlines for AFXWIN.H (part 2)\":
_AFXWIN_INLINE void CListBox::ResetContent()
    { ASSERT(::IsWindow(m_hWnd)); ::SendMessage(m_hWnd, LB_RESETCONTENT, 0, 0); }

De tre sidste kald i callstacken er:
CListBox::ResetContent() line 675 + 46 bytes
CIndBilagView::OnInitialUpdate() line 36
CMainFrame::VaelgView(unsigned int 32775) line 144 + 16 bytes
dvs. CListBox::ResetContent() er det kald, der forårsager fejlen eller rettere så er det ASSERT(::IsWindow(m_hWnd));

Hvorfor, hvad er der galt??
Avatar billede wisen Nybegynder
30. oktober 2001 - 15:04 #1
Det fordi at du kalder ResetContent, før m_ctlList har fået dens windowhandle...
Avatar billede wisen Nybegynder
30. oktober 2001 - 15:07 #2
Prøv at ligge det over i CIndBilagView::OnUpdate...
Avatar billede dejbjerg Nybegynder
30. oktober 2001 - 15:31 #3
wisen> Det virker, men jeg er ikke sikker på jeg forstår hvorfor. Hvad hvis nu jeg gerne vil have det i OnInitialUpdate? OnUpdate bliver kaldt flere gange, mens OnInitialupdate kun bliver kaldt en gang - tror jeg?

Du har sendt kommentarer - ikke svar - send mig et svar, så du kan få dine point. Du får dem også selvom du ikke gider at svare på det sidste her.



Avatar billede dejbjerg Nybegynder
30. oktober 2001 - 15:32 #4
Tak for svaret - iøvrigt.
Avatar billede wisen Nybegynder
30. oktober 2001 - 15:34 #5
Ja, OnInitialUpdate bliver kaldt i forbindelse med at Viewet bliver tilknyttet til et Document, altså een gang; mens OnUpdate bliver kaldt når dokumentet bliver ændret. Du kan også kalde \"UpdateAllViews\", for at opdatere...

/Wisen
Avatar billede wisen Nybegynder
30. oktober 2001 - 15:39 #6
Ja, selv tak :)
Avatar billede dejbjerg Nybegynder
30. oktober 2001 - 15:46 #7
Tak!

void CIndBilagView::OnInitialUpdate()
{
    CFormView::OnInitialUpdate();//løser også problemet

    m_ctlList.ResetContent();
    CBilagsliste& Bilagsliste = GetDocument()->m_Bilagsliste;// Snedigt!!
    POSITION pos = Bilagsliste.GetHeadPosition();
    while(pos)
    {
        CBilag* pBilag = Bilagsliste.GetNext(pos);
        FoejBilagTilListBox(pBilag);
    }
}
Avatar billede wisen Nybegynder
30. oktober 2001 - 15:47 #8
Jep, men igen det bliver kun kaldt een gang; Så hvis du vil opdatere viewet når dokumentet bliver opdateret, skal det ligge i OnUpdate...
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester