Поиск:

Ответ в темуСоздание новой темы Создание опроса
> TListView c TProgressBar-ом, c++, builder, 2010 
:(
    Опции темы
Alca
Дата 15.10.2009, 15:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3993
Регистрация: 14.6.2006

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



C++Builder 2010: TListView c TProgressBar-ом


Перекатал пример с Делфей отсюда: 
http://www.delphisources.ru/pages/sources/...n-listview.html

Код

//uMain.h
...
    __published:
        TListView *lvQueue;
...
    public:
        std::vector<TProgressBar *> m_vecpProgressBars;
        
                        __fastcall  TfrmMain          (TComponent* Owner);
                        __fastcall ~TfrmMain          ();
        
        void                        vAdjustProgressBar(TListItem *item, TRect r);
        void                        OnWMNotify        (TWMNotify &a);
        BEGIN_MESSAGE_MAP
            MESSAGE_HANDLER(WM_NOTIFY, TWMNotify /*Message*/, OnWMNotify)
        END_MESSAGE_MAP(TForm)
...

Код

//uMain.cpp

/****************************************************************************
* Мутим TProgressBar для TListView (lvQueue)
*
*****************************************************************************/

//---------------------------------------------------------------------------
void TfrmMain::vAdjustProgressBar(TListItem *item, TRect r) {
    r.Left  = r.Left + lvQueue->Columns->Items[0]->Width + lvQueue->Columns->Items[1]->Width;
    r.Right = r.Left + lvQueue->Columns->Items[2]->Width; 
 
    TProgressBar *pPB = static_cast<TProgressBar *>(item->Data);
    /*DEBUG*/assert(NULL != pPB);

    pPB->BoundsRect = r;
}
//---------------------------------------------------------------------------
void __fastcall TfrmMain::lvQueueCustomDrawItem(TCustomListView *Sender, TListItem *Item, TCustomDrawState State, bool &DefaultDraw) {
    TRect r;

    r = Item->DisplayRect(drBounds);
    if (r.Top >= lvQueue->BoundsRect.Top) {
        vAdjustProgressBar(Item, r);
    }    
}
//---------------------------------------------------------------------------
void TfrmMain::OnWMNotify(TWMNotify &a) {
    TRect r;
    int   i = 0;             

    switch (a.NMHdr->code) {
        case HDN_ITEMCHANGED  : 
        case HDN_ITEMCHANGING : 
            {                            
                for (int i = 0; i < lvQueue->Items->Count - 1; i ++) {
                    r = lvQueue->Items->Item[i]->DisplayRect(drBounds);
                    vAdjustProgressBar(lvQueue->Items->Item[i], r);
                }

                lvQueue->Repaint();
            }
            break;
    }

    TForm::Dispatch(&a.Msg); 
}
//---------------------------------------------------------------------------


/****************************************************************************
* Создать TProgressBar
*
*****************************************************************************/

//---------------------------------------------------------------------------
void __fastcall TfrmMain::btnAddProgressBarClick(TObject *Sender) {
    for (int i = 0; i < 50; i ++) {   
        //добавляем пустую строку
        lvQueue->Items->Add();                                         

        //-------------------------------------
        //добавляем TProgressBar
        TProgressBar *pPB = new TProgressBar(frmMain);
        /*DEBUG*/assert(NULL != pPB);
        pPB->Parent   = lvQueue;
        pPB->Position = 0;
        pPB->Smooth   = true;
        pPB->Visible  = true;

        lvQueue->Items->Item[i]->Data = pPB;

        TRect r; 
        r = lvQueue->Items->Item[i]->DisplayRect(drBounds);
        vAdjustProgressBar(lvQueue->Items->Item[i], r);
        
        m_vecpProgressBars.push_back(pPB);

        //оформляем список
        lvQueue->Items->Item[i]->Caption     = _T("Text");        
        lvQueue->Items->Item[i]->SubItems->Add(_T("a"));        
        lvQueue->Items->Item[i]->SubItems->Add(_T("b"));
        lvQueue->Items->Item[i]->SubItems->Add(_T("c"));            
        lvQueue->Items->Item[i]->SubItems->Add(_T("d"));        
        lvQueue->Items->Item[i]->SubItems->Add(_T("e"));            

        lvQueue->Items->Item[i]->Update();
    }
}
//--------------------------------------------------------------------------- 


Все было бы хорошо тока это билдер.....

При ресайзе колонок прогрессбар отрисовывается временами нормально,
временнами хреново.....
 (см. скрины)

user posted image
user posted image

Что делать?




--------------------
PM WWW ICQ Skype Jabber   Вверх
Alca
Дата 17.10.2009, 00:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3993
Регистрация: 14.6.2006

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



В 6-х делфях именно таких косяков нет... 
Кто-нибудь в курсах где взять волшебного зелья?   smile  smile  smile 


--------------------
PM WWW ICQ Skype Jabber   Вверх
Alca
Дата 17.10.2009, 01:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3993
Регистрация: 14.6.2006

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



Заметил, что такой "съезд" колонок наблюдается после скролинга списка...


--------------------
PM WWW ICQ Skype Jabber   Вверх
Alca
Дата 17.10.2009, 13:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3993
Регистрация: 14.6.2006

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



Почему
Код

        case HDN_ITEMCHANGED  : 
        case HDN_ITEMCHANGING : 

не отрабатываются?  smile 


--------------------
PM WWW ICQ Skype Jabber   Вверх
A5uKa
Дата 18.10.2009, 14:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


TЋ♥s F1rȜ iƧ BurȠiƞg
***


Профиль
Группа: Awaiting Authorisation
Сообщений: 1928
Регистрация: 30.8.2008

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



Добавь на событие Resize Refresh на прогресс бары ... ну это самое простое, что я обычно делаю в случае подобных багах...
PM   Вверх
Alca
Дата 18.10.2009, 14:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3993
Регистрация: 14.6.2006

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



Когда я меняю размеры колонки мышью, то событие OnResize не срабатывает.

Добавлено через 6 минут и 16 секунд
Сейчас поробую на 6-ке....

Это сообщение отредактировал(а) Alca - 18.10.2009, 14:18


--------------------
PM WWW ICQ Skype Jabber   Вверх
Alca
Дата 18.10.2009, 15:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3993
Регистрация: 14.6.2006

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



Цитата

Сейчас поробую на 6-ке....

Ах....ь............ На 6-ке работает как часы. Нет слов.


--------------------
PM WWW ICQ Skype Jabber   Вверх
Alca
Дата 18.10.2009, 15:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3993
Регистрация: 14.6.2006

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



P.S.
Говорила мама, что не надо в билдере программить....


--------------------
PM WWW ICQ Skype Jabber   Вверх
A5uKa
Дата 18.10.2009, 19:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


TЋ♥s F1rȜ iƧ BurȠiƞg
***


Профиль
Группа: Awaiting Authorisation
Сообщений: 1928
Регистрация: 30.8.2008

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



да... мне тоже 2010 напоминает какой-то epic fail @ Embarcadero

Попробовал был другие компоненты например от Alpha Skins
заодно красивше  smile 

не не неее CBuilder это не выбор - это судьба, когда нормальные люди работают на Delphi 2007...
PM   Вверх
vikaz
Дата 18.10.2009, 19:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(Alca @  18.10.2009,  15:12 Найти цитируемый пост)
Ах....ь............ На 6-ке работает как часы. Нет слов. 

Сочувствую! 

А на 2009 пробовал?

Ну и попробуй AlphaSkins, как порекомендовал камрад!

Если вдруг не знаешь: AlphaSkins

Это сообщение отредактировал(а) vikaz - 18.10.2009, 19:39


--------------------
user posted image

Нет ничего настолько исправного, чтобы в нем не было ошибок. /Ф. Петрарка/ 
PM MAIL ICQ Skype   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

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

  • Литературу по С++ Builder обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Настоятельно рекомендуем заглянуть в DRKB (Delphi Russian Knowledge Base) - крупнейший в рунете сборник материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C++ Builder | Следующая тема »


 




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


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

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