Derived Combo Box
Raja Bhattacharjee -- raja@bhi.com
Tuesday, March 11, 1997
Environment: VC++ 4.2-flat, NT 4.0
I have derived a class MyComboBox from CComboBox to handle
SetDataItemPtr
for the items. I am using the combobox in many dialogs where I have to
set
the dataitem value to a CString object.
I have added a method SetCStringItem(index,CString) to MyComboBox
{
// allocate space in the heap (needs to be destroyed explicitely)
LPSTR pKeyVal = new TCHAR[pstr.GetLength()+1];
if (pKeyVal == NULL) return CB_ERR;
// copy the data to the ptr
strcpy(pKeyVal,pstr);
// set the data item
m_bDataSet = TRUE;
return (SetItemDataPtr(pIndex, pKeyVal ));
}
Now My problem is I am not finding the correct event to destroy the
items.
I have to use GetCount() and GetItemDataPtr() which
gives Assertion in destructor. I tried DestroyWindow(), OnClose(),
OnDestroy() none of them gets invoked before destructor. Can anyone
suggest me a way to do the cleanup ?
LeRoy Baxter -- lbaxter@transport.com
Friday, March 14, 1997
[Mini-digest: 2 responses]
The MSVC++ help system shows a CComboBox class member of
"DeleteItem". Override this function to delete your datapointers.
-----Original Message-----
From: Raja Bhattacharjee [SMTP:raja@bhi.com]
Sent: Tuesday, March 11, 1997 2:25 PM
To: mfc-l@netcom.com
Subject: Derived Combo Box
Environment: VC++ 4.2-flat, NT 4.0
I have derived a class MyComboBox from CComboBox to handle
SetDataItemPtr
for the items. I am using the combobox in many dialogs where I have to
set
the dataitem value to a CString object.
I have added a method SetCStringItem(index,CString) to MyComboBox
{
// allocate space in the heap (needs to be destroyed explicitely)
LPSTR pKeyVal = new TCHAR[pstr.GetLength()+1];
if (pKeyVal == NULL) return CB_ERR;
// copy the data to the ptr
strcpy(pKeyVal,pstr);
// set the data item
m_bDataSet = TRUE;
return (SetItemDataPtr(pIndex, pKeyVal ));
}
Now My problem is I am not finding the correct event to destroy the
items.
I have to use GetCount() and GetItemDataPtr() which
gives Assertion in destructor. I tried DestroyWindow(), OnClose(),
OnDestroy() none of them gets invoked before destructor. Can anyone
suggest me a way to do the cleanup ?
-----From: "Jason Healy"
I have managed to override the OnDestroy notification function, and
successfully
deleted the data I allocated. You must delete the data allocated before
calling the
base class implementation, which destroys the internal data, and therefor
your link to the
data allocated by you.
void CPtrComboBox::OnDestroy()
{
for (int nIndex = 0; nIndex < GetCount(); nIndex++)
delete[] (LPTSTR)GetItemDataPtr(nIndex);
CComboBox::OnDestroy();
}
I ran this using VC 4.2 ont NT 3.51
Jason
Jason@hkjcs.oz.au
----------
> Environment: VC++ 4.2-flat, NT 4.0
>
> I have derived a class MyComboBox from CComboBox to handle
> SetDataItemPtr
> for the items. I am using the combobox in many dialogs where I have to
> set
> the dataitem value to a CString object.
>
> I have added a method SetCStringItem(index,CString) to MyComboBox
> {
> // allocate space in the heap (needs to be destroyed explicitely)
> LPSTR pKeyVal = new TCHAR[pstr.GetLength()+1];
> if (pKeyVal == NULL) return CB_ERR;
>
> // copy the data to the ptr
> strcpy(pKeyVal,pstr);
>
> // set the data item
> m_bDataSet = TRUE;
> return (SetItemDataPtr(pIndex, pKeyVal ));
> }
>
> Now My problem is I am not finding the correct event to destroy the
> items.
> I have to use GetCount() and GetItemDataPtr() which
> gives Assertion in destructor. I tried DestroyWindow(), OnClose(),
> OnDestroy() none of them gets invoked before destructor. Can anyone
> suggest me a way to do the cleanup ?
>
Jason Healy -- jason@hkjcs.oz.au
Wednesday, March 19, 1997
DeleteItem is only called for an owner-draw Combobox
Jason
jason@hkjcs.oz.au
----------
>
> [Mini-digest: 2 responses]
>
>
> The MSVC++ help system shows a CComboBox class member of
> "DeleteItem". Override this function to delete your datapointers.
>
> -----Original Message-----
> From: Raja Bhattacharjee [SMTP:raja@bhi.com]
> Sent: Tuesday, March 11, 1997 2:25 PM
> To: mfc-l@netcom.com
> Subject: Derived Combo Box
>
> Environment: VC++ 4.2-flat, NT 4.0
>
> I have derived a class MyComboBox from CComboBox to handle
> SetDataItemPtr
> for the items. I am using the combobox in many dialogs where I have to
> set
> the dataitem value to a CString object.
>
> I have added a method SetCStringItem(index,CString) to MyComboBox
> {
> // allocate space in the heap (needs to be destroyed explicitely)
> LPSTR pKeyVal = new TCHAR[pstr.GetLength()+1];
> if (pKeyVal == NULL) return CB_ERR;
>
> // copy the data to the ptr
> strcpy(pKeyVal,pstr);
>
> // set the data item
> m_bDataSet = TRUE;
> return (SetItemDataPtr(pIndex, pKeyVal ));
> }
>
> Now My problem is I am not finding the correct event to destroy the
> items.
> I have to use GetCount() and GetItemDataPtr() which
> gives Assertion in destructor. I tried DestroyWindow(), OnClose(),
> OnDestroy() none of them gets invoked before destructor. Can anyone
> suggest me a way to do the cleanup ?
> -----From: "Jason Healy"
>
> I have managed to override the OnDestroy notification function, and
> successfully
> deleted the data I allocated. You must delete the data allocated before
> calling the
> base class implementation, which destroys the internal data, and therefor
> your link to the
> data allocated by you.
>
> void CPtrComboBox::OnDestroy()
> {
> for (int nIndex = 0; nIndex < GetCount(); nIndex++)
> delete[] (LPTSTR)GetItemDataPtr(nIndex);
>
> CComboBox::OnDestroy();
> }
>
> I ran this using VC 4.2 ont NT 3.51
>
> Jason
> Jason@hkjcs.oz.au
>
> ----------
> > Environment: VC++ 4.2-flat, NT 4.0
> >
> > I have derived a class MyComboBox from CComboBox to handle
> > SetDataItemPtr
> > for the items. I am using the combobox in many dialogs where I have to
> > set
> > the dataitem value to a CString object.
> >
> > I have added a method SetCStringItem(index,CString) to MyComboBox
> > {
> > // allocate space in the heap (needs to be destroyed explicitely)
> > LPSTR pKeyVal = new TCHAR[pstr.GetLength()+1];
> > if (pKeyVal == NULL) return CB_ERR;
> >
> > // copy the data to the ptr
> > strcpy(pKeyVal,pstr);
> >
> > // set the data item
> > m_bDataSet = TRUE;
> > return (SetItemDataPtr(pIndex, pKeyVal ));
> > }
> >
> > Now My problem is I am not finding the correct event to destroy the
> > items.
> > I have to use GetCount() and GetItemDataPtr() which
> > gives Assertion in destructor. I tried DestroyWindow(), OnClose(),
> > OnDestroy() none of them gets invoked before destructor. Can anyone
> > suggest me a way to do the cleanup ?
> >
>
>
DFPav@aol.com
Monday, March 24, 1997
All:
I would guess that listbox and combo box details are the same, but I am not
sure. For listboxes, however I know that:
they must be owner draw to receive WM_DRAWITEM (obvious)
but they must also NOT have HASSTRINGS to receive WM_COMPAREITEM,
WM_DELETEITEM
Hope this helps,
Dan
Become an MFC-L member
| Вернуться в корень Архива
|