如何在Delphi中使用TLinkLabel控件?

13

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

帮助文件说我必须在OnLinkClick事件处理程序中编写代码。尽管没有说明如何做到这一点。它将传递一个名为 “Link” 的字符串值。我该如何说“调用默认浏览器并打开Link”?


梅森,我鼓励你将问题重新提交到我的编辑中。你的问题实际上与TLinkLabel无关,你接受的答案也不是。请重新阅读你的第二段,其中包含了你文本中唯一的问题。你的第一段只是背景介绍。TLinkLabel已经可以工作了。 - Rob Kennedy
1
我不这么认为。当你创建一个以HTML作为输入并输出可点击的超链接的东西时,你期望看到的是Web浏览器风格的行为:“单击此链接,页面加载。” POLS等等。但事实证明,情况并非如此。因此,我的问题是如何使它正常工作。 - Mason Wheeler
大多数人使用TLinkLabels的方式类似于按钮,而不是用来启动默认的网络浏览器。TLinkLabel可以正常工作,你想知道的是如何在InLinkClick事件中启动Web浏览器。你的问题标题类似于问“如何使按钮工作”。 - Jim McKeeth
1
@MasonWheeler- TLinkLabel非常糟糕。请搜索Delphi TInternelLabel,它是一个更好的替代品。使用此控件,您无需在OnClick事件中编写代码。 - Gabriel
7个回答

22
你可以调用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来避免。有什么特别的原因要明确指定“Open”吗? - Mason Wheeler
2
你正在告诉ShellExecute()使用第三个参数执行哪种操作。如果你只是指定nil而不是一个操作,它将使用该第三个参数的默认操作。在URL的情况下,默认通常是打开。但对于其他事情来说并非如此。 - Ken White
@Mason:关于“Open”,Ken已经回答了你的问题。@Ken:谢谢。 - Cesar Romero
似乎使用了OnClick事件,而不是提供了一个Link参数的OnLinkClick事件,该参数包含HTML标记的标题中的href地址。 - Tupel

8
我在使用 Delphi 2010 的 TLinkLabel 时遇到了很多问题。 a) 控件不会呈现为超链接,只会显示为简单的标签文本。 b) 光标不会改变以指示这是一个链接,即使我设置了 Cursor 属性。 c) OnLinkClick 事件根本没有触发。 我正在使用 Windows 7 系统。 因此,在我看来,TLinkLabel 没有任何实际作用,是无用的。唯一的解决方案是将 ShellExecute 放置在 OnClick 事件中。

2
你需要将链接写成HTML超链接标签,这样它才会显示出来。 - Mason Wheeler
1
哈哈哈,谢谢Mason。你得承认这不是一个显而易见的解决方案,不是吗 :) - dpant
请参考我的答案,那是你想要的。 - Gabriel

5

TLinkLabel提供了一个看起来像链接的标签。作为程序员,你需要让它的行为像一个链接,因为只有你知道在你的程序中链接应该如何表现。你希望标签自动使用标签中的URL打开用户默认的Web浏览器,但这并不是链接唯一的功能。例如:

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

有些程序尝试提供在新窗口中打开链接或重用旧窗口之间的选择。你不能实现这个功能而不知道使用的浏览器。你的程序可能会给用户提供一个选择,忽略默认浏览器设置,总是使用特定的浏览器。要做到这一点,你的UI控件不能对程序应该做什么做出太多的假设。

我猜你是在指Delphi中带有的TLinkLabel控件。(我的版本没有这样的组件。)我想象Delphi控件的目的是模仿.Net类库中的控件。它可以容纳多个链接,每个链接可以执行不同的操作。

如果你想要一个总是执行shell默认操作的控件,请考虑使用另一个TLinkLabelAlexander Bach的控件正是你所期望的。它来自Delphi 3,但在所有后续版本中,包括Delphi 2009,都应该能够正常工作。如果你查看代码,你会看到它是如何工作的。它只是调用ShellExecute,正如Cesar的答案所示。


2

哈哈,真有趣。所以,我们不再将crHandPoint设置为光标,也不再使用彩色和下划线字体,也不再将OnClick事件填充到标准的TLabel中,而是使用一个知道链接标签的组件,我只需要提供相同的On(Link)Click事件:)

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

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


1
我使用一个叫做TInternetLabel的控件。它完全符合你的要求:点击后打开浏览器,因此您不必在OnClick事件中放置代码。

1
我尝试了这个解决方案,但在Delphi XE4中仍然出现问题,可能是因为ShellOpen无法理解标题中的HTML代码。 对我有用的是Cesar Romero(基本代码)、Adam Feistner(标题中的HTML代码)和一个较旧的解决方案的组合。
  • 将URL放入HINT字段中。
  • 将以下行更改为:ShellOpen(LinkLabel.Hint);,而不是 ShellOpen(LinkLabel.Caption);

这对我很有效。


1
你可能使用了错误的事件。你应该使用OnLinkClick事件,它有一个Link属性,其中包含href地址。 - Tupel

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接