5

フォーム上のTStaticTextをダブルクリックすると、そのTStaticTextのキャプションがクリップボードにコピーされます。ダブルクリックイベントは必要ありません。

再現する手順:

  • Win64およびDelphiXE2アップデート4を使用します。
  • VCLフォームアプリを作成します。
  • フォームにTEditを配置します。
  • フォームにTStaticTextを配置します。キャプションを「TStaticText1Caption」に変更します
  • フォームに2番目の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があり、TLabelsに変更することはできません。

誰かがこれが起こるのを防ぐ方法について何か考えがありますか?

4

1 に答える 1

8

これはデルファイのバグではありません。この動作はWindows Static Control、TStaticTextVCLコンポーネントによって作成されたによって引き起こされます。

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通知コードを受け取らないことに注意する必要があります。

于 2012-06-20T18:18:12.503 に答える