Re[6]: как вывести результат запроса прмо в лист контрол.
От: Sergey Россия  
Дата: 12.04.02 06:08
Оценка: 1 (1)
Здравствуйте 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 полных кавалеров ордена "За заслуги перед Отечеством" является Геннадий Хазанов.
как вывести результат запроса прмо в лист контрол.
От: NetMinion  
Дата: 10.04.02 20:59
Оценка:
Здравствуйте... тут такая заморочка
я использую CListControl в режиме виртуального списка...
но проблемма в том что OLE DB использует UNICODE а CListCtrl ANSI
и передавать в OnGetDispUnfo указатель на строку в рекордсете (с помощью приведения типов) не получается или я не знаю как...
а создовать АНСИ вариацию масива и дублировать данные полученные из БД не хочется...
подскажите что делают в таких случаях... читал статью на этом сайте
http://www.rsdn.ru/?article/?controls/virtlist.xml
Автор(ы): Тимофей Чадов
Дата: 10.09.2001

там приведен такой код:

void CMyListView::OnGetdispinfo(NMHDR* pNMHDR, LRESULT* pResult)
{
...
...
strcpy(pItem->pszText, pDoc->GetItemText(pItem->iSubItem, nIndex));
...
}
но у меня не копируется... выдает ошибку...
Заранее благодарен, Роман
NetMinion
Re: как вывести результат запроса прмо в лист контрол.
От: Capone  
Дата: 11.04.02 05:26
Оценка:
Патаму шо незя так копировать, ведь pItem->pszText это чистый указатель на строку, а не вектор. Нужно делать так:

LPTSTR pszText = new TCHAR[256];
pItem->pszText = pszText;
strcpy(pItem->pszText, pDoc->GetItemText(pItem->iSubItem, nIndex));

Теперь будет копировать...
Виртуальный список работает замечательно, для конвертации уникода в анси и обратно удобней всего использовать макросы OLE2T и T2OLE соответственно!
Re[2]: как вывести результат запроса прмо в лист контрол.
От: Dutchman Беларусь http://blogs.rsdn.org/ikemefula
Дата: 11.04.02 06:41
Оценка:
Здравствуйте 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]: как вывести результат запроса прмо в лист контрол.
От: NetMinion  
Дата: 11.04.02 11:37
Оценка:
Здравствуйте Capone, Вы писали:

C>Патаму шо незя так копировать, ведь pItem->pszText это чистый указатель на строку, а не вектор. Нужно делать так:


C>LPTSTR pszText = new TCHAR[256];

pItem->>pszText = pszText;
strcpy(pItem->>pszText, pDoc->GetItemText(pItem->iSubItem, nIndex));
а кто в данной ситуации отвечает за удаление строки?
NetMinion
Re[3]: как вывести результат запроса прмо в лист контрол.
От: Capone  
Дата: 11.04.02 11:57
Оценка:
Здравствуйте NetMinion, Вы писали:

NM>а кто в данной ситуации отвечает за удаление строки?


Тот же кто ее создает...
Re[4]: как вывести результат запроса прмо в лист контрол.
От: Аноним  
Дата: 11.04.02 13:51
Оценка:
Здравствуйте Capone, Вы писали:

C>Здравствуйте NetMinion, Вы писали:


NM>>а кто в данной ситуации отвечает за удаление строки?


C>Тот же кто ее создает...

и как это сделать в такой ситуации?

void CFdfdView::OnGetdispinfoList1(NMHDR* pNMHDR, LRESULT* pResult)
{
LV_DISPINFO* pDispInfo = (LV_DISPINFO*)pNMHDR;
LV_ITEM* pItem= &(pDispInfo)->item;
LPTSTR pszText = new TCHAR[256];
pItem->pszText = pszText;
strcpy(pItem->pszText, (переводим в АНСИ)m_pSet->m_Measure);
//delete[] pszText; // ошибку выдает
*pResult = 0;
}
Re[5]: как вывести результат запроса прмо в лист контрол.
От: KA it-knowledge-base.blogspot.com
Дата: 11.04.02 15:19
Оценка:
Здравствуйте Аноним, Вы писали:

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[5]: как вывести результат запроса прмо в лист контрол.
От: Capone  
Дата: 12.04.02 07:10
Оценка:
В случае виртуально списка имеет смысл использовать совместно с OnGetdispinfo еще и OnOdcachehint, почитай в статье про которую ты упоминал там подробно описано, это решит проблему удаления буфера. А в качестве кеша я использовал CMap<int,int,CString,CString>, удаляешь ключ, удаляется и строка!
LVITEM::cchTextMax используется для возврата информации об элементе например GetItem( LVITEM* pItem), в этом случае ты передаешь в структуру адрес текстового буфера и указаваешь его максимальный размер, что бы не произошло переполнение этого буфера если строка длиннее.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.