Как заставить работать TLinkLabel в Delphi? - PullRequest
10 голосов
/ 12 февраля 2009

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

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

Ответы [ 6 ]

19 голосов
/ 12 февраля 2009

Вы можете позвонить в 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;
6 голосов
/ 13 февраля 2009

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

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

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

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

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

3 голосов
/ 22 апреля 2010

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

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

1 голос
/ 18 ноября 2013

Я попробовал это решение, но оно по-прежнему создавало проблемы в Delphi XE4, возможно, из-за того, что ShellOpen не понимает HTML-код в заголовке. Для меня сработало сочетание Сезара Ромеро (основной код), Адама Файстнера (HTML-код в подписи) и старое решение:


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

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

1 голос
/ 31 июля 2011

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

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

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

1 голос
/ 15 января 2011

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

...