如何让 TLinkLabel 在 Delphi 中工作?

Posted

技术标签:

【中文标题】如何让 TLinkLabel 在 Delphi 中工作?【英文标题】:How do I make a TLinkLabel work in Delphi? 【发布时间】:2009-02-12 16:55:07 【问题描述】:

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

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

【问题讨论】:

梅森,我鼓励您将问题重新提交给我的编辑。您的问题实际上与 TLinkLabel 无关,您接受的答案也不是。重新阅读您的第二段,其中包含文本中唯一的问题。你的第一段只是背景。 TLinkLabel 已经可以使用了。 我不这么看。当您创建将 HTML 作为输入并输出可单击超链接的内容时,您希望看到 Web 浏览器样式的行为:“单击此链接并加载页面”。 POLS 等等。但事实证明,事实并非如此。所以我的问题是如何让它发挥作用。 大多数人使用 TLinkLabels 就像使用按钮一样,而不是启动默认的 Web 浏览器。 TLinkLabel 工作得很好,您想知道如何在 InLinkClick 事件中启动到 Web 浏览器。您的问题标题类似于询问“如何制作按钮” @MasonWheeler- TLinkLabel 非常蹩脚。检查谷歌的 Delphi TInternelLabel。这是一个更好的选择。使用此控件,您不必在 OnClick 事件中编写代码。 【参考方案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;

【讨论】:

谢谢!这是一个很好的功能。不过,查看文档,您似乎可以将 nil 传递给第二个参数。有什么特别的理由明确说“开放”吗? 您告诉 ShellExecute() 使用第三个参数执行哪个操作。如果您只指定 nil 而不是一个动作,它将使用第三个参数的默认动作。对于 URL,默认值通常是打开的。但是,对于其他事情而言,情况并非如此。 @Mason:Ken 已经回答了你关于“开放”的问题。 @Ken:Tnx。 似乎使用了 OnClick 事件而不是 OnLinkClick,后者提供了一个 Link 参数,其中包含 HTML 标记标题中的 href 地址。【参考方案2】:

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

所以,就我而言,TLinkLabel 什么都不做,因为它应该是无用的。 ShellExecute 是唯一的解决方案,必须放在 OnClick 事件中。

【讨论】:

您需要将链接写成 HTML 超链接标签。这就是它出现的原因。 哈哈哈谢谢梅森。不过,您必须承认这不是一个明显的解决方案:) 另见我的回答。这是你想要的。【参考方案3】:

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

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

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

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

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

【讨论】:

【参考方案4】:

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

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

p.s.:真的,你必须将Some text with <a href="some URL">link</a> 放入Caption 并将OnLinkClick 设置为ShellExecute...

【讨论】:

【参考方案5】:

我改用名为TInternetLabel 的控件。它完全符合您的要求:单击时会打开浏览器,因此您不必在 OnClick 事件中添加代码。

【讨论】:

【参考方案6】:

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


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

这对我有用。

【讨论】:

您可能使用了错误的事件。您应该使用 OnLinkClick 事件,该事件的 Link 属性具有 href 地址。

以上是关于如何让 TLinkLabel 在 Delphi 中工作?的主要内容,如果未能解决你的问题,请参考以下文章

在delphi中,在运行时如何让拖动的控件显示在最上方?

delphi2007如何让程序不在任务栏中隐藏和显示?

让delphi2010操作界面回到delphi7模式

delphi 中如何让listview 标题居中

如何让delphi在启动时不自动创建空的工程?并且改变默认工程目录?

delphi 如何让Combobox下拉菜单时,显示一个树形结构