Черезстрочная расскаска грида

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
CodeName33
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 297
Зарегистрирован: 01.09.2004 (Ср) 13:25
Откуда: SPb

Черезстрочная расскаска грида

Сообщение CodeName33 » 19.10.2005 (Ср) 12:08

Как быстро реализовать сабж? MSFlexGrid. Надо сделать: строчка белая, строчка светло голубая. Мой алгоритм пробегается по всем записям и расскрашивает каждую ячейку в каждой строке, но когда 5-10 тысяч строк в гриде, эта процедура занимает слишком много времени, особенно при сортировке т.к. после сортитовки всё сбивается и нужно перекрашивать заново... Другой грид изспользовать нельзя - корпоративный стандарт, документы, бла бла бла... Ускорить вообще возможно? может можно как нибудь покрасить сразу всю строку, а не каждую ячейку по отдельности?

Моя прцедура:

Код: Выделить всё
Public Sub MakeGrig2Colors(ByRef p_grdRows As MSFlexGrid, ByVal Color1 As Long, ByVal Color2 As Long)
Dim i As Long, JC As Long, j As Long, K As Long, C As Long

p_grdRows.ReDraw = False
K = p_grdRows.Rows - 1
JC = p_grdRows.Cols - 1
For i = 1 To K
    If C = Color1 Then C = Color2 Else C = Color1
   
    p_grdRows.row = i
    For j = 0 To JC
        p_grdRows.Col = j
        p_grdRows.CellBackColor = C
    Next
Next
p_grdRows.ReDraw = True
End Sub
Программисты не глючат - глючат компиляторы...

Andrey Fedorov
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3287
Зарегистрирован: 21.05.2004 (Пт) 9:28
Откуда: Москва

Re: Черезстрочная расскаска грида

Сообщение Andrey Fedorov » 19.10.2005 (Ср) 12:56

CodeName33 писал(а):Другой грид изспользовать нельзя - корпоративный стандарт, документы, бла бла бла...


Честно говоря сочувствую - взять за стандарт идущие в поставке с VB компоненты - это надо додуматься...
Фиг Вам! - Сказал Чебурашка, обгладывая Крокодила Гену...

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 19.10.2005 (Ср) 13:06

Присоединяюсь к сочувствиям.
При больших объемах единственное приемлимое решение -- использовать грид, который это делает сам.
Либо использовать свой самописный грид.
Lasciate ogni speranza, voi ch'entrate.

CodeName33
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 297
Зарегистрирован: 01.09.2004 (Ср) 13:25
Откуда: SPb

Сообщение CodeName33 » 19.10.2005 (Ср) 13:35

Либо использовать свой самописный грид.


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

При больших объемах единственное приемлимое решение -- использовать грид, который это делает сам.


К сожалению вносить такие изменения в проэкт я не уполномочен... А так бы, конечно поискал бы других гридов...
Программисты не глючат - глючат компиляторы...

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 19.10.2005 (Ср) 13:42

Много -- это сколько?
Однажды я делал самописный грид (правда без редактирования, только просмотр). Он несколько подтормаживал при навигации по записям, но тысячу записей грузил довольно быстро, несколько секунд (3-4). Причем это было давно, на VB5 и DAO.

P.S. Кстати, подтормаживал он не от большого количества записей (от этого зависела только инициализация), а от медленной перерисовки -- тогда я ничего, кроме Print и Line на PictureBox с AutoRedraw=True не знал.
Lasciate ogni speranza, voi ch'entrate.

Andrey Fedorov
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3287
Зарегистрирован: 21.05.2004 (Пт) 9:28
Откуда: Москва

Сообщение Andrey Fedorov » 19.10.2005 (Ср) 13:51

alibek писал(а):Много -- это сколько?
Однажды я делал самописный грид (правда без редактирования, только просмотр).


Он там о случае когда записи разной высоты писал - а ты, наверняка, делал для записей одинаковой высоты...

Вообще написание полноценных самопальных Grid-ов это гемор.... Особенно когда видишь что есть уже все готовое...
Фиг Вам! - Сказал Чебурашка, обгладывая Крокодила Гену...

CodeName33
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 297
Зарегистрирован: 01.09.2004 (Ср) 13:25
Откуда: SPb

Сообщение CodeName33 » 19.10.2005 (Ср) 13:51

Ну нет, Print и Line я не использую и рисую без AutoRedraw с оптимизацией для безмерцания. Но работать грид должен не из курсора БД, а с массивами размер которых может дстигать 15-20 тысяч строк... Сколько он заполняется большого значения не имеет, главное чтобы при сортировке (которая в микросовтском (а если ещё точнее перекупленного микрософтом у VideoSoftа) контроле достаточно быстрая), или другой работе с контролом - он работал достаточно быстро.
Программисты не глючат - глючат компиляторы...

Andrey Fedorov
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3287
Зарегистрирован: 21.05.2004 (Пт) 9:28
Откуда: Москва

Re: Черезстрочная расскаска грида

Сообщение Andrey Fedorov » 19.10.2005 (Ср) 13:55

CodeName33 писал(а):Как быстро реализовать сабж? MSFlexGrid. Надо сделать: строчка белая, строчка светло голубая.


Давно это было. Но еще во времена VB5 я сделал у Grid-а в программе подобную раскраску. Часть пользователей начала жаловаться на пестроту. Сделал раскраску опциональной - через некоторое время вижу что раскраска отключена у всех! С тех пор я Grid-ы подобным черезстрочным образом не крашу...
Фиг Вам! - Сказал Чебурашка, обгладывая Крокодила Гену...

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 19.10.2005 (Ср) 13:57

Andrey Fedorov писал(а):Он там о случае когда записи разной высоты писал - а ты, наверняка, делал для записей одинаковой высоты...

Да, проглядел, это серьезная поправка.

И области теоретизирования.
Можно сабклассить грид и подменять процедуру отрисовки грида.
Правда он не настолько документирован, тут придется методом тыка и дизассемблирования искать.
Lasciate ogni speranza, voi ch'entrate.

Andrey Fedorov
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3287
Зарегистрирован: 21.05.2004 (Пт) 9:28
Откуда: Москва

Сообщение Andrey Fedorov » 19.10.2005 (Ср) 14:14

CodeName33 писал(а):главное чтобы при сортировке (которая в микросовтском (а если ещё точнее перекупленного микрософтом у VideoSoftа) контроле достаточно быстрая), или другой работе с контролом - он работал достаточно быстро.


Кстати, а насколько быстро он это делает?

У меня Grid с примерно таким кол-вом записей выполняет сортировку/группировку где-то за секунду (на глазок).
Фиг Вам! - Сказал Чебурашка, обгладывая Крокодила Гену...

CodeName33
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 297
Зарегистрирован: 01.09.2004 (Ср) 13:25
Откуда: SPb

Сообщение CodeName33 » 19.10.2005 (Ср) 14:17

coderx, Fixed строки мне для заголовка нужны...

alibek, не, сабклассинг не покатит, т.к. может валить весь проэкт (особенно по кнопке стоп в ВБ), а с ним не только я работаю... К тому же если в нём ошибка, он может заставлять программу валиться в другом месте на абсолютно правильном коде и отловить ошибку очень сложно... Мне такое сделать, боюсь тоже не дадут... Ладно, оставим раскашивание грида до лучших времён...
Программисты не глючат - глючат компиляторы...

Eugenio
Постоялец
Постоялец
 
Сообщения: 393
Зарегистрирован: 08.05.2004 (Сб) 13:27
Откуда: Ekaterinburg

Сообщение Eugenio » 19.10.2005 (Ср) 18:22

Я, может, чего не понял, но количество операций можно сократить. Вот выделение целой строки:
Код: Выделить всё
        p_grdRows.Row = CurrentRowNum
        p_grdRows.RowSel = CurrentRowNum
        p_grdRows.Col = 0
        p_grdRows.ColSel = p_grdRows.Cols - 1
        p_grdRows.CellBackColor = C
Есть ли у меня вопрос? У меня всегда есть вопрос

Eugenio
Постоялец
Постоялец
 
Сообщения: 393
Зарегистрирован: 08.05.2004 (Сб) 13:27
Откуда: Ekaterinburg

Сообщение Eugenio » 23.10.2005 (Вс) 19:24

Шел мимо :) , и понял, что вообще чего-то не понимаю проблемы:
перерисовывать-то нужно только несколько строк, которые видны -
при заполнении и при событии Scroll:
Код: Выделить всё
    i = p_grdRows.TopRow
    LastRow = p_grdRows.Rows - 1
   
    Do While p_grdRows.RowIsVisible(i)
        .........
        If i + 1 > LastRow Then
            Exit Do
        End If
        i = i + 1
    Loop
Есть ли у меня вопрос? У меня всегда есть вопрос

CodeName33
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 297
Зарегистрирован: 01.09.2004 (Ср) 13:25
Откуда: SPb

Сообщение CodeName33 » 23.10.2005 (Вс) 21:45

Eugenio, а вот это отличная идея!!! спасибо, наверное так и сделаю...
Программисты не глючат - глючат компиляторы...


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: Google-бот и гости: 34

    TopList