Поиск:

Ответ в темуСоздание новой темы Создание опроса
> MFC - Изменение текста в ListView 
:(
    Опции темы
NewLine
Дата 19.5.2006, 16:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 103
Регистрация: 19.5.2006

Репутация: нет
Всего: нет



Привет. 
Помогите пожалуйста. Не получается изменять текст в ListView при выборе элемента. 

void CEx06bDialog::OnItemchangedListview1(NMHDR* pNMHDR, LRESULT* pResult) 
{ 
NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR; 
CListCtrl* pList = (CListCtrl*) GetDlgItem(IDC_LISTVIEW1); 
int nSelected = pNMListView->iItem; 
if (nSelected >= 0) 
{ 
pList->SetItemText(nSelected,0,"222"); 
} 
*pResult = 0; 
} 

Спасибо. 
--------------------
Компания NewLineStudio - Разработка программного обеспеченияOn-CRM.ru - интернет CRM система
PM MAIL   Вверх
Earnest
Дата 19.5.2006, 16:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 87
Всего: 183



Управление туда точно приходит?

Попробуй перерисовать: 
Код

CRect rc;
pList->GetItemRect(nItem,rc,LVIR_BOUNDS);
pList->InvalidateRect(rc);
 


--------------------
...
PM   Вверх
NewLine
Дата 19.5.2006, 17:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 103
Регистрация: 19.5.2006

Репутация: нет
Всего: нет



Управление точно приходит, т.к. выделенный текст я могу просмотреть.
Но  с перерисовкой тоже не получается. 
--------------------
Компания NewLineStudio - Разработка программного обеспеченияOn-CRM.ru - интернет CRM система
PM MAIL   Вверх
Earnest
Дата 19.5.2006, 17:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 87
Всего: 183



Цитата(NewLine @  19.5.2006,  18:17 Найти цитируемый пост)
Управление точно приходит, т.к. выделенный текст я могу просмотреть

? В смысле дебагером?
 


--------------------
...
PM   Вверх
NewLine
Дата 19.5.2006, 17:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 103
Регистрация: 19.5.2006

Репутация: нет
Всего: нет



Нет.
CString strltem = pList->GetItemText(nSelected, 0); 
--------------------
Компания NewLineStudio - Разработка программного обеспеченияOn-CRM.ru - интернет CRM система
PM MAIL   Вверх
Earnest
Дата 19.5.2006, 17:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 87
Всего: 183



Так поставь точку останова и проверь.  У меня следующий код точно работает. И перерисовка не нужна:

Код

void CObjectFilterWnd::OnFltItemChanged (NMHDR* pNMHDR,LRESULT* pResult)
{
   LPNMLISTVIEW pNMLV = (LPNMLISTVIEW)pNMHDR;

   if ((pNMLV->iItem == -1) || !(pNMLV->uChanged & LVIF_STATE))
      return;
   if (!((pNMLV->uNewState ^ pNMLV->uOldState) & LVIS_SELECTED))
      return;

   // ...

   // m_wndFilter - это переменная диалога, которая связывается с контролом через DDX_Control
   m_wndFilter.SetItemText(pNMLV->iItem,0,_T("!!!"));
}
 


--------------------
...
PM   Вверх
NewLine
Дата 22.5.2006, 12:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 103
Регистрация: 19.5.2006

Репутация: нет
Всего: нет



Объявил я DDX_Control(pDX, IDC_LISTVIEW1, m_wndFilter);
И привыболе элемента в ListView выдается ошибка.
user posted image
 
--------------------
Компания NewLineStudio - Разработка программного обеспеченияOn-CRM.ru - интернет CRM система
PM MAIL   Вверх
Earnest
Дата 22.5.2006, 14:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 87
Всего: 183



Когда именно появляется Assertion? При выполнении DDX_Control (DoDataExchange)? Тогда, скорее всего, ид-р лист-контрола не такокй как ты думаешь. Зайди отладчиком по ASSERT (нажми Retry) и посмотри, что ему не нравится.
Если нет, приведи код того метода, на котором падает ASSERT и покажи строку. 


--------------------
...
PM   Вверх
NewLine
Дата 22.5.2006, 15:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 103
Регистрация: 19.5.2006

Репутация: нет
Всего: нет



Падает Здесь ->.
BOOL CListCtrl::SetItemText(int nItem, int nSubItem, LPCTSTR lpszText)
{
->    ASSERT(::IsWindow(m_hWnd));
    ASSERT((GetStyle() & LVS_OWNERDATA)==0);
    LVITEM lvi;
    lvi.iSubItem = nSubItem;
    lvi.pszText = (LPTSTR) lpszText;
    return (BOOL) ::SendMessage(m_hWnd, LVM_SETITEMTEXT, nItem, (LPARAM)&lvi);
} 
--------------------
Компания NewLineStudio - Разработка программного обеспеченияOn-CRM.ru - интернет CRM система
PM MAIL   Вверх
NewLine
Дата 22.5.2006, 16:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 103
Регистрация: 19.5.2006

Репутация: нет
Всего: нет



Странно если я нажимаю просто кнопку ОК, то он всеравно ругается и выдает ту же самую ошибку Ассерт. 
--------------------
Компания NewLineStudio - Разработка программного обеспеченияOn-CRM.ru - интернет CRM система
PM MAIL   Вверх
Earnest
Дата 22.5.2006, 16:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 87
Всего: 183



Я твой код просила, а не MFC. Там ошибок нет ... почти  smile 
Этот ASSERT говорит о том, что SetItemText вызывается в тот момент, когда контрол еще не существует. Т.е. "не-окно". Где ты вызываешь-то его? При выборе элемента (и попытке установить текст?) Тогда не связалась твоя переменная с контролом, увы... 
Цитата(NewLine @  22.5.2006,  17:11 Найти цитируемый пост)
Странно если я нажимаю просто кнопку ОК, то он всеравно ругается и выдает ту же самую ошибку Ассерт.  

Что тут странного... значит, заходит в твой обработчик.

Сначала:
1) создаем в классе диалога переменную CLIstCtrl m_wndList
2) переопределяем виртуальную ф-ю DoDataExchange, в которую вставляем DDX_Control, предварительно убедившись, что идентфикатор контрола правильный
3) После этого переменной m_wndList можно пользоваться как окном. 


--------------------
...
PM   Вверх
NewLine
Дата 22.5.2006, 17:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 103
Регистрация: 19.5.2006

Репутация: нет
Всего: нет



Не понимаю почему если я ставлю эти две строчки в
OnInitDialog()
{
CListCtrl* pList = (CListCtrl*) GetDlgItem(IDC_LISTVIEW1);
pList->SetItemText(3,0,"!!!");
} 
Все благополучно меняется.


А если ставлю в обработчик события для (IDC_LISTVIEW1) сообщения LVN_ITEMCHANGED функцию
void CEx06bDialog::OnItemchangedListview1(NMHDR* pNMHDR, LRESULT* pResult) 
{
    CListCtrl* pList = (CListCtrl*) GetDlgItem(IDC_LISTVIEW1);
    pList->SetItemText(2,0,"!!!");
//pResult = 0;
}
Он меня просто выкидывает. 
--------------------
Компания NewLineStudio - Разработка программного обеспеченияOn-CRM.ru - интернет CRM система
PM MAIL   Вверх
Earnest
Дата 22.5.2006, 17:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 87
Всего: 183



Что значит "выкидывает"? Этот самый ASSERT, о котором ты раньше писал?
Действительно, странно. Надо смотреть на pList, который в обработчике... Что там внутри? В смысле m_hWnd его чему равен? Может, ты его где-нибудь между делом удаляешь? smile 
Вложи весь код этого диалога.  


--------------------
...
PM   Вверх
NewLine
Дата 22.5.2006, 17:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 103
Регистрация: 19.5.2006

Репутация: нет
Всего: нет



Нет. Просто выкидывает из программы без ошибок.

Код

#if !defined(AFX_EX06BDIALOG_H__5C932904_6D9C_4D9B_830F_C7FD399EFEF7__INCLUDED_)
#define AFX_EX06BDIALOG_H__5C932904_6D9C_4D9B_830F_C7FD399EFEF7__INCLUDED_

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
// Ex06bDialog.h : header file
//

/////////////////////////////////////////////////////////////////////////////
// CEx06bDialog dialog

class CEx06bDialog : public CDialog
{

// Construction
public:
    double m_dSpin;
    int m_nProgress;
    int m_nTrackbarl;
    int m_nTrackbar2;
    CEx06bDialog(CWnd* pParent = NULL);  
    CImageList m_imagelist;
    // standard constructor
private:
    static    double dValue[5];


// Dialog Data
    //{{AFX_DATA(CEx06bDialog)
    enum { IDD = IDD_DIALOG1 };
//    CListCtrl    m_wndList;
    //}}AFX_DATA


// Overrides
    // ClassWizard generated virtual function overrides
    //{{AFX_VIRTUAL(CEx06bDialog)
    protected:
    virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support
    //}}AFX_VIRTUAL

// Implementation
protected:
    

    // Generated message map functions
    //{{AFX_MSG(CEx06bDialog)
    virtual BOOL OnInitDialog();
    afx_msg void OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar);
    afx_msg void OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar);
    afx_msg void OnItemchangedListview1(NMHDR* pNMHDR, LRESULT* pResult);
    //}}AFX_MSG
    DECLARE_MESSAGE_MAP()
};

//{{AFX_INSERT_LOCATION}}
// Microsoft Visual C++ will insert additional declarations immediately before the previous line.

#endif // !defined(AFX_EX06BDIALOG_H__5C932904_6D9C_4D9B_830F_C7FD399EFEF7__INCLUDED_)



Код

#include "stdafx.h"
#include "ЕХО6В.h"
#include "Ex06bDialog.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CEx06bDialog dialog
double CEx06bDialog::dValue[5] = {4.0, 5.6, 8.0, 11.0, 16.0};

CEx06bDialog::CEx06bDialog(CWnd* pParent /*=NULL*/)
    : CDialog(CEx06bDialog::IDD, pParent)
{
    m_nProgress=0;
    m_nTrackbarl=0;
    m_nTrackbar2=0;
    m_dSpin=10.0;
    
    //{{AFX_DATA_INIT(CEx06bDialog)
    //}}AFX_DATA_INIT
}


void CEx06bDialog::DoDataExchange(CDataExchange* pDX)
{

if (pDX->m_bSaveAndValidate) 
{
TRACE("обновление переменных-членов для полэунков");
CSliderCtrl* pSlide1 =(CSliderCtrl*) GetDlgItem(IDC_TRACKBAR1);
m_nTrackbarl = pSlide1->GetPos();
CSliderCtrl* pSlide2 = (CSliderCtrl*) GetDlgItem(IDC_TRACKBAR2);
m_nTrackbar2 = pSlide2->GetPos();
}
    //{{AFX_DATA_MAP(CEx06bDialog)
    //DDX_Control(pDX, IDC_LISTVIEW1, m_wndList);
    //}}AFX_DATA_MAP
}


BEGIN_MESSAGE_MAP(CEx06bDialog, CDialog)
    //{{AFX_MSG_MAP(CEx06bDialog)
    ON_WM_HSCROLL()
    ON_WM_VSCROLL()
    ON_NOTIFY(LVN_ITEMCHANGED, IDC_LISTVIEW1, OnItemchangedListview1)
    //}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CEx06bDialog message handlers

BOOL CEx06bDialog::OnInitDialog() 
{
    CProgressCtrl* pProg = (CProgressCtrl*) GetDlgItem(IDC_PROGRESS1);
pProg->SetRange(0, 100);
pProg->SetPos(m_nProgress);

CString strText1;
CSliderCtrl* pSlide1 = (CSliderCtrl*) GetDlgItem(IDC_TRACKBAR1);
pSlide1->SetRange(0, 100);
pSlide1->SetPos(m_nTrackbarl);
strText1.Format("%d", pSlide1->GetPos());
SetDlgItemText(IDC_STATIC_TRACK1, strText1);

CString strText2;
CSliderCtrl* pSlide2 = (CSliderCtrl*) GetDlgItem(IDC_TRACKBAR2);
pSlide2->SetRange(0,4);
pSlide2->SetTic(1);
pSlide2->SetTic(2);
pSlide2->SetTic(3);
pSlide2->SetPos(m_nTrackbar2);
strText2.Format("%3.1f", dValue[pSlide2->GetPos()]);
SetDlgItemText(IDC_STATIC_TRACK2, strText2);

CSpinButtonCtrl* pSpin = (CSpinButtonCtrl*) GetDlgItem(IDC_SPIN1);
pSpin->SetRange(0, 100);
pSpin->SetPos((int) (m_dSpin * 1.0));

HICON hIcon[8];
int n;
m_imagelist.Create(16, 16, 0, 8, 8); // или 32,
hIcon[0] = AfxGetApp()->LoadIcon(IDI_ICON1);
hIcon[1] = AfxGetApp()->LoadIcon(IDI_ICON2);
hIcon[2] = AfxGetApp()->LoadIcon(IDI_ICON3);
hIcon[3] = AfxGetApp()->LoadIcon(IDI_ICON4);
hIcon[4] = AfxGetApp()->LoadIcon(IDI_ICON5);
hIcon[5] = AfxGetApp()->LoadIcon(IDI_ICON6);
hIcon[6] = AfxGetApp()->LoadIcon(IDI_ICON7);
hIcon[7] = AfxGetApp()->LoadIcon(IDI_ICON8);
for (n = 0; n < 8; n++)
 {
m_imagelist.Add(hIcon[n]);
}

static char* color[] = { "белый", "черный", "красный","синий", "желтый", "бирюзовый", "фиолетовый", "зеленый"};
CListCtrl* pList = (CListCtrl*) GetDlgItem(IDC_LISTVIEW1);
pList->SetImageList(&m_imagelist, LVSIL_SMALL);
for (n = 0; n < 8; n++) {
pList->InsertItem(n, color[n], n);
}
    return TRUE;  // return TRUE unless you set the focus to a control
                  // EXCEPTION: OCX Property Pages should return FALSE
}

void CEx06bDialog::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar) 
{
CSliderCtrl* pSlide = (CSliderCtrl*) pScrollBar;
CString strText;
switch(pScrollBar->GetDlgCtrlID())
{
case IDC_TRACKBAR1:
strText. Format ("%d", pSlide->GetPos());
SetDlgItemText(IDC_STATIC_TRACK1, strText);
break;
case IDC_TRACKBAR2:
CSliderCtrl* pSlide = (CSliderCtrl*) pScrollBar;
strText.Format("%3.1f", dValue[pSlide->GetPos()]);
SetDlgItemText(IDC_STATIC_TRACK2, strText);
break;
}
}

void CEx06bDialog::OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar) 
{
// TODO: Add your message handler code here and/or call default

    if (pScrollBar->GetDlgCtrlID() == IDC_SPIN1) {
CString strValue;
strValue.Format("%3.1f", (double) nPos / 10.0);
((CSpinButtonCtrl*) pScrollBar)->GetBuddy()->SetWindowText(strValue);
    }
//    CDialog::OnVScroll(nSBCode, nPos, pScrollBar);
}

void CEx06bDialog::OnItemchangedListview1(NMHDR* pNMHDR, LRESULT* pResult) 
{
    CListCtrl* pList = (CListCtrl*) GetDlgItem(IDC_LISTVIEW1);
    pList->SetItemText(2,0,"!!!");

}

   

Это сообщение отредактировал(а) NewLine - 22.5.2006, 17:53
--------------------
Компания NewLineStudio - Разработка программного обеспеченияOn-CRM.ru - интернет CRM система
PM MAIL   Вверх
Earnest
Дата 22.5.2006, 18:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 87
Всего: 183



Вроде на первый взгляд все честно, кроме одного: ты не вызываешь базовый метод из OnInitDialog. А должен - в самом начале. Видимо, поэтому у тебя не сработал фокус с DDX_Control: DoDataExchange вызывается именно из OnInitDialog базового класса.
Непонятно, откуда вылет, да еше и не в отладчик, а вообще. Посмотри, что у тебя в pList перед вызовом SetItemText.
Но вообще, ты бы навел порядок с переменными и контролами. Не через GetDlgItem и т.д., а заведи себе переменные для контролов, к которым часто обращаешься, и свяжи через DDX_COntrol. Легче будет разобраться в этой каше...
Ну а потом, если эффект не исчезнет, ищи источник: комментируй все, кроме обращений с ListCtrl, и добейся, чтобы работало.  Потом по-немногу открывай. Кто-то где-то кого-то ...   


--------------------
...
PM   Вверх
NewLine
Дата 23.5.2006, 11:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 103
Регистрация: 19.5.2006

Репутация: нет
Всего: нет



Я добавил в конец OnInitDialog строчку (return CDialog::OnInitDialog();) не знаю правильно это или нет, но все заработало.
Спасибо. 
--------------------
Компания NewLineStudio - Разработка программного обеспеченияOn-CRM.ru - интернет CRM система
PM MAIL   Вверх
Earnest
Дата 23.5.2006, 16:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 87
Всего: 183



Правильнее будет добавить в начало. То что возвращает базовый метод, можно игнорировать (FALSE вовсе не означает, что инициализация не удалась). 
Почему: если ты все же будешь использовать переменные-контролы класса, то использовать их можно только после вызова базового OnInitDialog.  


--------------------
...
PM   Вверх
Страницы: (2) [Все] 1 2 
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Visual C++/MFC/WTL | Следующая тема »


 




[ Время генерации скрипта: 0.0605 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.