Как сделать работу TLinkLabel в Delphi?

Я поместил TLinkLabel в свою форму, заполнил его заголовком, включая допустимую ссылку HTML, и получил хороший синий подчеркнутый текст. Когда я запускал программу, я ожидал, что она вызовет Firefox (мой браузер по умолчанию) и автоматически откроет ссылку. По-видимому, это не тот случай.

В файле справки говорится, что мне нужно закодировать это в обработчике событий OnLinkClick. Тем не менее, он ничего не говорит о том, как это сделать. Он будет передан в строковое значение "Ссылка". Как я могу сказать "вызвать браузер по умолчанию и открыть ссылку"?

Ответ 1

Вы можете вызвать ShellExecute. Я написал этот метод для общих вызовов и должен работать в вашем случае.

procedure ShellOpen(const Url: string; const Params: string = '');
begin
  ShellAPI.ShellExecute(0, 'Open', PChar(Url), PChar(Params), nil, SW_SHOWNORMAL);
end;

В своем коде вы должны называть это

procedure TForm1.LinkLabelClick(Sender: TObject);
begin
  ShellOpen(LinkLabel.Caption);
end;

Ответ 2

TLinkLabel предоставляет ярлык, который похож на ссылку. Это ваша задача программиста заставить его действовать как ссылка, потому что только вы можете знать, какие ссылки должны действовать как в вашей программе. Вы хотели, чтобы метка автоматически открывала пользовательский веб-браузер по умолчанию, используя URL-адрес на этикетке, но это не единственные ссылки. Например:

  • Internet Explorer не является моим браузером по умолчанию, но когда я нажимаю ссылку в Internet Explorer, я не ожидаю, что связанная страница откроется в Firefox.
  • Когда я нажимаю ссылку в справочной программе, я ожидаю, что связанная тема появится в справочной программе, а не в любом веб-браузере.
  • Страницы предпочтений в Eclipse очень сложны. Настройки на одной странице иногда связаны с настройками на другой странице. На этих страницах есть ссылки, которые приводят пользователя непосредственно на соответствующую страницу. В этом случае URL-адреса и HTML не используются, и все же они все еще являются ярлыками с подчеркнутым текстом.

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

Я предполагаю, что вы имеете в виду элемент управления TLinkLabel, который поставляется с Delphi. (Мои версии не имеют такого компонента.) Я полагаю, что элемент управления Delphi предназначен для подражания того, который находится в библиотеке классов .Net, Он может содержать несколько ссылок, и каждая ссылка может сделать что-то другое.

Если вы хотите, чтобы элемент управления всегда выполнял действие оболочки по умолчанию для URL-адресов, рассмотрите возможность использования другого TLinkLabel; тот, который Александр Бах делает именно так, как вы ожидали. Это от Delphi 3, но он должен работать без изменений во всех более поздних версиях, включая Delphi 2009. Если вы посмотрите на код, вы увидите, как он работает. Он просто вызывает ShellExecute, как показывает ответ Цезаря.

Ответ 3

У меня есть всевозможные проблемы с TLinkLabel, который поставляется с delphi 2010. a) Элемент управления не отображается как гиперссылка, а как простой текст ярлыка в форме. b) курсор не изменяется, чтобы указать, что это ссылка, даже если я установил свойство Cursor. c) событие OnLinkClick не запускается вообще. Я работаю над окнами 7.

Итак, насколько я знаю, TLinkLabel ничего не делает, как должен, и бесполезен. ShellExecute является единственным решением и должен быть помещен в событие OnClick.

Ответ 4

Вместо этого я использую элемент управления TInternetLabel. Он делает именно то, что вам нужно: по щелчку открывается браузер, поэтому вам не нужно вводить код в событие OnClick.

Ответ 5

LOL, это смешно. Поэтому вместо того, чтобы устанавливать crHandPoint как курсор, цветной и подчеркнутый шрифт и заполнять событие OnClick стандартным TLabel, у нас есть компонент, который знает тег ссылки и который вообще мне нужно снабжать одним и тем же событием On (Link) Click:))

Единственное, что хорошо, это то, что он упрощает встраивание ссылок в какой-то текст и что он использует системный стиль ссылки...

p.s: действительно, вам нужно положить Some text with <a href="some URL">link</a> в Caption и настроить OnLinkClick на ShellExecute...

Ответ 6

Я пробовал это решение, но оно все еще давало проблемы в Delphi XE4, возможно, потому что ShellOpen не понимает HTML-код в Caption. Для меня работала комбинация Cesar Romero (базовый код), Adam Feistner (HTML-код в Caption) и более старое решение:


  • Поместите URL-адрес в поле HINT.
  • Измените строку: ShellOpen (LinkLabel.Caption); в ShellOpen (LinkLabel.Hint);

Это сработало для меня.