Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Delphi XE2应用程序中双击TStaticText可将标题复制到剪贴板_Delphi_Delphi Xe2 - Fatal编程技术网

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

在Delphi XE2应用程序中双击TStaticText可将标题复制到剪贴板,delphi,delphi-xe2,Delphi,Delphi Xe2,双击表单上的TStaticText会将该TStaticText的标题复制到剪贴板。不需要双击事件 复制步骤: 使用Win64和Delphi XE2更新4 创建VCL表单应用程序 在表格上放置一个TEdit 在表单上放置一个TStaticText。将标题更改为“TStaticText1Caption” 在表单上放置第二个TStaticText。将标题更改为“TStaticText2Caption” 运行程序(F9) 在TEdit中键入一些文本。全部选中并通过CTRL+C进行复制 删除TEdit中

双击表单上的TStaticText会将该TStaticText的标题复制到剪贴板。不需要双击事件

复制步骤:

  • 使用Win64和Delphi XE2更新4
  • 创建VCL表单应用程序
  • 在表格上放置一个TEdit
  • 在表单上放置一个TStaticText。将标题更改为“TStaticText1Caption”
  • 在表单上放置第二个TStaticText。将标题更改为“TStaticText2Caption”
  • 运行程序(F9)
  • 在TEdit中键入一些文本。全部选中并通过CTRL+C进行复制
  • 删除TEdit中的文本。粘贴它以验证文本是否是您复制的文本
  • 删除TEdit中的文本
  • 双击任一TStaticText
  • 将文本粘贴到TEdit中。请注意,它不是原始复制的文本,而是TStaticText的标题
我已经向Embarcadero提交了一份bug报告

我尝试将双击事件分配给TStaticTexts。即使执行双击事件,它仍会将标题复制到剪贴板

procedure TForm1.StaticText1DblClick(Sender: TObject);
begin
  Edit1.Text := 'Hello';
end;

procedure TForm1.StaticText2DblClick(Sender: TObject);
begin
  Edit1.Text := 'World';
end;
这不会发生在TLabel或我尝试过的任何其他VCL控件上

出于视觉设计的目的,我们的表单上有很多TStaticTexts,而改为TLabels则不是一个选项


有人知道如何防止这种情况发生吗?

这不是delphi bug,这种行为是由TStaticText VCL组件创建的引起的

从Windows Vista开始,如果设置了SS_NOTIFY样式,则双击静态文本控件时,静态文本控件会自动将其内容复制到剪贴板(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\u NOTIFY
静态控件上的双击复制功能,您必须对静态控件进行子类化,并自行执行单击操作。“是的,这也是一个有效的选择。我感谢你的回答。我想这是一个内部的变化,VCL控件是如何创建与较新的德尔福相比,较旧的德尔福。我们在从Delphi6到XE2的转换过程中遇到了很多小问题。我们必须找到另一种可能导致问题的方法。