Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Visual C++/MFC/WTL > CListBox: не могу добавить строку


Автор: thesnidestone 21.4.2005, 18:22
Доброе время суток!

Подскажите, пожалуйста, в чем может быть проблема?

Есть класс:
Код

CClass 
{
    public:    
     ...
    void SetPointer(CListBox *_lb)
    {
         lb = _lb;
    };
    
    void PassString(CString string)
    {
         lb->AddString(string);
         lb->UpdateData();
    };
   
   private:
   ....
   CListBox *lb;
};


А в основной программе вызов:
Код

CClass c;
....
c.SetPointer((CListBox*)GetDlgItem(IDC_LISTBOX));
c.PassString("Something...");
.....    


Хотелось бы, чтобы передаваемая строка появилась в окне. Но, увы.... Функция UpdateData() возвращает 1. smile

Большое спасибо.

С уважением,
thesnidestone

Автор: Coocky 21.4.2005, 20:20
Цитата
lb->UpdateData();

Лишнее!
UpdateData();
Вызывается в том случае,если элемент имеет тип не Control,а String,UINT и т.д.

Автор: thesnidestone 21.4.2005, 22:03
Так и с ней и без нее не работает...

Автор: Coocky 22.4.2005, 10:57
thesnidestone
Ты дал слишком малый участок кода...Слишком у тебя все запутано.
Если ты сомневаешься в правильности моих слов,тогда делай
Создай диалог.Размести на нем ЛистБокс.Дай ему имя my_List.
А теперь в функции OnInitDialog() напиши my_List . AddString("Coocky был прав");

Автор: bel_nikita 22.4.2005, 15:19
Вот, такое попробуй. Это,я думаю, то что, как раз тебе и надо smile
Код

void Printf(UINT nID, const char *Format,...)
{
    char Str[500];
    va_list arg;
    va_start(arg,Format);
    wvsprintf(Str,Format,arg);
    va_end(arg);
    Print(nID,Str,strlen(Str));
}

void Print(UINT nID, char *Str,int Len)
{
    char *PtrB,*PtrE;

    {
        //Parse Str for Search Control Symbols
        PtrB=PtrE=Str;
        while(*PtrE)
        {
            if(((*PtrE) == 0x0A) || ((*PtrE) == 0x0D))
            {
                *PtrE=0;
                if(SendDlgItemMessage(nID,LB_ADDSTRING,0,(LPARAM)PtrB) == LB_ERRSPACE)
                {
                    SendDlgItemMessage(nID,LB_DELETESTRING,0,0);
                    SendDlgItemMessage(nID,LB_ADDSTRING,0,(LPARAM)PtrB);
                }
                PtrE++;
                if(((*PtrE) == 0x0A) || ((*PtrE) == 0x0D)) PtrE++;
                PtrB=PtrE;
            }
            else PtrE++;
        }

        if(*PtrB)
        {
            if(SendDlgItemMessage(nID,LB_ADDSTRING,0,(LPARAM)PtrB) == LB_ERRSPACE)
            {
                SendDlgItemMessage(nID,LB_DELETESTRING,0,0);
                SendDlgItemMessage(nID,LB_ADDSTRING,0,(LPARAM)PtrB);
            }
        }
    }
    SendDlgItemMessage(nID,LB_SETTOPINDEX,SendDlgItemMessage(nID,LB_GETCOUNT,0,0)-1,0);
}

Типа пишем в листбокс:
Код

 Printf(IDC_LIST1, "Hello world..."); // IDC_LIST1 - ID листбокса №1
 Printf(IDC_LIST2, "Hello world..."); // IDC_LIST2 - ID листбокса №2


Автор: thesnidestone 22.4.2005, 21:09
bel_nikita
спасибо!)) тока я уже, кажется, разобрался с проблемой! но, все равно, спасибо большое за участие!))

ЗЫ а код интересный)) надо взять на заметку smile

Автор: Coocky 22.4.2005, 21:11
bel_nikita
А я вот не понял smile

Автор: bel_nikita 22.4.2005, 21:49
Coocky
Цитата
А я вот не понял

Этот код выводит (добавляет) текст в любой ЛистБокс в твоей программе, там только на вход функции подаешь ID ЛистБокса и текст.
Вот и все smile

З.Ы.: Кстати, может в ФАКю закинуть, а? smile

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)