ОБСУЖДЕНИЕ

Clistctrl..

11 ответов 10,2 тыс.
AI-выжимка обсуждения скоро

Краткие тезисы обсуждения со ссылками на ключевые ответы появятся здесь.

Статус
Закрыто для дальнейших ответов.
Автор темы
начинаю осваивать MFC.. пока пытаюсь не пользовать Визард.. пишу все вручную..*думаю не стоит пояснять почему вручную когда есть визард*
возникли некоторые проблемы...

в MainWnd.h объявил переменную CListCtrl m_list;

в MainWnd.cpp


Код:
m_list.Create( 
  WS_CHILD|WS_VISIBLE|WS_BORDER|LVS_REPORT|LVS_SINGLESEL, 
  CRect(10,40,610,rtClient.Height()-50),this,ID_LISTCTRL 
  ); //створив сам CListCtrl обєкт 
 m_list.SetExtendedStyle(LVS_EX_FULLROWSELECT); 

 m_list.InsertColumn(0,_T("test1"),LVCFMT_LEFT,200); 
 m_list.InsertColumn(1,_T("test2"),LVCFMT_LEFT,200); 
 m_list.InsertColumn(2,_T("test3"),LVCFMT_LEFT,200);



задача в том, чтобы по ходу выполнения программы вписывать в сей Лист некоторые переменные..

написал следуюющую функцию..

Код:
void CMainWnd::UpdateList(){ 
 
 for (int i=0; i<ob_arr.GetCount();++i) 
 { 
  CPerson*pers=(CPerson*)ob_arr[i];//CObArray ob_arr; 
  TCHAR *name; 
  name=new TCHAR[sizeof(pers->GetName())]; 
  lstrcpy(name,pers->GetName()); 

   

  LVITEM lvi; 
  lvi.pszText = name; 
  lvi.cchTextMax = wcslen(lvi.pszText); 
  lvi.iItem = i; 
  lvi.iSubItem = 0; 
  lvi.iImage = 0; 
  lvi.mask = LVIF_TEXT|LVIF_IMAGE; 
  m_list.InsertItem(&lvi);//left of '.InsertItem' must have class/struct/union type 
   

  //m_list.SetItemText(i,1,pers->GetPhone()); 
  //m_list.SetItemText(i,2,pers->GetEmail()); 


   
 } 
}



и тут началось...

1. Почему я обизательно должен заполнять LVITEM структуру, а не использовать
Код:
BOOL SetItemText( 
int nItem, 
int nSubItem, 
LPCTSTR lpszText 
);
Пример:
Код:
 m_list.SetItemText(i,1,_T("i.1 test"));

2. привидение типов. Так, vi.cchTextMax принимает строку типа LPWSTR, а имеется CString.
Выкрутился ..
Код:
TCHAR *name; 
name=new TCHAR[sizeof(pers->GetName())]; 
lstrcpy(name,pers->GetName());

...но это же не выход...не заводить же мне беферную переменную каждый раз кода хочу преобразовать строку одного типа к другому...



3. непонятное
Код:
m_list.InsertItem(&lvi);//left of '.InsertItem' must have class/struct/union type
 
1. SetItemText - это заполнение других столбцов - дополнительного текста для элемента, а сам элемент ты должен создать. Впрочем, LVItem заполнять тебя никто не заставляет - у InsertItem есть варианты попроще.

2. CString имеет свой оператор приведения типа к LPCTSTR; это, правда, const, но в твоем случае этим можно пренебречь -
Код:
lvi.pszText = (LPTSTR)(LPCTSTR)pers->GetName();

3. Вот тут ничего не скажу - скорее всего написал не так имя, например m_List вместо m_list
 
спасибо..разобрался...
с третим там все правильно было написано...выкруитлся..перенес объявление переменной CListCtrl m_list; с MainWnd.h в MainWnd.cpp (сделал глобальной...некрасиво , но работает)

есть еще один вопрос ..как получить индекс выделеного элемента(строки) в m_list
 
сделал так
Код:
	POSITION pos = m_list.GetFirstSelectedItemPosition();
int indx=m_list.GetNextSelectedItem(pos)
 
Ты лучше разберись что за фигня - то ли у тебя объявление где было не в классе, глобальная переменная - это не решение.
А хелп у тебя есть? GetFirstSelectedItemPosition\GetNextSelectedItem.

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

еще вопрос...нужно обработать ON_LBN_DBLCLK месидж..если я все правильно понимаю нужно объявить дополнительные стили к CListCtrl m_list..
не подскажешь какие...
родительському CS_DBLCLKS задал...
 
О чем я и говорю. Ты просто тратишь время вместо того чтобы решать задачу.

А нотификация должна вроде и так приходить. Только не LBN_DBLCLK - это от листбокса. А вот какая - не скажу, посмотри спаем.
 
еще один вопрос...скорее не по CListCtrl, а CDialog....
хотелось бы чтобы при определенных условиях диалог открывался с заполненными CEdit полями...решил реализовать сие следующим образом
передавать в конструктор некого CDlg класса : public CDialog переменную nIndx
по умолчанию равной -1, в самом же конструкторе проверять и если значение nIndx!=-1 заполнять поля SetDlgItemText

Код:
CDlg::CDlg(UINT nRes, CWnd *pParent, int nIndx) : CDialog(nRes, pParent) {
if(nIndx!=-1){
* pers=(CPerson*)ob_arr[nIndx];
AfxMessageBox(pers->GetName());//проверил есть ли доступ к функциям CPerson
SetDlgItemText (IDC_EDIT2,_T("1111111")/*pers->GetName()*/);//слетает 
}

}

и вот компилируетца нормально, но когда дело доходит до SetDlgItemText слетает с сщщбщением о ошибке в каком-то winocc.cpp line:156
 
1. Нельзя программировать на MFC без его исходников. Ставь исходники, и тогда не будет вопросов о слете в каком-то winocc.cpp - сразу увидишь что и где не так. И при дальнейшей работе отладка будет тебя все время уводить в эти исходники - это поможет со временем понять всю структуру и спокойно ориентироваться.

2. Конструктор диалога (как и любого другого оконного класса) - это только класс, сами окна еще не созданы. То, что ты пытаешь сделать, делается либо в OninitDialog, либо в DoDataExchange, либо в конструкторе присваиваются значения привязанным к полям переменным.

PS. Книжку по MFC все же лучше почитать B)
 
OK как індекс передать в OninitDialog ?
а книга єто хорошо!..пореккомендуешь какую?
 
Так это - переменные в классе, видимо.
А книжку - нет, не порекомендую, к сожалению. Сам давно учился, уже и не помню по чем. Думаю, любая пойдет - базовые вещи везде расписаны, а опыт все равно не заменишь.
Вот в целом по Windows - Рихтер безусловно.
 
Все..сделал..большое спасибо..
сейчас попробую сотворить тоже самое но с визардом))
 
Статус
Закрыто для дальнейших ответов.