在Delphi XE2应用程序中双击TStaticText会将标题复制到剪贴板

5
双击一个表单上的 TStaticText 会将该 TStaticText 的标题复制到剪贴板中,不需要双击事件。
重现步骤:
- 使用 Win64 和 Delphi XE2 update 4。 - 创建一个 VCL 表单应用程序。 - 在表单上放置一个 TEdit。 - 在表单上放置一个 TStaticText。将标题更改为 "TStaticText1Caption"。 - 在表单上再放置一个 TStaticText。将标题更改为 "TStaticText2Caption"。 - 运行程序(F9)。 - 在 TEdit 中输入一些文本。选择全部并通过 CTRL+C 复制它。 - 删除 TEdit 中的文本。粘贴以验证文本是否与您复制的文本相同。 - 删除 TEdit 中的文本。 - 双击任一 TStaticText。 - 将文本粘贴到 TEdit 中。注意它不是原始复制的文本,而是 TStaticText 的标题。
我已经向 Embarcadero 提交了错误报告。
我尝试将双击事件分配给 TStaticTexts。即使执行了双击事件,它仍会将标题复制到剪贴板中。
procedure TForm1.StaticText1DblClick(Sender: TObject);
begin
  Edit1.Text := 'Hello';
end;

procedure TForm1.StaticText2DblClick(Sender: TObject);
begin
  Edit1.Text := 'World';
end;

我尝试了TLabel和其他VCL控件,但都没有出现这种情况。

我们在表单上有很多TStaticText用于视觉设计目的,改为TLabel不是一个选项。

有人有什么想法可以防止这种情况发生吗?

1个回答

8
这并不是Delphi的bug,这种行为是由TStaticText VCL组件创建的Windows Static Control引起的。
从Windows Vista开始,如果设置了SS_NOTIFY风格(由TCustomStaticText组件的CreateParams方法设置),静态文本控件双击时会自动将其内容复制到剪贴板。
推荐阅读如何使用户轻松地将对话框中的静态文本复制到剪贴板? 作为解决方法,您可以通过覆盖CreateParams方法来删除SS_NOTIFY风格,如下所示。
type
  TStaticText = class(Vcl.StdCtrls.TStaticText)
  protected
    procedure CreateParams(var Params: TCreateParams); override;
  end;

  TForm1 = class(TForm)
    StaticText1: TStaticText;
  private
  public
  end;

var
  Form1: TForm42;

implementation

{$R *.dfm}

{ TStaticText }

procedure TStaticText.CreateParams(var Params: TCreateParams);
begin
  inherited;
  with Params do
    Style := Style and not SS_NOTIFY;
end;

注意:如果您从控件中删除此样式,则在用户单击或双击控件时,您将不会收到STN_CLICKED、STN_DBLCLK、STN_DISABLE和STN_ENABLE通知代码。


根据您提供的文章,有一种替代方法:“如果您想禁用SS_NOTIFY静态控件上的双击复制功能,则必须对该静态控件进行子类化并自己处理点击事件。” - Remy Lebeau
是的,那也是一个有效的选项。 - RRUZ
我感谢您的回答。我猜这是新版Delphi中VCL控件创建方式的内部变化,与旧版Delphi相比。我们在从Delphi 6转换到XE2时遇到了许多小问题。我们必须找到一个替代方案,以避免这种问题的发生。 - TJ Asher

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