|
|
|
Проблема с прорисовкой StringGrid
|
|||
|---|---|---|---|
|
#18+
Добрый день. Таблица StringGrid рисуется "вручную" - объединяются ячейки, выводится текст в нужном месте, закрашиваются нужным цветом. Обнаружилась проблема. Если поверх таблицы выводится какое-то диалоговое окно, то при смещении это окна мышкой или просто исчезновении окна таблица иногда прорисовывается плохо - часть букв исчезает или часть полосок. Почему это происходит, как устранить? Ссылка на скриншот: https://fotki.yandex.ru/next/users/fedordobronravoff/album/556245/view/1861634 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.07.2017, 13:33:09 |
|
||
|
Проблема с прорисовкой StringGrid
|
|||
|---|---|---|---|
|
#18+
11.07.2017 13:33, Федор_Федор пишет: > Таблица StringGrid рисуется "вручную" всё зависит от того, как именно. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.07.2017, 14:31:07 |
|
||
|
Проблема с прорисовкой StringGrid
|
|||
|---|---|---|---|
|
#18+
Мимопроходящий11.07.2017 13:33, Федор_Федор пишет: > Таблица StringGrid рисуется "вручную" всё зависит от того, как именно. А на что нужно обратить внимание? Наверное, в чужом коде ковыряться сложно, но на всякий случай приведу: Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. 85. 86. 87. 88. 89. 90. 91. 92. 93. 94. 95. 96. 97. 98. 99. 100. 101. 102. 103. 104. 105. 106. 107. 108. 109. 110. 111. 112. 113. 114. 115. 116. 117. 118. 119. 120. 121. 122. 123. 124. 125. 126. 127. 128. 129. 130. 131. 132. 133. 134. 135. 136. 137. 138. 139. 140. 141. 142. 143. 144. 145. 146. 147. 148. 149. 150. 151. 152. 153. 154. 155. 156. 157. 158. 159. 160. 161. 162. 163. 164. 165. 166. 167. 168. 169. 170. 171. 172. 173. 174. 175. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.07.2017, 14:35:46 |
|
||
|
Проблема с прорисовкой StringGrid
|
|||
|---|---|---|---|
|
#18+
Федор_Федор для начала сделайте использование двойного буфера при отрисовке, т.е. сначала формируете изображение в памяти, а на экран выводите из сформированного изображения через CopyRect ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.07.2017, 15:40:07 |
|
||
|
Проблема с прорисовкой StringGrid
|
|||
|---|---|---|---|
|
#18+
asutp2, Большое спасибо! А как это сделать, не подскажете? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.07.2017, 15:45:49 |
|
||
|
Проблема с прорисовкой StringGrid
|
|||
|---|---|---|---|
|
#18+
Я просто не понимаю, как это работает... Каждый раз, когда что-то (второе окно) закрывает форму со StringGrid, то, как я понимаю, вызывается метод OnDraw и форма перерисовывается заново. Нужно сделать копию изображения (формы вместе со StringGrid) я, наверное, смогу, а вот как потом ее выводить откуда-то куда-то, да еще сверху ж нужно рисовать закрывающее (второе) окно... Ничего не понимаю... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.07.2017, 15:49:23 |
|
||
|
Проблема с прорисовкой StringGrid
|
|||
|---|---|---|---|
|
#18+
Федор_Федорasutp2, Большое спасибо! А как это сделать, не подскажете? А что вам непонятно в словах "буфер в памяти" или "CopyRect"? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.07.2017, 15:49:31 |
|
||
|
Проблема с прорисовкой StringGrid
|
|||
|---|---|---|---|
|
#18+
Квейд, Намек понял... Буду изучать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.07.2017, 15:53:28 |
|
||
|
Проблема с прорисовкой StringGrid
|
|||
|---|---|---|---|
|
#18+
Почитал про двойную буферизацию, даже программку написал с самолетиком летающим, но не понял при чем тут буфферизация. Создаем два битмапа: Object.bmp и PartOfBackground.bmp. Первый - движущийся объект (самолет). Второй - кусочек фона, который закрывает собой движущийся объект. Размеры битмапов одинаковые. Работает это так: Repeat 1. Перед тем, как вывести объект, определяем его новое положение относительно фона и копируем во второй битмап кусочек фона под объектом. 2. Выводим объект. 3. Восстанавливаем фон, закрыв наш объект кусочком фона, сохраненным на первом шаге. Until (рак на горе свистнет) Я не понимаю, при чем тут "двойная буферизация". Просто работа с двумя битмапами. Я примерно так всегда делал. Полезное отличие лишь в том, что второй битмап - это не фон целиком, а лишь тот его кусочек, который перекроется движущимся объектом. Не понимаю, как это применить в моем случае. Как-то нужно отлавливать в Виндовс события - появление объектов, которые могут перекрыть рабочее окно моей программы, затем нужно делать скриншот окна программы, и уже затем разрешать "всплывшему" объекту прорисовываться на экране. И затем нужно перехватывать смещение этого объекта и предварительно выводить из битмапа скриншот окна программы... Ничего не понимаю... Товарищи программисты, подскажите, пожалуйста, куда копать? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.07.2017, 13:10:15 |
|
||
|
Проблема с прорисовкой StringGrid
|
|||
|---|---|---|---|
|
#18+
Федор_Федор двойная буферизация подразумевает, что изображение формируется в буфер, а на экране отображается только по необходимости. Конкретно в твоем приведенном выше коде видно, что отрисовка ячейки таблицы идет каждый раз заново - сначала закрашивается фон, потом рисуются линии, выводится текст. Визуально это приводит к тому, что во первых изображение ячеек мигает, во вторых из за долгой отрисовки часть событий WM_PAINT теряется, что и подтверждается твоей проблемой с проблемной отрисовкой. Поэтому и нужно использовать буферизацию. Само изображение в буфере ты изменяешь при изменении таблицы (например по изменению текста либо каких нибудь нужных условий, либо при банальном скролировании в таблице), а в событии OnDataDrawCell должен быть просто вызов CopyRect, который отрисовывает нужную область. CopyRect работает достаточно быстро, поэтому пропуска событий отрисовки не будет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.07.2017, 13:44:24 |
|
||
|
Проблема с прорисовкой StringGrid
|
|||
|---|---|---|---|
|
#18+
asutp2, большое спасибо. Потихоньку "врубаюсь". asutp2 Федор_Федор Поэтому и нужно использовать буферизацию. Само изображение в буфере ты изменяешь при изменении таблицы (например по изменению текста либо каких нибудь нужных условий, либо при банальном скролировании в таблице), а в событии OnDataDrawCell должен быть просто вызов CopyRect, который отрисовывает нужную область. CopyRect работает достаточно быстро, поэтому пропуска событий отрисовки не будет. Вот тут не понял. При изменении текста или скроллировании я могу создать битмап и самостоятельно, с нуля, рисовать на канве битмапа таблицу, (правда, это будет большая работа), а затем сохранять это изображение в виде битмпа в память. А в событии OnDrawCell просто выводить сформированный битмап в заданный прямоугольник формы. Правда, я не понимаю... Если пользователь захочет ткнуть в ячейку таблицы, то он ткнет в нарисованный на холсте битмап... "OnDataDrawCell" - это описка? Такого события вроде нет у StringGrid.... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.07.2017, 14:52:53 |
|
||
|
Проблема с прорисовкой StringGrid
|
|||
|---|---|---|---|
|
#18+
Федор_ФедорЕсли пользователь захочет ткнуть в ячейку таблицы, то он ткнет в нарисованный на холсте битмап... Так всегда и везде и происходит. В играх, в экселе, в убунту. Пользователь тыкает в рисунок, а софт смотрит, как это действие интерпретировать. :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.07.2017, 15:06:10 |
|
||
|
Проблема с прорисовкой StringGrid
|
|||
|---|---|---|---|
|
#18+
wadman, спасибо. Правильно ли я понял идею: 1. Создаем процедуру PiantTable, которая "вручную" рисует StringGrid. Для этого я должен самостоятельно написать скрытый от меня механизм "поячеечного" рисования таблицы. То есть создать двойной вложенный цикл для строк и столбцов и в теле цикла уже привести тот код, что сейчас находится в процедуре OnDrawCell. Плюс нужно как-то учесть добавление нового текста в ячейки и изменение картинки при скроллировании. Процедура PaintTable не рисует таблицу на канве битмапа Buf.bmp. Этот битмап сидит где-то в памяти, то есть как раз в буфере. Так мы рисунок буфферизировали. 2. В обработчиках событий сроллирования, ввода текста, щелчка мышью указываем запуск процедуры PaintTable. Процедура учитывает что мы ввели с клавы или мыши и рисует соответсвующее изображение таблицы, сохраняя его в буфере. 3. В обработчике OnDrawCell стираем абсолютно все и оставляем лишь вывод нашей картинки, которая ранее была сформирована процедурой PaintTable. Вот что непонятно: зачем мне тогда компонент StringGrid, если я абсолютно все элементы таблицы рисую сам, сам считываю координаты мыши, определяю по какой ячейке пытается кликнуть пользователь, сам выводу текст и т.д. "Заблудилась я"... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.07.2017, 15:25:16 |
|
||
|
Проблема с прорисовкой StringGrid
|
|||
|---|---|---|---|
|
#18+
"не рисует" заменить на "рисует". Сорри. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.07.2017, 15:26:31 |
|
||
|
Проблема с прорисовкой StringGrid
|
|||
|---|---|---|---|
|
#18+
Федор_ФедорПравильно ли я понял идею: Сначала попробуй Код: pascal 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.07.2017, 15:32:38 |
|
||
|
Проблема с прорисовкой StringGrid
|
|||
|---|---|---|---|
|
#18+
wadmanФедор_ФедорПравильно ли я понял идею: Сначала попробуй Код: pascal 1. УРА!!! Получилось! Вот... Специально ж, наверное, молчали... Целый день угрохал... СПАСИБО! P.S.: ну а идею-то я правильно понял с "буфферизацией"? Непонятно, почему она "двойной" называется? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.07.2017, 15:39:32 |
|
||
|
Проблема с прорисовкой StringGrid
|
|||
|---|---|---|---|
|
#18+
Федор_ФедорНепонятно, почему она "двойной" называется? Тем, что без двойной буферизации рисуешь сразу на экран (то есть отрисовка в реальном времени и если что-то рисуется долго, то это заметно), а с дв. буферизацией сначала рисуешь во внутренний буфер (VCL сама его для контролов подставляет, то есть для них нет разницы с точки зрения кода), а затем VCL уже одним махом выводит готовый рисунок . ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.07.2017, 15:43:00 |
|
||
|
Проблема с прорисовкой StringGrid
|
|||
|---|---|---|---|
|
#18+
wadman, да, буферизация есть - сначала в буфер, а потом из буфера. То есть используется один буфер. Почему именно "двойной" пока не понял. В примере с самолетиком фон рисуется и помещается в одну переменную (один "буфер"), а самолетик рисуется и помещается во второй буфер. А при движении самолета уже ничего не рисуется заново, а просто обе готовые картинки подсовываются из двух буферов... В общем, туплю, похоже, как обычно... Спасибо всем за помощь! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.07.2017, 15:55:47 |
|
||
|
Проблема с прорисовкой StringGrid
|
|||
|---|---|---|---|
|
#18+
Федор_ФедорПочему именно "двойной" пока не понял. "As you probably know, a double buffer normally involves creating an off-screen memory buffer the same size as the visual component. Writing/drawing is performed on this buffer and when complete, the entire buffer is "swapped" so that it is now painted on the visual component." https://stackoverflow.com/questions/1408664/why-is-doublebuffered-disabled-by-default ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.07.2017, 16:55:02 |
|
||
|
Проблема с прорисовкой StringGrid
|
|||
|---|---|---|---|
|
#18+
schi, спасибо! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.07.2017, 09:03:57 |
|
||
|
Проблема с прорисовкой StringGrid
|
|||
|---|---|---|---|
|
#18+
На всякий случай, для таких же как я "программистов"... Самое доходчивое описание двойной буферизации нашел в Википедии: https://ru.wikipedia.org/wiki/Двойная_буферизация Буфферизация называется "двойной" по той простой причине, что используется не один буфер, а ДВА. Первый буфер - "экранный". В нем лежит готовая картинка, которую можно в любой момент схватить и вывести на экран. Второй буфер - "рабочий", в него сохраняется картинка, которая уныло чертится, например, моей процедурой рисования таблицы. Как только картинка начертилась, буферы меняются местами: "экранный" становится "рабочим", а "рабочий" - "экранным". Таким образом, в "экранном" буфере оказывается новая картинка, готовая к выводу на экран. А "рабочий" буфер содержит устаревшую картинку, которую можно "стирать" и чертить новый вариант. Пока тянется процедура формирования новой картинки, для вывода на экран используется "экранный" буфер. Двойная буфферизация кушает в 2 раза больше памяти. Нет смысла использовать двойную буфферизацию в тех случаях, когда время, необходимое для формирования изображения, меньше, чем период обновления экрана (обычно 1/60 секунды - для LCD). Все вышеуказанное - мои предположения... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.07.2017, 10:36:38 |
|
||
|
Проблема с прорисовкой StringGrid
|
|||
|---|---|---|---|
|
#18+
Федор_ФедорТаблица StringGrid рисуется "вручную" - объединяются ячейки, выводится текст в нужном месте, закрашиваются нужным цветом. и всё? больше ничего другого? таких гридов готовых на Торри выше крыши вот например бесплатный и живой - http://avemey.com/zcolorstringgrid/zcolorstringgrid.php?lang=ru ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.07.2017, 11:04:05 |
|
||
|
Проблема с прорисовкой StringGrid
|
|||
|---|---|---|---|
|
#18+
авторвот например бесплатный и живой Он, у целом, нормальный, но бывает, что и подглюкивает. Потому для самых ответственных задач свои способы отрисовки подходят лучше. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.07.2017, 11:54:37 |
|
||
|
Проблема с прорисовкой StringGrid
|
|||
|---|---|---|---|
|
#18+
Любезный, ну а почему бы не подправить и допилить ? или свой велосипед никогда не подглюкивает и никогда не призходится править ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.07.2017, 14:44:16 |
|
||
|
Проблема с прорисовкой StringGrid
|
|||
|---|---|---|---|
|
#18+
авторну а почему бы не подправить и допилить ? Как говорится, кто вносит предложение, тот его и исполняет. авторили свой велосипед никогда не подглюкивает и никогда не призходится править ? Очень редко, так как велосипед гораздо проще и затачивается под конкретную задачу. Соответственно, и править его гораздо лехче. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.07.2017, 15:36:08 |
|
||
|
|

start [/forum/topic.php?fid=58&msg=39490575&tid=2042018]: |
0ms |
get settings: |
7ms |
get forum list: |
15ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
188ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
57ms |
get tp. blocked users: |
1ms |
| others: | 210ms |
| total: | 492ms |

| 0 / 0 |
