Clistctrl..

Тема в разделе "MS Visual C++", создана пользователем -, 3 май 2006.

Статус темы:
Закрыта.
  1. Гость

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

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

    в MainWnd.cpp


    Код (Text):
    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);


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

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

    Код (Text):
    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 структуру, а не использовать
    Код (Text):
    BOOL SetItemText(
    int nItem,
    int nSubItem,
    LPCTSTR lpszText
    );
    Пример:
    Код (Text):
     m_list.SetItemText(i,1,_T("i.1 test"));
    2. привидение типов. Так, vi.cchTextMax принимает строку типа LPWSTR, а имеется CString.
    Выкрутился ..
    Код (Text):
    TCHAR *name;
    name=new TCHAR[sizeof(pers->GetName())];
    lstrcpy(name,pers->GetName());
    ...но это же не выход...не заводить же мне беферную переменную каждый раз кода хочу преобразовать строку одного типа к другому...



    3. непонятное
    Код (Text):
    m_list.InsertItem(&lvi);//left of '.InsertItem' must have class/struct/union type
     
  2. grigsoft

    grigsoft Well-Known Member

    Регистрация:
    15 ноя 2005
    Сообщения:
    735
    Симпатии:
    0
    1. SetItemText - это заполнение других столбцов - дополнительного текста для элемента, а сам элемент ты должен создать. Впрочем, LVItem заполнять тебя никто не заставляет - у InsertItem есть варианты попроще.

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

    Guest Гость

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

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

    Guest Гость

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

    grigsoft Well-Known Member

    Регистрация:
    15 ноя 2005
    Сообщения:
    735
    Симпатии:
    0
    Ты лучше разберись что за фигня - то ли у тебя объявление где было не в классе, глобальная переменная - это не решение.
    А хелп у тебя есть? GetFirstSelectedItemPosition\GetNextSelectedItem.

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

    Guest Гость

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

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

    grigsoft Well-Known Member

    Регистрация:
    15 ноя 2005
    Сообщения:
    735
    Симпатии:
    0
    О чем я и говорю. Ты просто тратишь время вместо того чтобы решать задачу.

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

    Guest Гость

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

    Код (Text):
    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
     
  9. grigsoft

    grigsoft Well-Known Member

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

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

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

    Guest Гость

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

    grigsoft Well-Known Member

    Регистрация:
    15 ноя 2005
    Сообщения:
    735
    Симпатии:
    0
    Так это - переменные в классе, видимо.
    А книжку - нет, не порекомендую, к сожалению. Сам давно учился, уже и не помню по чем. Думаю, любая пойдет - базовые вещи везде расписаны, а опыт все равно не заменишь.
    Вот в целом по Windows - Рихтер безусловно.
     
  12. Guest

    Guest Гость

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

Поделиться этой страницей