|
|
|
Создание компонента сложной формы (аккуратной контурной стрелки).
|
|||
|---|---|---|---|
|
#18+
Вопрос несколько шире, чем можно написать в заголовке и требует некоторого пояснения. В моей программке есть рисовалка, которая показывает результаты расчетов пример на картинке. Но всё что отображается по сути обычный рисунок на канве. Интерактивность обеспечивается перехватом координат по клику, сравнивание с изображенным на рисунке и вызовом соответствующих процедур. Но в определенный момент мне захотелось большей "интерактивности" (информация при наведении на элемент, информация при клике по тексту или рисунку, т.п.). Так же когда объемы и форматы выводимой информации стали весьма значительными добавление любых новых данных стало ну очень сложным (так как всё один рисунок + интерактивность + куча условий + каждый раз данные подгружаются разные, надо всё учитывать, ну и т.п.) решил попробовать сделать свой компонент наследника от панели (из-за удобной возможности "ручного" перетаскивания и широкого выбора событий) с лейблами для вывода текста и прочим подобным. Сделать это на первый взгляд оказалось не сложно (на картинки каждый шестигранник - компонент)... , но только на первый взгляд, одним из очень важных элементов визуального отображения результатов являются стрелки и вот тут возникла сложность, а как рисовать стрелки поверх панелек не перекрывая доступ к ним (яж хочу "интерактивность"). Ну и в общем основной вопрос в этом. Как реализовать такие стрелки? Наиболее очевидным для меня было сделать контурную стрелку и вырезать панельку по ней, так я и сделал, но результат сильно разочаровал: Во первых ужасное "сглаживание" наклонных линий (есть ли способ уменьшить эти лесенки?). Во вторых я никак не могу понять почему основания стрелок сужаются/расширяются? Что-то с округлением и непопаданием пикселей, вроде тригонометрия правильная? Почему криво обрезаются... Из решений пока думаю сделать панельку прозрачной(теми или иными способами) и рисовать стрелки старым способом. Я резонно предполагаю, что способ реализации выбранный мной ну очень спорный, потому открыт для любых адекватных предложений. Отдельные вопросы: 1. Создания сотен панелей потенциально не опасно для работы программы? Что-нибудь может поломаться? В принципе что по памяти, что по отклику проблем никаких не замечено. 2. Имеет ли смысл включать канвас на панели вместо создания на ней Image, это даст какие-то ресурсные преимущества, ну или, возможно, это правильнее? 3. Как можно ускорить создание панелек, несколько сотен панелек создается несколько секунд, что не много, но не мгновенно. 4. Можно ли рисовать прям поверх всех панелей при этом не ограничивая взаимодействия. 5. Почему Код: pascal 1. 2. при использовании динамического массива просто уничтожает работу системы. Винда зависает почти в ноль даже на многоядерном процессоре, данные на входе проверял - правильны. То есть такой код работает нормально: Код: pascal 1. 2. 3. 4. 5. 6. 7. А вот такой убивает винду (по крайней мере на Delphi7), почему? Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. Если интересен код, вот, сильно не бейте, писалось просто что в голову придет и я пока просто учусь: код Код: 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. 176. 177. 178. 179. 180. 181. 182. 183. 184. 185. 186. 187. 188. 189. 190. 191. 192. 193. 194. 195. 196. 197. 198. 199. 200. 201. 202. 203. 204. 205. 206. 207. 208. 209. 210. 211. 212. 213. 214. 215. 216. 217. 218. 219. 220. 221. 222. 223. 224. 225. 226. 227. 228. 229. 230. 231. 232. 233. 234. 235. 236. 237. 238. 239. 240. 241. 242. 243. 244. 245. 246. 247. 248. 249. Ну а теперь отдельно. Если мои вопросы слишком глупы для данного форума, то, вроде, есть более лояльные к новичкам форумы, просто это мне показался наиболее живым из существующих, если считаете что не стоит тут задавать, то более не буду. Если же мои вопрос слишком сложны и надо писать их в разделе "работа", то поясню, всё что я делаю, по сути делаю для "научного интереса", то есть мне за это никто не платит, я за это ничего не получу (кроме, возможно, благодарности). Можно сказать что я просто учусь и заодно что-то делаю облегчая жизнь себе и коллегам. Банально мне это интересно и нравится. П.С. Мне на форуме советовали книгу по типам данных Delphi, теперь никак не могу найти где именно мне её посоветовали. Скачал несколько по алгоритмам, хорошие книги, но пока не совсем то, что мне надо. Чтож за книгу там мне посоветовали... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.08.2019, 17:20 |
|
||
|
Создание компонента сложной формы (аккуратной контурной стрелки).
|
|||
|---|---|---|---|
|
#18+
Сомневаюсь, что кому-то нужно, но прицепил программку. Зато можно стрелочки порисовать :). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.08.2019, 17:22 |
|
||
|
Создание компонента сложной формы (аккуратной контурной стрелки).
|
|||
|---|---|---|---|
|
#18+
Андрей ИгоревичП.С. Мне на форуме советовали книгу по типам данных Delphi, теперь никак не могу найти где именно мне её посоветовали. Скачал несколько по алгоритмам, хорошие книги, но пока не совсем то, что мне надо. Чтож за книгу там мне посоветовали... Я вам писал о вот этой книжке: https://royallib.com/book/baknell_dgulian/fundamentalnie_algoritmi_i_strukturi_dannih_v_Delphi.html Но может быть вы что-то другое имеете в виду. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.08.2019, 18:12 |
|
||
|
Создание компонента сложной формы (аккуратной контурной стрелки).
|
|||
|---|---|---|---|
|
#18+
s62Андрей ИгоревичП.С. Мне на форуме советовали книгу по типам данных Delphi, теперь никак не могу найти где именно мне её посоветовали. Скачал несколько по алгоритмам, хорошие книги, но пока не совсем то, что мне надо. Чтож за книгу там мне посоветовали... Я вам писал о вот этой книжке: https://royallib.com/book/baknell_dgulian/fundamentalnie_algoritmi_i_strukturi_dannih_v_Delphi.html Но может быть вы что-то другое имеете в виду. А, эту книгу я уже скачал. Хорошая, но некоторая сложность в том, что алгоритмы из книги я нигде пока не использую (ну из начала кнаги по крайней мере), а что не использовал, то почти сразу забываю (треклятая дырявая память), сейчас добью "Библию Делфи" (ничего нового особо не узнал, но некоторое систематизировал) и попробую эту ещё раз уже пытаясь куда-нибудь применив. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.08.2019, 18:24 |
|
||
|
Создание компонента сложной формы (аккуратной контурной стрелки).
|
|||
|---|---|---|---|
|
#18+
Андрей ИгоревичСделать это на первый взгляд оказалось не сложно (на картинки каждый шестигранник - компонент)... Ну ты, брат, силен. Основную работу работать-то успеваешь? :) зы. если честно, ЯНХНП. Но, если суть вопроса в корректной и оптимальной отрисовке, дождись, пока ответит Соколинский Борис , он в этом вопросе продвинут, КМК. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.08.2019, 18:54 |
|
||
|
Создание компонента сложной формы (аккуратной контурной стрелки).
|
|||
|---|---|---|---|
|
#18+
Попробуй вместо панелек отрисовку в Tshape с перекрытым Draw и Brush.Style=bsClear. Да, регионы очень тормознутые, тем более когда их сотни. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.08.2019, 19:28 |
|
||
|
Создание компонента сложной формы (аккуратной контурной стрелки).
|
|||
|---|---|---|---|
|
#18+
ДокАндрей ИгоревичСделать это на первый взгляд оказалось не сложно (на картинки каждый шестигранник - компонент)... Ну ты, брат, силен. Основную работу работать-то успеваешь? :) зы. если честно, ЯНХНП. Но, если суть вопроса в корректной и оптимальной отрисовке, дождись, пока ответит Соколинский Борис , он в этом вопросе продвинут, КМК. Лето, пара отпусков, всё начальство отдыхает, вот и ковыряюсь пока время есть. По факту я уже раза 3-4 почти всё переделывал, на это (и на поиск ошибок от выхода за пределы массива) уходить куда больше времени, чем на создание чего-то нового :). Суть вопроса достаточно проста: как нарисовать красивую стрелочку поверх всего(панелек, имеджей, ...) на форме при том чтоб стрелка не перекрывала доступ к компонентам под ней . Остальное уже так, заранее ответил на возможные вопросы :) (по опыту). Нашел несколько готовых решений, но там везде идет перекрытие (стрелка на прозрачном фоне). Наверняка в сети "тыщу" раз это обсуждалось, но я не всегда умею грамотно спросить у гугла (обычно знаешь что спрашивать уже зная ответ). Ну и просто может кто по опыту скажет, что я вообще не правильно всё делаю и надо делать не так (ну там не панельки использовать, не так компоненты рисловать, и т.п.). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.08.2019, 19:40 |
|
||
|
Создание компонента сложной формы (аккуратной контурной стрелки).
|
|||
|---|---|---|---|
|
#18+
... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.08.2019, 20:36 |
|
||
|
Создание компонента сложной формы (аккуратной контурной стрелки).
|
|||
|---|---|---|---|
|
#18+
X-Cite Код: pascal 1. Программа сама найдет Range checking Спасибо, попробую, нужная вещь. Вроде и знал о данной возможности, а вроде и ленился найти как включить. Ведь каждый раз думаешь "ну в чем же ошибка, ну в этот раз точно не динамический массив", а по факту постоянно из-за него :), как я не люблю динамические массивы, будь они неладны... Василий 2Попробуй вместо панелек отрисовку в Tshape с перекрытым Draw и Brush.Style=bsClear. Да, регионы очень тормознутые, тем более когда их сотни. Попробую, пока что-то не разобрался как её на передний план вывести и будет ли прямоугольник компонента перекрывать доступ, но поковыряюсь. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.08.2019, 21:03 |
|
||
|
Создание компонента сложной формы (аккуратной контурной стрелки).
|
|||
|---|---|---|---|
|
#18+
Почему в пользу "интеракивности" был выбран TWinControl + SetWindowRgn, а не просто TGraphicsControl ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.08.2019, 22:20 |
|
||
|
Создание компонента сложной формы (аккуратной контурной стрелки).
|
|||
|---|---|---|---|
|
#18+
Андрей Игоревич, ЖСТКО Такие вещи только вручную рисуют, через промежуточный буфер - двойная буферизация называется, в сети полно примеров Ссли уж так охота всё отдельынми компонентами, то наследуйтесь от TGraphicsControl, он у вас хоть окна создавать не будет (дискрипторы окон лимитированный ресурс) а CreatePolygonRgn у вас выпадает из-за того, что вы ему адрес не буфера передаёте, а условно "мусор", используйте с ним [0] Код: pascal 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.08.2019, 00:15 |
|
||
|
Создание компонента сложной формы (аккуратной контурной стрелки).
|
|||
|---|---|---|---|
|
#18+
kealon(Ruslan)(дискрипторы окон лимитированный ресурс) Насколько я помню, со времён Windows 95 ситуация несколько изменилась. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.08.2019, 00:49 |
|
||
|
Создание компонента сложной формы (аккуратной контурной стрелки).
|
|||
|---|---|---|---|
|
#18+
softwarerkealon(Ruslan)(дискрипторы окон лимитированный ресурс) Насколько я помню, со времён Windows 95 ситуация несколько изменилась.если к делу подходят специалисты :-) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.08.2019, 09:16 |
|
||
|
Создание компонента сложной формы (аккуратной контурной стрелки).
|
|||
|---|---|---|---|
|
#18+
DimaBrПочему в пользу "интеракивности" был выбран TWinControl + SetWindowRgn, а не просто TGraphicsControl ? Что на текущий момент знал, то и использовал. Сейчас, по мере наличия свободного времени, буду про предложенное вами читать и пробовать. kealon(Ruslan)Андрей Игоревич, ЖСТКО Такие вещи только вручную рисуют, через промежуточный буфер - двойная буферизация называется, в сети полно примеров Ссли уж так охота всё отдельынми компонентами, то наследуйтесь от TGraphicsControl, он у вас хоть окна создавать не будет (дискрипторы окон лимитированный ресурс) а CreatePolygonRgn у вас выпадает из-за того, что вы ему адрес не буфера передаёте, а условно "мусор", используйте с ним [0] Код: pascal 1. Спасибо, попробую поискать примеры в сети "двойной буферизации". На счет "лимитированного ресурса", вроде пару тысяч для теста создавал, ничего не падало (хотя программка и начала тормозить), но буду иметь в виду и попробую предложенные способы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.08.2019, 10:26 |
|
||
|
Создание компонента сложной формы (аккуратной контурной стрелки).
|
|||
|---|---|---|---|
|
#18+
Андрей Игоревич, На стандартном канвасе красивой графики не получить. Нужно делать на GDI+, или еще лучше на Direct2D. Никаких контролов, все рисовать самому, все объекты свои, каждый умеет отрисовываться и обрабатывать события. При желании, за пол года вполне сможете сделать нормальную версию. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.08.2019, 12:51 |
|
||
|
Создание компонента сложной формы (аккуратной контурной стрелки).
|
|||
|---|---|---|---|
|
#18+
Андрей Игоревич, Попробуйсте с TpaintBox, но качественной графики от него не ждите. Демка с просторов интернета. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.08.2019, 13:15 |
|
||
|
Создание компонента сложной формы (аккуратной контурной стрелки).
|
|||
|---|---|---|---|
|
#18+
Вопрос делится на два: сделать в дельфи и сделать хорошо и быстро. Насчет первого вопроса... Ну, раз Вы начали сами программировать то, что хотите - то продолжайте, это полезно. Создать своего наследника панели это очень круто, на него можно кинуть фрейм - удобство дельфовой визуальной разработки засверкает новыми красками. Стрелочки можно нарисовать на холсте того компонента, на котором лежат Ваши наследники панели. Правда знание особенностей дельфовой объектной обертки над WIN API вроде как мало востребовано. Думаю что даже меньше востребовано чем просто хорошее знание WIN API. IMHO хорошее знание WIN API лучше сочетается с билдером. Насчет второго... Тут нужно подобрать хорошую технологию. Из известных мне - SVG. Он не только стрелочки сможет рисовать. Но для интерактивности потребуется работать с компонентом TWebBrowser или поискать полную реализацию под дельфан. А такого, скорее всего нет, потому что SVG по возможностям почти как HTML(тока css не нужен, таки картинка). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.08.2019, 14:22 |
|
||
|
Создание компонента сложной формы (аккуратной контурной стрелки).
|
|||
|---|---|---|---|
|
#18+
stanilarSVG по возможностям почти как HTML(тока css не нужен, таки картинка). Еще как нужен. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.08.2019, 14:29 |
|
||
|
Создание компонента сложной формы (аккуратной контурной стрелки).
|
|||
|---|---|---|---|
|
#18+
asviridenkovЕще как нужен. При использовании в рамках HTML - можно поставить корню ширину, высоту и позицию. А в остальном у него все свое, это ведь картинка. Зачем картинке css? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.08.2019, 14:46 |
|
||
|
Создание компонента сложной формы (аккуратной контурной стрелки).
|
|||
|---|---|---|---|
|
#18+
stanilarasviridenkovЕще как нужен. При использовании в рамках HTML - можно поставить корню ширину, высоту и позицию. А в остальном у него все свое, это ведь картинка. Зачем картинке css? Это не картинка, это набор векторных элементов с CSS стилями. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.08.2019, 15:02 |
|
||
|
Создание компонента сложной формы (аккуратной контурной стрелки).
|
|||
|---|---|---|---|
|
#18+
asviridenkovЭто не картинка, это набор векторных элементов с CSS стилями. Вот постоянно сталкиваюсь с SVG. Даже либу для построения графиков написал. Но не понимаю тебя. SVG, это аналог HTML. В нем есть место и для CSS, если кому хочется. Кому не хочется - тот обходится без CSS. Код с примером можешь привести, зачем нужен CSS в SVG? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.08.2019, 15:11 |
|
||
|
Создание компонента сложной формы (аккуратной контурной стрелки).
|
|||
|---|---|---|---|
|
#18+
stanilarasviridenkovЭто не картинка, это набор векторных элементов с CSS стилями. Вот постоянно сталкиваюсь с SVG. Даже либу для построения графиков написал. Но не понимаю тебя. SVG, это аналог HTML. В нем есть место и для CSS, если кому хочется. Кому не хочется - тот обходится без CSS. Код с примером можешь привести, зачем нужен CSS в SVG? Для всего. Атрибут style у элементов SVG, это тоже CSS. А, например, интерактивность вроде .vbar g:hover {fill-opacity: 0.7} только через глобальный stylesheet делается. Да, какие-то свойства в SVG можно задавать через атрибуты, но не все, не всегда, и вообще не лучший вариант. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.08.2019, 15:18 |
|
||
|
Создание компонента сложной формы (аккуратной контурной стрелки).
|
|||
|---|---|---|---|
|
#18+
asviridenkov.vbar g:hover {fill-opacity: 0.7} Код: javascript 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. asviridenkovДа, какие-то свойства в SVG можно задавать через атрибуты, но не все, не всегда, и вообще не лучший вариант. IMHO самый лучший вариант. Такую SVG картинку всегда можно экспортировать/импортировать. А при программировании интерактивной картинки со стороны js - вообще только так. Как ты каллбек mouseleave/mouseenter из SVG в js пробросишь, если у тебя hover из css задается? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.08.2019, 15:27 |
|
||
|
Создание компонента сложной формы (аккуратной контурной стрелки).
|
|||
|---|---|---|---|
|
#18+
stanilar, В моем примере устанавливалось для всех элементов определенного класса, а здесь для конкретных. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.08.2019, 16:12 |
|
||
|
Создание компонента сложной формы (аккуратной контурной стрелки).
|
|||
|---|---|---|---|
|
#18+
asviridenkovАндрей Игоревич, При желании, за пол года вполне сможете сделать нормальную версию. Это очень жестоко (пол года)... Но по возможности попробую поизучать GDI+. Kast2KАндрей Игоревич, Попробуйсте с TpaintBox, но качественной графики от него не ждите. Демка с просторов интернета. Пока поверхностно потыкал пример (но, кстати, на 7й не работал, только на 10), но там перекрытие прямоугольником компонентов за линией, с TPaintBox тоже, но надо повникать, как я понял он позже 7ки появился (нашел его только в 10ке). stanilarПравда знание особенностей дельфовой объектной обертки над WIN API вроде как мало востребовано. Думаю что даже меньше востребовано чем просто хорошее знание WIN API. IMHO хорошее знание WIN API лучше сочетается с билдером. На текущий момент меня востребованность не очень волнует, приложение пишется "для себя". Более обидно будет, если Делфи окончательно прикроют (грустно изучать то, что уже не будет развиваться). А вопрос, а как Чарт в 10й делфе рисует свои картинки? Ну просто для сравнения графики в нем в 7ке и 10ке: Ну и другие вещи (всякие скругленные бары и прочее) они рисует просто прекрасно. asviridenkovstanilarпропущено... Вот постоянно сталкиваюсь с SVG. Даже либу для построения графиков написал. Но не понимаю тебя. SVG, это аналог HTML. В нем есть место и для CSS, если кому хочется. Кому не хочется - тот обходится без CSS. Код с примером можешь привести, зачем нужен CSS в SVG? Для всего. Атрибут style у элементов SVG, это тоже CSS. А, например, интерактивность вроде .vbar g:hover {fill-opacity: 0.7} только через глобальный stylesheet делается. Да, какие-то свойства в SVG можно задавать через атрибуты, но не все, не всегда, и вообще не лучший вариант. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.08.2019, 16:33 |
|
||
|
|

start [/forum/topic.php?fid=58&msg=39854830&tid=2038657]: |
0ms |
get settings: |
9ms |
get forum list: |
16ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
161ms |
get topic data: |
7ms |
get forum data: |
2ms |
get page messages: |
64ms |
get tp. blocked users: |
1ms |
| others: | 216ms |
| total: | 482ms |

| 0 / 0 |
