Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Visual C++/MFC/WTL > SetItemData и GetItemData в CListCtrl.


Автор: AndreySol 9.11.2006, 03:08
Есть такой код
Код

DWORD dwData = reinterpret_cast<DWORD>(_T("Это текст"));
m_listctrl.SetItemData(0, dwData);
    
DWORD dwGetData = m_listctrl.GetItemData(0);
CString szRes = reinterpret_cast<char*>(dwGetData);

Как вместо _T("Это текст") воткнуть переменную типа CString ?
Пробовал szString.GetBuffer(szString.GetLength()), получаются кракозяблики.

Или может подскажите другой способ установить для LPARAM lParam итема текстовое значение из переменной типа CString ?

Автор: Earnest 9.11.2006, 09:13
CString теоретически воткнуть можно... т.к. размер ее 4 байта... но не стоит: нужно очень аккуратно работать с конструктором\деструктором, что не очень удобно, и вообще, извращение это... Выход в том, чтобы хранить в lParam указатель на строку, которой владеет кто-то еще. Например, есть у тебя в классе массив строк (CString m_str[N]), так вот не проблема поместить в lParam указатель на строковый буфер (а не на объект CString!):
Код

   SetItemData (iItem, m_str[k].GetBuffer());

Но! Это тоже не совсем безопасно: а если строки в массиве нужно изменять? Удалять\перемещать? И т.д.
Гораздо проще хранить в классе тот же список строк (или структур посложнее) для каждого элемента, а в lParam записывать индекс в этом массиве.  Тогда точно ничего никуда не денется.

Автор: AndreySol 10.11.2006, 01:40
Так я для того и связался с SetItemData / GetItemData, чтобы избавиться от массива.
Хотя может это и не очень хорошая идея ? И как все-таки мона провернуть то что я хотел ?

Автор: Earnest 10.11.2006, 08:34
Идея не хорошая: таким образом ты отказываешься от поддержки компилятора по автоматическому разрушению объектов при выходе из области видимости.
Как сделать? Да просто создай динамический объект CString и сохрани указатель в lParam. Только вот при любых манипуляциях надо будет не забыть извлечь его и удалить строку, иначе получишь утечку. А отследить все - весьма проблематично.
Поэтому лучше использовать внешние массивы.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)