Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C++ Builder > Обновление ячеек таблицы


Автор: Volfs 2.2.2012, 19:00
Добрый день!

Делаю объединение ячеек StringGrid в ручном режиме, рисую в обработчике DrawCells
Алгоритм объединения работает нормально
Но есть следующая проблема, когда прокручиваю таблицу вниз обновляются (заново прорисовываются) не все ячейки, а только заново появляющиеся, поэтому объединенные ячейки  прорисовываются не правильно.

Как обновить либо все видимые ячейки в соответствие с заложенным в обработчик DrawCells  алгоритмом, либо заданное количество ячеек.

Автор: Volfs 3.2.2012, 07:22
есть еще один вариант, для формирования внешнего вида стринг грида, сначало формировать матрицу с описанием каждой ячейки, а обработчиком событий ДравЦеллс только читать эту матрицу и в соответствие с ней рисовать ячейки

Автор: sawfish 3.2.2012, 09:34
Если прорисовывание выполняется неправильно, значит какое-то условие выполняется (или не выполняется) для этого. Проверьте условия объединения/прорисовки.

Автор: Volfs 3.2.2012, 10:25
Цитата(sawfish @  3.2.2012,  09:34 Найти цитируемый пост)
Проверьте условия объединения/прорисовки. 


Условия все должны быть верны.
В приложение несколько вкладок, и если перейти на другую вкладку и вернуться обратно то все прорисовывается верно, либо если прокручивать таблицу не по одной строчке, а сразу по несколько (перетаскивая ползунок прокрутки), то все верно.

По этому мне кажется, что заново прорисовываются только ячейки, которые становятся видимыми.

Автор: sawfish 3.2.2012, 12:52
Цитата

Условия все должны быть верны.

С этим никто не спорит.
Вообще, этой функцией все ячейки прорисовываются, но показываются (видны) не все. Но результат-то не тот, который ожидается. Поэтому напрашивается вывод, что какое-то условие там в коде стоит. Больше ниче не могу предположить... Ну или код показывайте.

Автор: Volfs 4.2.2012, 13:59
Цитата(sawfish @  3.2.2012,  12:52 Найти цитируемый пост)
С этим никто не спорит.


Просмотрел еще раз, написал код по другому, тот же результат.
Есть функция, она прописывает в каждую ячейку фиксированной колонки номера, вот таким образом: 
1
1
1
2
2
2
3
3
3

в соответствие с этими номерами объединяю ячейки, вот код объединения ячеек 7 строки
Код

    if (ACol == 6)
        if (StringGrid->Cells[0][ARow] == StringGrid->Cells[0][ARow -1]) // объединяем порядковые номера
                {
                 if (StringGrid->Cells[0][ARow] == StringGrid->Cells[0][ARow -2])
                            {
                            Rect.top = 24*(ARow + 1 - SoilMoisture->TopRow) + ARow + 13 - SoilMoisture->TopRow;
                            SGCanvas->Brush->Color = clRed;
                            }

                }


Когда начинаю прокрутку таблицы то ячейки то все прорисовывается только нижняя ячейка: http://hostingkartinok.com/show-image.php?id=d4d4ebbd465dbe9a8d4dd70af2e993b0

Если вызвать свойство стринг грида Repaint(), то все не прорисованные ячейки рисуются нормально:
http://hostingkartinok.com/show-image.php?id=5cb572be5863826ee8e4cd1ec4034818

Автор: sawfish 7.2.2012, 14:18
Что такое SoilMoisture?
У вас на тех же строках нет прорисовки с первого скриншота, где есть прорисовка со второго скриншота?
И в каком месте вы Repaint() вызваете? Она же все равно руководствуется тем, что в OnDrawCell записано...

Автор: sawfish 12.2.2012, 16:19
Что-нибудь в итоге получилось?

Автор: Volfs 12.2.2012, 18:23
sawfish, добавил Repaint() в обработчик OnDrawCell при каждой прокрутке (сдвиге ячеек) это исправило прорисовку ячеек, но до нормального объединения еще еще далеко, допустим при щелчке в ячейку которая находиться под растянутой ячейкой можно поставить курсор...

Решил сделать таблицу из GridPanel.



Автор: sawfish 12.2.2012, 18:40
Даааа, "давно не брал я шашку в руки"...
У меня же на событие OnTopLeftChanged прописан вызов Repaint()  smile 

Автор: Volfs 13.2.2012, 10:16
Цитата(sawfish @  12.2.2012,  18:40 Найти цитируемый пост)
У меня же на событие OnTopLeftChanged прописан вызов Repaint() 


Бывает  smile  хе, я ведь я целился в этот смаил  smile сильно я промазал)))))

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

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