Вопрос о CListCtrl
От: NyuK nyuk.by.ru
Дата: 19.11.01 11:30
Оценка:
Такой вопрос. Можно ли в CListCtrl создать невидимую колонку? Она нужна мне для хранения специфичных данных, связанных непосредственно со строкой.

А может есть другой способ, желательно не очень сложный (для чайников)?
Re: Вопрос о CListCtrl
От: Odi$$ey Россия http://malgarr.blogspot.com/
Дата: 19.11.01 12:14
Оценка:
Здравствуйте NyuK, Вы писали:

NK>Такой вопрос. Можно ли в CListCtrl создать невидимую колонку? Она нужна мне для хранения специфичных данных, связанных непосредственно со строкой.


NK>А может есть другой способ, желательно не очень сложный (для чайников)?


данные хранить в массиве (векторе, списке) структур/классов, а в CListCtrl показывать то что нужно показывать
Re: Вопрос о CListCtrl
От: Alexander Shargin Россия RSDN.ru
Дата: 19.11.01 12:39
Оценка:
Здравствуйте NyuK, Вы писали:

NK>Такой вопрос. Можно ли в CListCtrl создать невидимую колонку? Она нужна мне для хранения специфичных данных, связанных непосредственно со строкой.


NK>А может есть другой способ, желательно не очень сложный (для чайников)?


Есть: каждой строчке можно сопоставить 4-байтовое целое при помощи CListCtrl::SetItemData (или CListCtrl::SetItemDataPtr). Если 4 байтов тебе мало, распределяй для данных структуру и записывай через SetItemDataPtr указатель на неё.
--
Я думал, ты огромный страшный Бажище,
А ты недоучка, крохотный Бажик...
Re: Вопрос о CListCtrl
От: PSP Беларусь  
Дата: 19.11.01 12:58
Оценка:
Здравствуйте NyuK, Вы писали:

NK>Такой вопрос. Можно ли в CListCtrl создать невидимую колонку? Она нужна мне для хранения специфичных данных, связанных непосредственно со строкой.


NK>А может есть другой способ, желательно не очень сложный (для чайников)?


Данные в контроле вообще лучше не хранить. Если припёрло можно юзать CMap.

А невидимой колонка делается вроде как выставлением ширины в -1.
Всегда Ваш, PSP.
Re: Вопрос о CListCtrl
От: NyuK nyuk.by.ru
Дата: 19.11.01 23:00
Оценка:
Всем огромное спасибо. Заработало.

Попробовал делать ширину колонки -1 (самое простое) — колонки не видно, но текст прорисовывает (прямо по другим колонкам, и мышкой можно растянуть.

С CListCtrl::GetItemData не получилось с ходу, вываливает в отладчик с сообщением, что сработала BreakPoint на таком-то адресе и показывает ASM код.
Сделал через структуру LVITEM, поле lParam — это вроде то же самое.
Правда, боюсь что эти данные понадабятся классу CListCtrl для своих нужд. Не понял пока, но для чего-то нужны.

С CMap, списками и т.п. пока не возился, т.к. проблема еще в том, что здесь надо следить за работой сортировки, иначе все связи нарушатся. А к этому я пока не готов.
Re: Вопрос о CListCtrl
От: cornett Россия http://cornett.da.ru
Дата: 29.07.02 12:46
Оценка:
Здравствуйте NyuK, Вы писали:

NK>Такой вопрос. Можно ли в CListCtrl создать невидимую колонку? Она нужна мне для хранения специфичных данных, связанных непосредственно со строкой.


NK>А может есть другой способ, желательно не очень сложный (для чайников)?



Вроде как SetColumnWidth(...) должен спасти...
Re: Вопрос о CListCtrl
От: CooLer Россия http://bestsoft.far.ru
Дата: 29.07.02 14:30
Оценка:
Здравствуйте NyuK, Вы писали:

NK>Такой вопрос. Можно ли в CListCtrl создать невидимую колонку? Она нужна мне для хранения специфичных данных, связанных непосредственно со строкой.


NK>А может есть другой способ, желательно не очень сложный (для чайников)?


Хотя ты вроде проблему уже решил, хотел бы посоветовать тебе более универсальный и надежный способ. Для этого снимаем с CListCtrl все полномочия по хранению информации. Создаем труктурку:

struct MainStruct
{
    // Здесь все твои данные, которые ты хранишь в колонках CListCtrl
    CString Name;
    BYTE Age;
    ...

    // А сюда добавь дополнительную информацию:
    DWORD SecretCode;
    ...

};


Теперь прикрепи списку стиль LVS_OWNERDATA. Если ты используешь CListView перегрузи PreCreateWindow так:

BOOL CReadersView::PreCreateWindow(CREATESTRUCT& cs) 
{
    cs.style |= LVS_OWNERDATA;
    
    return CListView::PreCreateWindow(cs);
}


Теперь наиболее сложный момент: все информацию, которую ты вкладывал в CListCtrl придется хранить отдельным массивом. Сделай это примерно так:

[code]typedef CArray<MainStruct,MainStruct &> CMainArray;[/ccode]

А в диалоги/виде создай мембер:

CMainArray m_Data;


Вот теперь придется помучиться, чтобы все данные, которые ты складывал в CListCtrl положить в m_Data. Но, поверь, оно того стоит!

После всего этого у тебя будет независимый от листа массив, в котором ты сможешь хранить все что захочешь! А чтобы передать листу потребную ему информацию обработай сообщение LVN_GETDISPINFO.

Подробнейшая статья об этом лежит тут:http://rsdn.ru/archive/vc/issues/pvc051.htm
"Выше голову" — сказл палач, надевая петлю
Re[2]: Вопрос о CListCtrl
От: Admiral Украина  
Дата: 29.07.02 15:26
Оценка:
Здравствуйте NyuK, Вы писали:

NK>Сделал через структуру LVITEM, поле lParam — это вроде то же самое.

NK>Правда, боюсь что эти данные понадабятся классу CListCtrl для своих нужд. Не понял пока, но для чего-то нужны.
lParam — как раз для разработчика (т.е. для нас).

NK>С CListCtrl::GetItemData не получилось с ходу, вываливает в отладчик с сообщением, что сработала BreakPoint на таком-то адресе и показывает ASM код.

Выделяй память под данные, на которые будет указывать lParam, динамически (т.е. указатель должен быть всегда валиден, по крайней мере пока существует строка в списке). И не забудь потом освободить ее.
Удачи!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.