Поиск:

Ответ в темуСоздание новой темы Создание опроса
> SetItemData и GetItemData в CListCtrl. 
:(
    Опции темы
AndreySol
Дата 9.11.2006, 03:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 772
Регистрация: 19.6.2004

Репутация: 1
Всего: 1



Есть такой код
Код

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 ?
PM MAIL   Вверх
Earnest
Дата 9.11.2006, 09:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 87
Всего: 183



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

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

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


--------------------
...
PM   Вверх
AndreySol
Дата 10.11.2006, 01:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 772
Регистрация: 19.6.2004

Репутация: 1
Всего: 1



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

Это сообщение отредактировал(а) AndreySol - 10.11.2006, 01:53
PM MAIL   Вверх
Earnest
Дата 10.11.2006, 08:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 87
Всего: 183



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



--------------------
...
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Visual C++/MFC/WTL | Следующая тема »


 




[ Время генерации скрипта: 0.0430 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.