Реализация элемента управления «панель тегов» в Delphi?

Пожалуйста, взгляните на этот снимок экрана

http://www.maclife.com/files/u18/Yep3-big.jpg

Я думаю, что это основные особенности такой «панели тегов»:

1) Каждый тег на панели представляет собой отдельный элемент управления, и его можно щелкнуть.

2) Автоматический перенос строки, когда недостаточно места для отображения следующего тега в текущей строке.

3) Прямоугольная рамка с закругленными углами для каждого тега — полезная функция.

Я хочу реализовать аналогичную функцию в Delphi. Существует ли какой-либо элемент управления для этого? Если нет, то как лучше реализовать такой контроль?

Спасибо.


person Edwin Yip    schedule 12.10.2009    source источник
comment
Другой пример такой «панели тегов»: macgenealogy.org/images/screen/ yep-list.jpg Вы можете проверить раздел тегов справа.   -  person Edwin Yip    schedule 12.10.2009


Ответы (3)


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

Предположим, вы представляете каждую область как регион Windows. Вы можете определить ширину каждого из них на основе текста с помощью TCanvas.TextExtent< /а> функция. Затем создайте регион с такой функцией, как CreateRectRgn. Для закругленных углов попробуйте CreateRoundRectRgn. Вы можете проверить наличие событий мыши в каждом регионе с помощью функции PtInRegion. Вы можете нарисовать границы вокруг них с помощью FrameRgn. Последнее препятствие — нарисовать их на экране, чтобы они все поместились. Вы создаете регионы и знаете их ширину, поэтому назначайте теги строке, пока не закончится место, а затем начните следующую строку.

person Rob Kennedy    schedule 12.10.2009
comment
спасибо за подсказку Роб. Есть ли у вас какие-либо советы, если я хочу, чтобы эти теги можно было перемещать с помощью перетаскивания? Например, перетащите второй тег на строку 2 и поместите в начало строки 1. Спасибо. - person Edwin Yip; 12.10.2009
comment
Обнаружьте нажатие мыши и достаточное количество событий перемещения мыши, чтобы отличить перетаскивание от щелчка, а затем вызовите SetCapture, чтобы перейти в режим перетаскивания. Обрабатывайте события перемещения мыши во время ожидания события перемещения мыши, после чего вы можете изменить порядок тегов. (Весь этот вопрос носит обзорный характер. Если у вас есть конкретные вопросы о чем-либо, задайте новый вопрос, на который люди смогут ответить без необходимости охватывать полдюжины различных вопросов в одном ответе.) - person Rob Kennedy; 12.10.2009

Когда вы используете последнюю версию Delphi, используйте TFlowPanel и некоторые соответствующие элементы управления для тегов. Для этого подойдет простой TButton или TLinkLabel.

person Uwe Raabe    schedule 12.10.2009
comment
Спасибо Уве, к сожалению, я использую D7. Обновление в настоящее время не вариант. - person Edwin Yip; 12.10.2009

Есть два возможных решения пользовательского выравнивания в Delphi 7. Вы можете создать свою собственную панель потока, производную от TCustomPanel и переопределив метод AlignControls(), или вы можете установить выравнивание в alCustom и обработать событие OnAlignPosition.

Думаю, я бы выбрал вариант, производный от TCustomPanel. TFlowPanel в форме Delphi 2007 использует эту опцию, хотя я должен признать, что сам никогда не пробовал...

person Vegar    schedule 12.10.2009