2012-06-20 43 views
5

Nhấp đúp vào TStaticText trên biểu mẫu sao chép chú thích của TStaticText đó vào khay nhớ tạm. Không cần nhấp đúp vào sự kiện.nhấp đúp vào TStaticText trong ứng dụng Delphi XE2 sao chép chú thích vào clipboard

bước để tái sản xuất:

  • Sử dụng Win 64 và Delphi XE2 cập nhật 4.
  • Tạo một VCL Forms ứng dụng.
  • Đặt TEdit trên biểu mẫu.
  • Đặt một TStaticText trên biểu mẫu. Thay đổi phụ đề thành "TStaticText1Caption"
  • Đặt một TStaticText thứ hai trên biểu mẫu. Thay đổi phụ đề thành "TStaticText2Caption"
  • Chương trình chạy (F9)
  • Nhập một số văn bản vào TEdit. Chọn tất cả và sao chép nó qua CTRL + C.
  • Xóa văn bản trong TEdit. Dán nó vào để xác minh văn bản là những gì bạn đã sao chép.
  • Xóa văn bản trong TEdit.
  • Nhấp đúp vào TStaticText.
  • Dán văn bản vào TEdit. Chú ý nó không phải là văn bản đã sao chép ban đầu mà là chú thích của TStaticText.

Tôi đã gửi báo cáo lỗi cho Embarcadero.

Tôi đã thử chỉ định sự kiện nhấp đúp vào TStaticTexts. Nó vẫn sao chép chú thích vào clipboard ngay cả khi nó thực thi sự kiện nhấn đúp.

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

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

Điều này không xảy ra với TLabel hoặc bất kỳ điều khiển VCL nào khác mà tôi đã thử.

Chúng tôi có rất nhiều TStaticTexts trên biểu mẫu của chúng tôi cho mục đích thiết kế trực quan và thay đổi thành TLabels không phải là một tùy chọn.

Bất kỳ ai có ý tưởng nào về cách ngăn điều này xảy ra?

Trả lời

8

Đây không phải là lỗi delphi, hành vi này là do Windows Static Control được tạo bởi thành phần TSTaticText VCL.

Bắt đầu từ Windows Vista, các điều khiển văn bản tĩnh tự động sao chép nội dung của họ vào clipboard khi bạn nhấp đúp vào chúng nếu bạn đặt SS_NOTIFY phong cách (các SS_NOTIFY phong cách được thiết lập theo phương pháp CreateParams của các thành phần TCustomStaticText)

recomended giảng How do I make it so that users can copy static text on a dialog box to the clipboard easily?

như workaround bạn có thể loại bỏ các SS_NOTIFY phong cách trọng phương pháp CreateParams như vậy

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; 

Lưu ý: bạn phải biết nếu bạn xóa kiểu này khỏi điều khiển, bạn sẽ không nhận được mã thông báo STN_CLICKED, STN_DBLCLK, STN_DISABLE và STN_ENABLE khi người dùng nhấp hoặc nhấp đúp vào điều khiển.

+0

Theo bài viết bạn đã liên kết, có một giải pháp thay thế: "nếu bạn muốn tắt tính năng * nhấp đúp để sao chép * trên điều khiển tĩnh' SS_NOTIFY', bạn phải phân lớp kiểm soát tĩnh và ăn nhấp chuột bản thân bạn." –

+0

Vâng, đó cũng là một lựa chọn hợp lệ. – RRUZ

+0

Tôi đánh giá cao câu trả lời. Tôi đoán đó là một thay đổi nội bộ của cách điều khiển VCL được tạo ra với Delphi mới hơn so với Delphi cũ hơn. Chúng tôi đã gặp rất nhiều vấn đề nhỏ khi chuyển từ Delphi 6 sang XE2. Chúng ta sẽ phải tìm một giải pháp thay thế, điều này sẽ gây ra vấn đề. –

Các vấn đề liên quan