CListCtrl::InsertItem() fail.

I am trying to insert some strings into a list control(report type) and when I do the call to
InsertITem, I get the following error : "Access violation". I have two classes for two views
in a splitter window. Why does the function call crashes?, Am I doing something wrong?
Please HEEEEEELP!!!!.

// Class A
MyClass A : public CFormView
{
    public:
            void         FilltheList();
            CListCtrl m_listControl;
}

// In the Implementation file ....
void FilltheList()
{
      // tried two ways and they both failed
      m_listControl.InsertItem(&lvitem);
      m_listControl.InsertItem(offset, string);
}

//Class B
MyClassB : public CFormView
{
      protected:
          void GetProject();
}

//Implementation file
void GetProject()
{
     MyClassA* ptrclassA;

     ptrclassA->FilltheList();
}
jhromeroAsked:
Who is Participating?
 
mweagleCommented:
There are three different things which I think might cause this:

(1) You should make sure that you set the number of columns (InsertColumn(nCol, title)) in the list before trying to insert anything.  I usually put this in CFormView::OnInitialUpdate

(2) You can't insert anything until the list control window actually exists.  Therefore, you should check this condition before inserting items.  I usually put a FillTheList function in CFormView::OnUpdate and if m_cListCtrl.GetSafeHwnd() == NULL, I skip it.

(3) Here is some code I use to insert items.  I'm not sure if you snipped stuff out of your fill function, but this has worked for me.

      LV_ITEM item;
      item.mask = LVIF_TEXT;       // Only care about the text
      item.iSubItem = 0;           // Column 0
        item.pszText = "Insert Me";

      m_cListCtrl.InsertItem(&item);
0
 
mikeblasCommented:
When reporting an access violation, it's imperative to provdie a stack trace. You need to be initializing that structure before you send it to the control; a mistake there, or an incorrect initialization, is the most likely cause of your problem.

Why didn't you provide the code you used to initialize the structure?  You don't even show the declaration!  Why

Since the reported symptom was an access violation and not an assertion, mweagle's #2 is the wrong answer. MFC's CListCtrl::InsertItem() implementation ASSERTs() on the window handle being valid before trying to send the insertion message to the control. If the window didn't exist, the ASSERT would fire.

.B ekiM




0
 
mikeblasCommented:
The code you've posted is obviously not the code you're really using because it is rife with syntax errors; the code you show isn't syntactically correct. In fact, it's completely usesless because we can't decide what's an intentional error and what's not.

For example, you coded this:

void GetProject()
{
   MyClassA* ptrclassA;
   ptrclassA->FilltheList();
}

but how do you initialize ptrclassA? You can't just call a member function through a pointe that's not pointing at anything.

.B ekiM


0
 
mweagleCommented:
I agree with you Mike in that you can't tell what is causing the problem since the posted code is invalid ("snipped stuff").  However, since his ultimate goal was to get items into the list, I tried to provide some ideas on how to accomplish this, even if they didn't directly address the violation.  Someday I'll get the hang of this...unfortunately that day is not today :(
0
 
jhromeroAuthor Commented:
Hi, sorry about not providing more info., but I just wanted to keep it short.  At any rate, your second suggetion makes sense to me.  Below is the actual code:

The child window is a splitter. One side contains the list control and the other side
contains a set of Edit controls (CinputView).

// Implemetation of CInput:public CFormView
void CInputView::GetFiles()
{
    CStdioFile   fileStr;   // store the name of the fiel
    CString      pString; // store each line
    int entries;

    TRY
    {
        fileStr.Open(m_projectPath, CFile::modeRead);
        TRACE1("The name of the file is %s\n",
                    fileStr.GetFileName());
    }
    CATCH (CFileException, e)
    {
        if (e->m_cause == CFileException::fileNotFound)
        {
            TRACE0("Unknown exception reading file!\n");
            throw;
        }
        e->Delete();
    }
    END_CATCH
   
    // Get a pointer to the list control
    CFileListCtrl*  ptrList;

    entries = 0;
    while (fileStr.ReadString(pString)!= NULL)
    {
        if ( pString.Find("[State]") != -1)
        {
            TRACE1("The string found is : %s\n", pString);
            break;
        }
        //Insert items into the list control box
        entries++;
        ptrList->FillListCtrl(entries);
    }

}

//===============================================
//                 Header file
//===============================================
class CFileListCtrl : public CFormView
{
protected:
      CFileListCtrl();           // protected constructor used by dynamic creation
      DECLARE_DYNCREATE(CFileListCtrl)

// Form Data
public:
      //{{AFX_DATA(CFileListCtrl)
      enum { IDD = IDD_LIST_DLG };
      CListCtrl         m_listControl;
      //}}AFX_DATA

// Attributes
public:

// Operations
public:
      void FillListCtrl(int);

// Overrides
      // ClassWizard generated virtual function overrides
      //{{AFX_VIRTUAL(CFileListCtrl)
      public:
      virtual void OnInitialUpdate();
      protected:
      virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support
      //}}AFX_VIRTUAL

// Implementation
protected:
      virtual ~CFileListCtrl();
#ifdef _DEBUG
      virtual void AssertValid() const;
      virtual void Dump(CDumpContext& dc) const;
#endif

      // Generated message map functions
      //{{AFX_MSG(CFileListCtrl)
            // NOTE - the ClassWizard will add and remove member functions here.
      //}}AFX_MSG
      DECLARE_MESSAGE_MAP()
};

//------------ Implementation of the CFileListCtrl -------------------------------
void CFileListCtrl::OnInitialUpdate()
{
      CFormView::OnInitialUpdate();

    TCHAR   rgtsz[4][10]={_T("Name"), _T("Owner"),
                          _T("Modified"), _T("Size")};

    CRect       rect;
    LV_COLUMN   lvcolumn;
    int i;

    m_listControl.GetWindowRect(&rect);

    for (i=0; i<4; i++)
    {
        lvcolumn.mask = LVCF_FMT|LVCF_SUBITEM|
                        LVCF_TEXT|LVCF_WIDTH;
        lvcolumn.fmt =LVCFMT_LEFT;
        lvcolumn.pszText= rgtsz[i];
        lvcolumn.iSubItem = i;
        lvcolumn.cx = rect.Width()/4;
        m_listControl.InsertColumn(i, &lvcolumn);
    }
      
}

void CFileListCtrl::FillListCtrl(int numOfItems)
{
    LPTSTR  lstItem = "Hello";
    LV_ITEM lvitem;
    int item;

    for (item=0; item < numOfItems; item++)
    {
        lvitem.mask = LVIF_TEXT;
        lvitem.iItem = item;
        lvitem.pszText = lstItem;
        m_listControl.InsertItem(&lvitem);
    }

}

0
Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.

All Courses

From novice to tech pro — start learning today.