Обработка нажатий на ссылки в всплывающих окнах в Delphi
Вопрос, поднятый пользователем, касается обработки событий клика по ссылкам в всплывающих подсказках (balloons) в среде разработки Delphi. Подсказки, которые используют форматированный текст с поддержкой гиперссылок, могут быть весьма удобным способом информирования пользователя о дополнительной информации. Однако, когда таких ссылок несколько, возникает задача их идентификации для различного контекстного реагирования.
Описание проблемы
После получения ответа от Mr. TLama на вопрос о захвате уведомления TTN_LINKCLICK, остался открытым вопрос о том, как идентифицировать каждую ссылку, по которой был совершен клик, если их несколько. Пользователь хочет иметь возможность включать в подсказку более одной ссылки и реагировать на клики по ним по-разному.
Альтернативный ответ
Изначально считалось, что идентификация ссылки по клику невозможна, так как уведомление TTN_LINKCLICK не содержит параметров, позволяющих это сделать. Рекомендовалось использовать более сложные интерфейсы, такие как уведомления типа toast или диалоговые окна.
Подтвержденный ответ
Однако, после дополнительных исследований было выяснено, что получение информации о ссылке, по которой был совершен клик, действительно возможно. В документации по сообщению WM_NOTIFY упоминается, что некоторые уведомления содержат дополнительные структуры после NMHDR. В случае уведомления TTN_LINKCLICK это структура NMLINK, которая содержит информацию о ссылке.
В примере кода ниже представлена обработка сообщений WM_NOTIFY для получения информации о ссылке:
procedure TFormPrincipal.HandleNotifyMessages(var AMessage: TWMNotify);
var
Link: TNMLink;
begin
if Assigned(AMessage.NMHdr) and (AMessage.NMHdr.code = TTN_LINKCLICK) then
begin
Link := PNMLink(AMessage.NMHdr)^;
// Получение информации о ссылке
Application.MessageBox(PChar('О link clicado tem href="' + Link.item.szUrl + '" e id="' + Link.item.szID + '"'),'Sou foda!',MB_ICONINFORMATION);
end;
end;
При нажатии на любую из ссылок в подсказке, будет отображаться сообщение с информацией о ссылке.
Выводы
Используя дополнительные структуры, такие как NMLINK, можно идентифицировать ссылку, по которой был совершен клик, и выполнять различные действия в зависимости от этой информации.
Пример использования в коде
Для полноты картины, давайте рассмотрим пример кода, который включает в себя всплывающую подсказку с несколькими ссылками и обработку нажатий на них:
procedure TForm1.FormCreate(Sender: TObject);
var
ToolTip: TToolTip;
ToolTipParams: TToolTipParams;
begin
ToolTip := TToolTip.Create(nil);
try
ToolTipParams := TToolTipParams.Create(ComponentCount(self));
ToolTipParams[ComponentIndex(Label1)] := 'Это подсказка для Label1, содержащая ссылки: ' +
'<a href="http://www.example1.com">Ссылка 1</a> | ' +
'<a href="http://www.example2.com">Ссылка 2</a> | ' +
'<a href="http://www.example3.com">Ссылка 3</a>';
ToolTip.Props := TToolTipProps.Create(self);
ToolTip.Props.SetParams(ToolTipParams);
ToolTip.Props.Style := [tszTitle, ttf_ToolTipAbove];
ToolTip.Props.DelayTime := 2000;
ToolTip.Props.IsBalloon := True;
ToolTip.Props.BalloonTips := TTTips.Create(self);
ToolTip.Props.BalloonTips.SetParams(ToolTipParams);
ToolTip.Props.BalloonTips.DelayTime := 0;
ToolTip.Props.BalloonTips.Style := TTS_BALLOON | TTS_NOPREFIX;
ToolTip.Activate;
except
on E: Exception do
Writeln(E.ClassName, ': ', E.Message);
end;
end;
procedure TForm1.HandleNotifyMessages(var AMessage: TWMNotify);
var
Link: TNMLink;
begin
if Assigned(AMessage.NMHdr) and (AMessage.NMHdr.code = TTN_LINKCLICK) then
begin
Link := PNMLink(AMessage.NMHdr)^;
// В зависимости от значения Link.item.szUrl выполнить нужное действие
end;
end;
Этот пример создает всплывающую подсказку с несколькими ссылками для элемента Label1. При клике на каждую из ссылок, можно идентифицировать ссылку и выполнить соответствующее действие.
Описание контекста: Вопрос связан с обработкой кликов по гиперссылкам в всплывающих подсказках в среде разработки Delphi и идентификацией конкретной ссылки при клике для выполнения контекстно-зависимых действий.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.