|
Вопрос # 3 342/ вопрос закрыт / |
|
Здравствуйте, уважаемые эксперты!
Есть форма, на форме несколько компонентов (панели, кнопки и т.п.). Нужно начертить прямую между двумя любыми компонентами. Если использовать Canvas формы, то, соответственно, линия чертится "под" компонентами, встретившимися на пути. И ещё - компоненты хранят свои координаты (left, top) относительно родителя. Если нужно провести линию между двумя компонентами, которые лежат непосредственно на форме, проблем нет. А если компоненты лежат "внутри" панели (которая сама лежит внутри другой панели), тогда как получить координаты компонента относительно формы?
Отсюда пара вопросов:
1) как начертить линию поверх всех компонентов;
2) как перевести координаты элементов в какую-то "общую" систему координат?
Может, рисовать прямо поверх экрана?
 |
Вопрос задал: Егор (статус: 10-ый класс)
Вопрос отправлен: 30 октября 2009, 08:03
Состояние вопроса: закрыт, ответов: 0.
|
Мини-форум вопроса
Всего сообщений: 5; последнее сообщение — 30 октября 2009, 09:18; участников в обсуждении: 2.
|
Егор (статус: 10-ый класс), 30 октября 2009, 08:05 [#1]:
т.е., к примеру, один компонент может лежать внутри панели, которая лежит внутри панели, а другой - прямо на форме. нужно провести линию между левыми верхними углами этих компонентов.
Опасайтесь багов в приведенном выше коде; я только доказал корректность, но не запускал его.
— Donald E. Knuth.
|
|
min@y™ (статус: Доктор наук), 30 октября 2009, 08:25 [#2]:
Объясни, для чего это всё надо. Может быть твою задачу можно решить как-то проще?
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
|
min@y™ (статус: Доктор наук), 30 октября 2009, 08:37 [#3]:
Когда-то лет 100 назад я писал на заказ программу управления радиостанцией, с помощью которой осуществлялся радииообмен с удалённым пунктами, оснащёнными такими же станциями. Интерфейс был простой: ScrollBox, на нём Image с картой местности, поверх неё прозрачный PaintBox для рисования и куча потомков TPanel, обозначающих положение удалённых пунктов, их состояния (вкл/выкл и т.п.), и ещё одна панель - централный пункт, на котором и стоит комп с моей программой. Радиообмен - посылка 14-ти байт и приём ответного сообщения - обозначался рисованием эллипсов, описанных вокруг панелей, принимающих участие в обмене, и линии, соединяющей их центры, со стрелками на концах.
Может тебе нужно именно вот таким макаром?
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
|
Егор (статус: 10-ый класс), 30 октября 2009, 08:48 [#4]:
задание было таким - создать диаграмму проектов. каждый проект должен содержать другие проекты. внутренние не должны выходить за "родителей". плюс должны быть показаны зависимости - один проект зависит от другого.
я перегрузил компонент TPanel. нужно добавить подпроект - добавляю "подпанель" к нужной панели. на каждую мою панель сделал общий обработчик, который по уникальному id знает, что нужно делать с этим проектом. рисованием собственно панели, отлавливанием сообщений windows (нажата мышь/клавиша) и т.п. я не занимаюсь - панель делает это всё сама, удобно.
но вот тут и стала "проблема" - как получить координаты какого-то из "подподподпроектов"? чтобы потом начертить линию к зависимому подподпроекту, который может быть частью совсем другого проекта.
можно было, конечно, по другому всё сделать, но, честно говоря, в данном случае такой способ тож приемлем.
Опасайтесь багов в приведенном выше коде; я только доказал корректность, но не запускал его.
— Donald E. Knuth.
|
|
min@y™ (статус: Доктор наук), 30 октября 2009, 09:18 [#5]:
Блин, под такую задачу идеально подходит TreeView + XML для хранения.
Но если хочешь оставить всё как есть, то координаты вычисляются с помощью вот таких методов TControl:
- ClientToParent();
- ClientToScreen();
- ParentToClient();
- ScreenToClient();
Мучайся дальше.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
7 апреля 2011, 19:51: Вопрос закрыт (решение принял автор вопроса — Егор): какой только фигнёй я не страдал, а!
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|