13

我在表单上放了一个 TLinkLabel,用包含有效 HTML 链接的标题填充它,并得到一些漂亮的蓝色下划线文本。当我运行程序时,我希望它会调用 Firefox(我的默认浏览器)并自动打开链接。显然情况并非如此。

帮助文件说我必须在 OnLinkClick 事件处理程序中对此进行编码。但是,它没有说明如何做到这一点。它将传入一个名为“Link”的字符串值。我怎么说“调用默认浏览器并打开链接”?

4

6 回答 6

20

您可以调用 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;
于 2009-02-12T17:36:33.917 回答
7

我在使用 delphi 2010 附带的 TLinkLabel 时遇到各种问题。a )控件不会呈现为超链接,而是呈现为表单上的简单标签文本。b)即使我设置了 Cursor 属性,光标也不会改变以指出这是一个链接。c) OnLinkClick 事件根本不会触发。我正在使用 Windows 7。

因此,就我而言,TLinkLabel 没有做任何应有的事情,而且毫无用处。ShellExecute 是唯一的解决方案,必须放在 OnClick 事件中。

于 2010-04-22T13:13:31.537 回答
5

TLinkLabel提供一个看起来像链接的标签。作为程序员,你的工作就是让它表现得像一个链接,因为只有你才能知道你的程序中的链接应该是什么样子。您希望标签使用标签中的 URL 自动打开用户的默认 Web 浏览器,但这不是链接的唯一作用。例如:

  • Internet Explorer 不是我的默认浏览器,但是当我在 Internet Explorer 中单击链接时,我不希望链接页面在 Firefox 中打开。
  • 当我单击帮助程序中的链接时,我希望链接的主题出现在帮助程序中,而不是任何 Web 浏览器中。
  • Eclipse 中的首选项页面非常复杂。一页上的设置有时与另一页上的设置相关。这些页面上的链接可将用户直接带到相关页面。在这种情况下,没有涉及 URL 和 HTML,但它们仍然是带有下划线文本的标签。

一些程序试图在新窗口中打开链接与重新使用旧窗口之间提供选择。在不知道正在使用哪个浏览器的情况下,您无法实现该功能。您的程序可能会为用户提供忽略默认浏览器设置并始终使用特定浏览器设置的选择。为此,您的 UI 控件不能对程序应该做什么做出太多假设。

我猜您指的TLinkLabel是 Delphi 附带的控件。(我的版本没有这样的组件。)我想 Delphi 控件是为了模仿.Net 类库中的那个。它可以容纳多个链接,每个链接可以做不同的事情。

如果您想要一个始终对 URL 执行 shell 的默认操作的控件,请考虑使用不同的TLinkLabel; Alexander Bach 的作品完全符合您的预期。它来自 Delphi 3,但在所有更高版本(包括 Delphi 2009)中也应该不加修改地工作。如果您查看代码,您会看到它是如何工作的。ShellExecute正如塞萨尔的回答所表明的那样,它只是调用。

于 2009-02-13T05:51:13.120 回答
2

大声笑,这很有趣。因此,与其将 crHandPoint 设置为光标、彩色和带下划线的字体并将 OnClick 事件填充为标准 TLabel,我们拥有知道链接标签的组件,并且我需要提供相同的 On(Link)Click 事件:))

唯一的好处是它可以更容易地将链接嵌入到一些文本中,并且它使用系统样式的链接......

ps:真的你必须Some text with <a href="some URL">link</a>投入和Caption设置OnLinkClick...ShellExecute

于 2011-07-31T00:38:00.517 回答
1

我使用了一个名为TInternetLabel的控件。它完全符合您的要求:单击它会打开浏览器,因此您不必将代码放入 OnClick 事件中。

于 2011-01-15T14:53:41.317 回答
1

我尝试了这个解决方案,但它仍然在 Delphi XE4 中出现问题,可能是因为 ShellOpen 不理解标题中的 HTML 代码。对我有用的是 Cesar Romero(基本代码)、Adam Feistner(标题中的 HTML 代码)和旧解决方案的组合:


  • 将 URL 放在提示字段中。
  • 换行: ShellOpen(LinkLabel.Caption); ShellOpen(LinkLabel.Hint);

这对我有用。

于 2013-11-17T21:37:47.320 回答