| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Visual C++/MFC/WTL > SetItemData и GetItemData в CListCtrl. |
| Автор: AndreySol 9.11.2006, 03:08 | ||
Есть такой код
Как вместо _T("Это текст") воткнуть переменную типа CString ? Пробовал szString.GetBuffer(szString.GetLength()), получаются кракозяблики. Или может подскажите другой способ установить для LPARAM lParam итема текстовое значение из переменной типа CString ? |
| Автор: Earnest 9.11.2006, 09:13 | ||
CString теоретически воткнуть можно... т.к. размер ее 4 байта... но не стоит: нужно очень аккуратно работать с конструктором\деструктором, что не очень удобно, и вообще, извращение это... Выход в том, чтобы хранить в lParam указатель на строку, которой владеет кто-то еще. Например, есть у тебя в классе массив строк (CString m_str[N]), так вот не проблема поместить в lParam указатель на строковый буфер (а не на объект CString!):
Но! Это тоже не совсем безопасно: а если строки в массиве нужно изменять? Удалять\перемещать? И т.д. Гораздо проще хранить в классе тот же список строк (или структур посложнее) для каждого элемента, а в lParam записывать индекс в этом массиве. Тогда точно ничего никуда не денется. |
| Автор: AndreySol 10.11.2006, 01:40 |
| Так я для того и связался с SetItemData / GetItemData, чтобы избавиться от массива. Хотя может это и не очень хорошая идея ? И как все-таки мона провернуть то что я хотел ? |
| Автор: Earnest 10.11.2006, 08:34 |
| Идея не хорошая: таким образом ты отказываешься от поддержки компилятора по автоматическому разрушению объектов при выходе из области видимости. Как сделать? Да просто создай динамический объект CString и сохрани указатель в lParam. Только вот при любых манипуляциях надо будет не забыть извлечь его и удалить строку, иначе получишь утечку. А отследить все - весьма проблематично. Поэтому лучше использовать внешние массивы. |