|
|
|
Создание компонента сложной формы (аккуратной контурной стрелки).
|
|||
|---|---|---|---|
|
#18+
Андрей ИгоревичёёёёёАвтар, http://docwiki.embarcadero.com/RADStudio/Rio/en/Methods_(Delphi)#Final_Methods Слегка не понял. Да и на 7ке, вроде, не работает, как я понимаю. Но поизучаю поподробнее. ... "Запечатывание" виртуального метода, запрещающее перекрытие в наследнике. Да, в 7-ке не работает. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.10.2019, 18:19 |
|
||
|
Создание компонента сложной формы (аккуратной контурной стрелки).
|
|||
|---|---|---|---|
|
#18+
Андрей ИгоревичА, и ещё хотел спросить, можно ли сделать, что бы процедура/функция или свойство было доступно только для потомка (не глубже), а уже для основной программы всё было недоступно, кажется где-то я что-то такое видел... Может быть, тебе protected члены нужны? http://www.delphibasics.ru/Protected.php protected члены класса доступны в наследниках, но из других объектов - недоступны. Ну, кроме тех, которые в том же модуле (юните) находятся. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.10.2019, 18:24 |
|
||
|
Создание компонента сложной формы (аккуратной контурной стрелки).
|
|||
|---|---|---|---|
|
#18+
ёёёёёalekcvp strict protected ? Из другой оперы, немного. ёёёёёМожет быть, тебе protected члены нужны? http://www.delphibasics.ru/Protected.php WAT? O_o ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.10.2019, 18:39 |
|
||
|
Создание компонента сложной формы (аккуратной контурной стрелки).
|
|||
|---|---|---|---|
|
#18+
ёёёёёАндрей ИгоревичА, и ещё хотел спросить, можно ли сделать, что бы процедура/функция или свойство было доступно только для потомка (не глубже), а уже для основной программы всё было недоступно, кажется где-то я что-то такое видел... Может быть, тебе protected члены нужны? http://www.delphibasics.ru/Protected.php protected члены класса доступны в наследниках, но из других объектов - недоступны. Ну, кроме тех, которые в том же модуле (юните) находятся. Я вот всегда туплю в определении "наследник". Код: pascal 1. 2. 3. Вопрос - наследник/потомок это ClassB от ClassA или ClassD потомок от ClassB? Или тут более хитрая терминология. Просто в интернете и то и то видел как называют потомком. В первом случае protected доступны, во втором нет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.10.2019, 18:55 |
|
||
|
Создание компонента сложной формы (аккуратной контурной стрелки).
|
|||
|---|---|---|---|
|
#18+
Андрей Игоревичёёёёёпропущено... Может быть, тебе protected члены нужны? http://www.delphibasics.ru/Protected.php protected члены класса доступны в наследниках, но из других объектов - недоступны. Ну, кроме тех, которые в том же модуле (юните) находятся. Я вот всегда туплю в определении "наследник". Код: pascal 1. 2. 3. Вопрос - наследник/потомок это ClassB от ClassA или ClassD потомок от ClassB? Или тут более хитрая терминология. Просто в интернете и то и то видел как называют потомком. В первом случае protected доступны, во втором нет. Класс TClassA - родитель класса TClassВ. Класс TClassB - наследник класса TClassА. Класс TClassB связан с классом TClassА отношением "наследование". Объекта класса TClassD агрегирован в класс TClassB. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.10.2019, 19:01 |
|
||
|
Создание компонента сложной формы (аккуратной контурной стрелки).
|
|||
|---|---|---|---|
|
#18+
ёёёёёкласса TClassD агрегирован в класс TClassB. Жуть, первый раз вижу такой термин применительно к Delphi. В общем я писал про доступность из агрегированных классов к процедурам ээ...ээ.. агрегатора? И наоборот. Хотя основной мой вопрос был, почему Inherites проскакивало через несколько наследников(тут всё корректно) сразу к Panel, может ли быть это связано с owner, который я не переприсваивал у потомков (обходясь parent). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.10.2019, 19:12 |
|
||
|
Создание компонента сложной формы (аккуратной контурной стрелки).
|
|||
|---|---|---|---|
|
#18+
Андрей Игоревич...почему Inherites проскакивало через несколько наследников... Не было такого, "мамой клянусь". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.10.2019, 19:23 |
|
||
|
Создание компонента сложной формы (аккуратной контурной стрелки).
|
|||
|---|---|---|---|
|
#18+
В общем случае мне больше нравятся термины: "унаследован от", "предок", "наследник" ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.10.2019, 22:27 |
|
||
|
Создание компонента сложной формы (аккуратной контурной стрелки).
|
|||
|---|---|---|---|
|
#18+
Андрей ИгоревичНу так, в рамках развития потихоньку приучаю себя к культуре :), когда программа разрастается до очень больших размеров это очень помогает. Ну и очень помогает, когда свой код читаешь через некоторое время.Это все жалкое подобие развитию при работе в команде - регулярное code review с обсуждением спорных мест и решений, плюс сразу можно оценить качество кода и стоимость поддержки. Если твой код будет прозрачен для других программистов - значит движение идет в правильном направлении. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.10.2019, 22:37 |
|
||
|
Создание компонента сложной формы (аккуратной контурной стрелки).
|
|||
|---|---|---|---|
|
#18+
Андрей ИгоревичХотя основной мой вопрос был, почему Inherites проскакивало через несколько наследников(тут всё корректно) сразу к Panel Единственное, что мне приходит в голову - это то, что где-то в этой цепочке у переопределения методов было пропущено слово override (при этом должно быть предупреждение от компилятора), в результате inherites обращался к последнему переопределённому методу, а не к этим. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.10.2019, 13:18 |
|
||
|
Создание компонента сложной формы (аккуратной контурной стрелки).
|
|||
|---|---|---|---|
|
#18+
В свете перехода мной с Delphi 7 на 10 начинают возникать куча мелких непонятных проблем в уже, казалось бы сделанных вещах. Вкратце. "Главная" панель - перехватываю paint - рисую нужную мне картинку (через буферный BitMap). На "главной" панели размещены другие панели с дополнительной информацией, в них рисую так же. Часть функционала - перетаскивание, редактирование содержания и масштабирование информационных панелей напрямую. С большим трудом в 7ке сделал, чтоб всё работало плавно и удобно. Перешел на 10ку (ибо приложение надо 64битное) и при срабатывании события Paint (которое Override ) панель в самом начале кода события(до выполнения чего бы то ни было) закрашивается в базовый (выбранный цвет), из-за чего происходит раздражающее мерцание. На гифке это не так заметно, пропускает кадры - в жизни прям дико мигает. Масштабирую через perform, который, периодически и вызывает то самое событие paint, но через раз, иногда может просто закрасить в серый не вызвав событие (потому пока дополнительно вызываю repaint); код масштабирования и перетаскивания Код: 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. С "главной" панелью (которая тоже мерцала) часть проблем решил через override Repaint с кодом InvalidateRect( Handle, NIL, FALSE ) ; и вызов обновления картинки только через Repaint; Так же главная панель так же окрашивалась в серый - если один из дочерних компонентов менял родителя (у меня при каждой отрисовке сбрасывались родители, а потом назначались в зависимости от того, что рисуется). Решил убрав такое присвоение, но логики всё равно не понял, почему перед Pаint именно в этом случае панель закрашивалась в серый, а без присвоения наследников - не окрашивалась, а нормально перерисовывалась. Главный вопрос: Почему панель закрашивается в серый до Override paint, как это отключить? (И почему на 7ке его не было, и, кстати, если использовать res 7ки, но компилировав в 10 - не мерцает). просто мыслиА вообще я малость замучился рисовать всё через Paint - так как там тотальное перекрёстное вызывание этих событий у всех дочерних и родительских компонентов. Меняешь что-то на "дочерней" панели, она вызывает Paint основной, та вызывает Paint всех дочерних, в том числе и той, которая вызвала обновление, а если там что-то завязано на текущее состояние... Любая неосторожная строчка кода сразу вызывает СтакОверфлоу или зацикленное мигание. А уж Resize - это вообще отдельная песня, так как у меня дочерние панели масштабируются пропорционально основной, сделать так, что бы все Paint-ы не вызывались по 100+ раз при каждой итерации изменения размеров - прям отдельная головная боль. В общем на будущее буду искать иные пути рисования, либо надо как-то очень хорошо всё продумывать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.01.2020, 13:10 |
|
||
|
Создание компонента сложной формы (аккуратной контурной стрелки).
|
|||
|---|---|---|---|
|
#18+
Андрей Игоревич, Мерцание панели может быть связано со свойством ParentBackground. Установи его в False. Если не поможет, попробуй обрабатывать сообщение WM_ERASEBKGND, устанавливая результат обработки AMessage.Result := 1; ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.01.2020, 13:25 |
|
||
|
Создание компонента сложной формы (аккуратной контурной стрелки).
|
|||
|---|---|---|---|
|
#18+
Андрей Игоревич, Код: pascal 1. 2. 3. 4. Так ведь вам предлагали не использовать множество панелей, а рисовать всё на одном канвасе, например PaintBox'а. Я так понимаю, что у вас было уже что-то готовое на панелях, потому вы не стали радикально переделывать. Но ваш вариант содержит в себе просто море ненужного обременения - все эти окна (TPanel это ведь наследник от TWinControl) ну и вообще весь ненужный в вашем случае код элементов управления. Уже писали, в том числе люди с наверное гораздо большим опытом в этой области, чем у меня, я тоже писал - вам можно было сделать процедурные или объектные обертки для рисования элементов картинки и всё рисовать на PaintBox (точнее - рисовать на невидимом TBitmap, а потом копировать его на PaintBox). И никаких панелек. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.01.2020, 13:28 |
|
||
|
Создание компонента сложной формы (аккуратной контурной стрелки).
|
|||
|---|---|---|---|
|
#18+
s62, только была бы задача обработки кликов и перетаскивания элементов картинки. Но мне кажется, что она тоже вполне решаемая. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.01.2020, 13:33 |
|
||
|
Создание компонента сложной формы (аккуратной контурной стрелки).
|
|||
|---|---|---|---|
|
#18+
Kazantsev Alexey Андрей Игоревич, Мерцание панели может быть связано со свойством ParentBackground. Установи его в False. Если не поможет, попробуй обрабатывать сообщение WM_ERASEBKGND, устанавливая результат обработки AMessage.Result := 1; Очень интересно. ParentBackground:=false; при перетаскивании ( (perform(WM_SysCommand, $F012, 0) ) теперь ничего не мерцает, прям совсем, а вот при изменении размеров perform(WM_SysCommand, $F002+, 0); , мерцает, но как-то совем иначе, буду разбираться. А вот перехват обработку сообщений я пока до конца не освоил, это через так делать? Код: pascal 1. 2. 3. 4. 5. 6. s62 Так ведь вам предлагали не использовать множество панелей, а рисовать всё на одном канвасе, например PaintBox'а. Я так понимаю, что у вас было уже что-то готовое на панелях, потому вы не стали радикально переделывать. Но ваш вариант содержит в себе просто море ненужного обременения - все эти окна (TPanel это ведь наследник от TWinControl) ну и вообще весь ненужный в вашем случае код элементов управления. Уже писали, в том числе люди с наверное гораздо большим опытом в этой области, чем у меня, я тоже писал - вам можно было сделать процедурные или объектные обертки для рисования элементов картинки и всё рисовать на PaintBox (точнее - рисовать на невидимом TBitmap, а потом копировать его на PaintBox). И никаких панелек. Все многоугольники рисуются именно через свои компоненты, даже не PintBox, а через TComponent, где я уже сам свои Paint и прочие вещи писал. Панели используются именно для "Легенды", так как нагромождать всё через основной канвас ну очень сильно загромождает код (у меня там куча всяких событий и действий на всё привязано, один перехват мышки в едином канвасе будет просто огромным). Изначально и легенду тоже рисовал на канвасе, но в итоге это оказалось ну очень неудобно, что решил через панели, тем более их тут не более 10 всё-таки. s62 s62, только была бы задача обработки кликов и перетаскивания элементов картинки. Но мне кажется, что она тоже вполне решаемая. Всё это решено в полной мере, вплоть да кликов по тексту, Хинтам и прочим. Просто именно легенду так выводить неудобно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.01.2020, 14:13 |
|
||
|
Создание компонента сложной формы (аккуратной контурной стрелки).
|
|||
|---|---|---|---|
|
#18+
Андрей Игоревич А вот перехват обработку сообщений я пока до конца не освоил, это через так делать? Нет, это делать так: Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.01.2020, 14:27 |
|
||
|
Создание компонента сложной формы (аккуратной контурной стрелки).
|
|||
|---|---|---|---|
|
#18+
Андрей Игоревич Все многоугольники рисуются именно через свои компоненты, даже не PintBox, а через TComponent, где я уже сам свои Paint и прочие вещи писал. Панели используются именно для "Легенды", так как нагромождать всё через основной канвас ну очень сильно загромождает код (у меня там куча всяких событий и действий на всё привязано, один перехват мышки в едином канвасе будет просто огромным). Изначально и легенду тоже рисовал на канвасе, но в итоге это оказалось ну очень неудобно, что решил через панели, тем более их тут не более 10 всё-таки. Вот события мышки обрабатывать это да, нужно было бы наверное держать данные о всех графических объектах, чтобы по клику находить, над каким из них произошло событие. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.01.2020, 14:32 |
|
||
|
Создание компонента сложной формы (аккуратной контурной стрелки).
|
|||
|---|---|---|---|
|
#18+
Kazantsev Alexey Андрей Игоревич А вот перехват обработку сообщений я пока до конца не освоил, это через так делать? Нет, это делать так: Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. Придется поразбираться :). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.01.2020, 14:41 |
|
||
|
Создание компонента сложной формы (аккуратной контурной стрелки).
|
|||
|---|---|---|---|
|
#18+
Андрей Игоревич Придется поразбираться :) Я не знаю, как у тебя там происходит рисование, но, если в Paint обновляется всё содержимое панели, то никаких артефактов отрисовки быть не должно. Даже перепроверил себя, накидал демку - ничего не мерцает. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.01.2020, 14:59 |
|
||
|
Создание компонента сложной формы (аккуратной контурной стрелки).
|
|||
|---|---|---|---|
|
#18+
Kazantsev Alexey Андрей Игоревич Придется поразбираться :) Я не знаю, как у тебя там происходит рисование, но, если в Paint обновляется всё содержимое панели, то никаких артефактов отрисовки быть не должно. Даже перепроверил себя, накидал демку - ничего не мерцает. Тут скорее дело в perform(WM_SysCommand, $F00.., 0), оно вызывает paint не так уж и часто, а пока мышку не отпустишь - вызывать paint иначе не получиться. Ладно, подумаю, поковыряюсь. А как вы масштабируете панель размещенную на панели? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.01.2020, 15:04 |
|
||
|
Создание компонента сложной формы (аккуратной контурной стрелки).
|
|||
|---|---|---|---|
|
#18+
Андрей Игоревич Тут скорее дело в perform(WM_SysCommand, $F00.., 0), оно вызывает paint не так уж и часто Можно принудительно вызывать отрисовку из того-же WMEraseBkgnd. Андрей Игоревич А как вы масштабируете панель размещенную на панели? В OnMouseMove пересчитываю размер. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.01.2020, 15:21 |
|
||
|
Создание компонента сложной формы (аккуратной контурной стрелки).
|
|||
|---|---|---|---|
|
#18+
Андрей Игоревич Главный вопрос: Почему панель закрашивается в серый до Override paint, как это отключить? Всё есть в исходниках Код: 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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.01.2020, 15:43 |
|
||
|
Создание компонента сложной формы (аккуратной контурной стрелки).
|
|||
|---|---|---|---|
|
#18+
Kazantsev Alexey Андрей Игоревич А как вы масштабируете панель размещенную на панели? В OnMouseMove пересчитываю размер. Изначально тоже так сделал, но очень мне не понравилось, уже и не помню почему, то ли мышка слетала с панели (если не успевала обновить размер) и OnMouseMove уже не срабатывал, то ли ещё что-то было. Но что с мерцанием больше всего вызывает непонимание, это то, что в 7 - всё идеально, даже намека нет. И если суомпилирвать файл res в 7ке, то и в 10ке всё будет нормально. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.01.2020, 15:45 |
|
||
|
Создание компонента сложной формы (аккуратной контурной стрелки).
|
|||
|---|---|---|---|
|
#18+
Андрей Игоревич Изначально тоже так сделал, но очень мне не понравилось, уже и не помню почему, то ли мышка слетала с панели (если не успевала обновить размер) и OnMouseMove уже не срабатывал, то ли ещё что-то было. У винконтролов есть возможность захватывать мышку, после чего все её события идут в этот контрол. Андрей Игоревич И если суомпилирвать файл res в 7ке, то и в 10ке всё будет нормально. Не понял. Если взять .res файл от семёрки и подложить его в проект Delphi 10.3? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.01.2020, 15:56 |
|
||
|
|

start [/forum/topic.php?fid=58&msg=39878489&tid=2038657]: |
0ms |
get settings: |
9ms |
get forum list: |
15ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
140ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
68ms |
get tp. blocked users: |
1ms |
| others: | 254ms |
| total: | 504ms |

| 0 / 0 |
