Clistctrl..

  • Автор темы Guest
  • Дата начала
Статус
Закрыто для дальнейших ответов.
G

Guest

#1
начинаю осваивать 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
 

grigsoft

Well-known member
15.11.2005
735
0
#2
1. SetItemText - это заполнение других столбцов - дополнительного текста для элемента, а сам элемент ты должен создать. Впрочем, LVItem заполнять тебя никто не заставляет - у InsertItem есть варианты попроще.

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

Guest

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

есть еще один вопрос ..как получить индекс выделеного элемента(строки) в m_list
 
G

Guest

#4
сделал так
Код:
	POSITION pos = m_list.GetFirstSelectedItemPosition();
int indx=m_list.GetNextSelectedItem(pos)
 

grigsoft

Well-known member
15.11.2005
735
0
#5
Ты лучше разберись что за фигня - то ли у тебя объявление где было не в классе, глобальная переменная - это не решение.
А хелп у тебя есть? GetFirstSelectedItemPosition\GetNextSelectedItem.

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

Guest

#6
получилось так что начал с визарда...сделал простенькое диалоговое окно..потом часа два пытался одуплитца что к чему.. поэтому и решил сначала все попробывать сделать руцями..

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

grigsoft

Well-known member
15.11.2005
735
0
#7
О чем я и говорю. Ты просто тратишь время вместо того чтобы решать задачу.

А нотификация должна вроде и так приходить. Только не LBN_DBLCLK - это от листбокса. А вот какая - не скажу, посмотри спаем.
 
G

Guest

#8
еще один вопрос...скорее не по 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
 

grigsoft

Well-known member
15.11.2005
735
0
#9
1. Нельзя программировать на MFC без его исходников. Ставь исходники, и тогда не будет вопросов о слете в каком-то winocc.cpp - сразу увидишь что и где не так. И при дальнейшей работе отладка будет тебя все время уводить в эти исходники - это поможет со временем понять всю структуру и спокойно ориентироваться.

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

PS. Книжку по MFC все же лучше почитать B)
 
G

Guest

#10
OK как індекс передать в OninitDialog ?
а книга єто хорошо!..пореккомендуешь какую?
 

grigsoft

Well-known member
15.11.2005
735
0
#11
Так это - переменные в классе, видимо.
А книжку - нет, не порекомендую, к сожалению. Сам давно учился, уже и не помню по чем. Думаю, любая пойдет - базовые вещи везде расписаны, а опыт все равно не заменишь.
Вот в целом по Windows - Рихтер безусловно.
 
G

Guest

#12
Все..сделал..большое спасибо..
сейчас попробую сотворить тоже самое но с визардом))
 
Статус
Закрыто для дальнейших ответов.