Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Обработка нажатий на ссылки в всплывающих окнах в Delphi: контекстное реагирование на TTN_LINKCLICK

Delphi , Синтаксис , Справочник по API-функциям

Обработка нажатий на ссылки в всплывающих окнах в 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




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: Справочник по API-функциям ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-12-22 20:14:06
2024-12-26 14:46:42/0.0033929347991943/0