2012-06-20 28 views
5

Bir formdaki bir TStaticText çift tıklatıldığında, bu TStaticText dosyasının yazısını panoya kopyalar. Çift tıklama etkinliğine gerek yoktur.Delphi XE2 uygulamasında TStaticText uygulamasının çift tıklatılması panoya kopyalanır

Yeniden oluşturma adımları:

  • Win 64 ve Delphi XE2 güncelleme kullanılması 4.
  • bir VCL Forms uygulaması oluşturun.
  • Form üzerine bir TEdit yerleştirin.
  • Formda bir TStaticText yerleştirin. Başlığı "TStaticText1Caption" olarak değiştir
  • Formda ikinci bir TStaticText yerleştirin. Altyazıyı "TStaticText2Caption" olarak değiştirin
  • Çalıştırma (F9)
  • TEdit'e bir metin yazın. Hepsini seçip CTRL + C ile kopyalayın.
  • Metni TEdit'te silin. Metnin kopyaladığınız şeyi doğrulamak için yapıştırın.
  • Metni TEdit'te silin.
  • TStaticText öğesini çift tıklatın.
  • Metni TEdit'e yapıştırın. Orijinal kopyalanmış metin değil, TStaticText'in yazısı olduğuna dikkat edin.

Embarcadero'ya bir hata raporu gönderdim.

TStaticTexts için çift tıklama olayı atamayı denedim. Çift tıklama etkinliğini yürütmesine rağmen, yazıyı panoya yine de kopyalar.

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

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

Bu, TLabel veya denediğim başka bir VCL denetimi ile gerçekleşmez.

Görsel tasarım amacıyla formlarımızda birçok TStaticTexts var ve TLabels'e geçmek bir seçenek değil.

Bunun olmasını önlemek için herhangi bir fikri olan var mı?

cevap

8

Bu bir delphi hatası değil, bu davranışa TStaticText VCL bileşeni tarafından oluşturulan Windows Static Control neden olur. Eğer (SS_NOTIFY tarzı TCustomStaticText bileşeninin CreateParams yöntemiyle ayarlanır SS_NOTIFY stili ayarlarsanız bunları çift tıkladığınızda Windows Vista'da başlayan

, Statik metin denetimleri otomatik panoya içeriklerini kopyalamak)

Önerilen ders How do I make it so that users can copy static text on a dialog box to the clipboard easily?

olarak bunu

gibi CreateParams yöntemi geçersiz kılmasını SS_NOTIFY stilini kaldırmak Geçici çözüm
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; 

Not: kullanıcı tıkladığında veya denetimi çift tıkladığında hiçbir STN_CLICKED, STN_DBLCLK, STN_DISABLE ve STN_ENABLE bildirim kodlarını alacak denetimden bu stili kaldırmak eğer farkında olmalıdır.

+0

Bağlandığınız makaleye göre, bir alternatif var: "* SS_NOTIFY" statik denetiminde * kopyalamak için çift tıklatma özelliğini devre dışı bırakmak isterseniz, statik denetimi alt sınıflara ayırmanız ve tıklamaları kendin." –

+0

Evet, bu geçerli bir seçenek de. – RRUZ

+0

Cevabı takdir ediyorum. VCL kontrollerinin eski Delphi'ye kıyasla daha yeni Delphi ile nasıl yaratıldığının bir iç değişimi olduğunu düşünüyorum. Delphi 6'dan XE2'ye dönüştürülen çok sayıda küçük sorunla karşılaştık. Bunun bir sorun yaratacağı bir alternatif bulmamız gerekecek. –

İlgili konular