Здравствуйте... тут такая заморочка
я использую CListControl в режиме виртуального списка...
но проблемма в том что OLE DB использует UNICODE а CListCtrl ANSI
и передавать в OnGetDispUnfo указатель на строку в рекордсете (с помощью приведения типов) не получается или я не знаю как...
а создовать АНСИ вариацию масива и дублировать данные полученные из БД не хочется...
подскажите что делают в таких случаях... читал статью на этом сайте http://www.rsdn.ru/?article/?controls/virtlist.xml
void CMyListView::OnGetdispinfo(NMHDR* pNMHDR, LRESULT* pResult)
{
...
...
strcpy(pItem->pszText, pDoc->GetItemText(pItem->iSubItem, nIndex));
...
}
но у меня не копируется... выдает ошибку...
Заранее благодарен, Роман
NetMinion
Re: как вывести результат запроса прмо в лист контрол.
Теперь будет копировать...
Виртуальный список работает замечательно, для конвертации уникода в анси и обратно удобней всего использовать макросы OLE2T и T2OLE соответственно!
Re[2]: как вывести результат запроса прмо в лист контрол.
Здравствуйте Capone, Вы писали:
C>Патаму шо незя так копировать, ведь pItem->pszText это чистый указатель на строку, а не вектор. Нужно делать так:
C>LPTSTR pszText = new TCHAR[256];
pItem->>pszText = pszText;
strcpy(pItem->>pszText, pDoc->GetItemText(pItem->iSubItem, nIndex));
C>Теперь будет копировать... C>Виртуальный список работает замечательно, для конвертации уникода в анси и обратно удобней всего использовать макросы OLE2T и T2OLE соответственно!
Только не эти макросы. Весьма коварная вещь, макросы конвертирования. Лучше написать хелперы для конвертации и юзать их. А макросы выделяют память в стеке и в цикле ты можешь его слегка подпереполнить, посколько память освободится при выходе из функции, а не из блока.
Re[2]: как вывести результат запроса прмо в лист контрол.
Здравствуйте Capone, Вы писали:
C>Патаму шо незя так копировать, ведь pItem->pszText это чистый указатель на строку, а не вектор. Нужно делать так:
C>LPTSTR pszText = new TCHAR[256];
pItem->>pszText = pszText;
strcpy(pItem->>pszText, pDoc->GetItemText(pItem->iSubItem, nIndex));
а кто в данной ситуации отвечает за удаление строки?
NetMinion
Re[3]: как вывести результат запроса прмо в лист контрол.
Здравствуйте NetMinion, Вы писали:
NM>а кто в данной ситуации отвечает за удаление строки?
Тот же кто ее создает...
Re[4]: как вывести результат запроса прмо в лист контрол.
От:
Аноним
Дата:
11.04.02 13:51
Оценка:
Здравствуйте Capone, Вы писали:
C>Здравствуйте NetMinion, Вы писали:
NM>>а кто в данной ситуации отвечает за удаление строки?
C>Тот же кто ее создает...
и как это сделать в такой ситуации?
Здравствуйте Аноним, Вы писали:
NM>>>а кто в данной ситуации отвечает за удаление строки?
C>>Тот же кто ее создает... А>и как это сделать в такой ситуации?
А>void CFdfdView::OnGetdispinfoList1(NMHDR* pNMHDR, LRESULT* pResult) А>{
[skipped] А>}
IMHO "Подсказка" насчет выделения буфера при возврате строки была, кажись, неверной. Мне сдается, что система сама выделяет буфер для этих целей, а его размер сохраняет в LVITEM::cchTextMax.
// #import <windows.bas> class IWindows9x:protected DOS { private: virtual HANDLE EnumClouds()=0; };
Re[6]: как вывести результат запроса прмо в лист контрол.
Здравствуйте KA, Вы писали:
C>>>Тот же кто ее создает... А>>и как это сделать в такой ситуации?
А>>void CFdfdView::OnGetdispinfoList1(NMHDR* pNMHDR, LRESULT* pResult) А>>{ KA>[skipped] А>>}
KA>IMHO "Подсказка" насчет выделения буфера при возврате строки была, кажись, неверной. Мне сдается, что система сама выделяет буфер для этих целей, а его размер сохраняет в LVITEM::cchTextMax.
Не совсем. На самом деле, можно и так, и эдак:
If the LVITEM structure is receiving item text, the pszText and cchTextMax members specify the address and size of a buffer. You can either copy text to the buffer or assign the address of a string to the pszText member. In the latter case, you must not change or delete the string until the corresponding item text is deleted or two additional LVN_GETDISPINFO messages have been sent.
Одним из 33 полных кавалеров ордена "За заслуги перед Отечеством" является Геннадий Хазанов.
Re[5]: как вывести результат запроса прмо в лист контрол.
В случае виртуально списка имеет смысл использовать совместно с OnGetdispinfo еще и OnOdcachehint, почитай в статье про которую ты упоминал там подробно описано, это решит проблему удаления буфера. А в качестве кеша я использовал CMap<int,int,CString,CString>, удаляешь ключ, удаляется и строка!
LVITEM::cchTextMax используется для возврата информации об элементе например GetItem( LVITEM* pItem), в этом случае ты передаешь в структуру адрес текстового буфера и указаваешь его максимальный размер, что бы не произошло переполнение этого буфера если строка длиннее.