2012-06-20 11 views
5

Dwukrotne kliknięcie TStaticText na formularzu powoduje skopiowanie podpisu tego TStaticText do schowka. Nie jest potrzebne zdarzenie z podwójnym kliknięciem.dwukrotne kliknięcie TStaticText w Delphi XE2 kopiowanie podpisów aplikacji do schowka

Kroki do odtworzenia:

  • Korzystanie aktualizacji Win 64 i Delphi XE2 4.
  • Tworzenie VCL Forms aplikacji.
  • Umieść TEdit na formularzu.
  • Umieść tekst TStaticText w formularzu. Zmień podpis na "TStaticText1Caption"
  • Umieść drugi TStaticText w formularzu. Zmień podpis na "TStaticText2Caption"
  • Uruchom program (F9)
  • Wpisz tekst do TEdit. Wybierz wszystko i skopiuj za pomocą CTRL + C.
  • Usuń tekst z TEdit. Wklej go, aby sprawdzić, czy tekst jest tym, co skopiowałeś.
  • Usuń tekst z TEdit.
  • Kliknij dwukrotnie tekst TStaticText.
  • Wklej tekst do TEdit. Zauważ, że nie jest to oryginalny skopiowany tekst, ale podpis TStaticText.

Złożyłem już zgłoszenie błędu do Embarcadero.

Próbowałem przypisać zdarzenie dwukrotne do TStaticTexts. Nadal kopiuje podpis do schowka, nawet jeśli wykonuje zdarzenie dwukrotne kliknięcie.

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

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

Nie dzieje się tak z TLabel lub jakimkolwiek innym sterownikiem VCL, którego próbowałem.

Mamy wiele tekstów TStaticText w naszych formularzach do celów projektowania wizualnego, a zmiana na TLabels nie jest opcją.

Ktoś ma jakieś pomysły, jak temu zapobiec?

Odpowiedz

8

To nie jest błąd delphi, to zachowanie jest spowodowane przez Windows Static Control, który jest tworzony przez składnik TStaticText VCL.

Uruchamianie w systemie Windows Vista, statyczne elementy sterujące tekstowe automatycznie kopiować ich zawartość do schowka, po dwukrotnym kliknięciu je po ustawieniu SS_NOTIFY styl (the SS_NOTIFY styl jest ustawiony metodą CreateParams składnika TCustomStaticText)

rECOMENDED wykład How do I make it so that users can copy static text on a dialog box to the clipboard easily?

Jako obejście można usunąć SS_NOTIFY styl przesłanianie CreateParams metodę jak tak

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; 

Uwaga: należy pamiętać, jeśli usunąć ten styl z kontrolą nie będziesz odbierać STN_CLICKED, STN_DBLCLK, STN_DISABLE i STN_ENABLE kody powiadomienie, gdy użytkownik kliknie lub kliknie dwukrotnie kontrolę.

+0

Zgodnie z artykułem, do którego linkujesz, istnieje alternatywa: "jeśli chcesz wyłączyć funkcję * podwójnego kliknięcia, aby skopiować * w sterowaniu statycznym' SS_NOTIFY', musisz podklasować kontrolę statyczną i zjeść kliknięcia siebie." –

+0

Tak, jest to również ważna opcja. – RRUZ

+0

Doceniam odpowiedź. Sądzę, że jest to wewnętrzna zmiana sposobu, w jaki formanty VCL są tworzone z nowszym Delphi w porównaniu ze starszym Delphi. Wystąpiło wiele drobnych problemów podczas konwersji z Delphi 6 na XE2. Będziemy musieli znaleźć alternatywę tam, gdzie mogłoby to spowodować problem. –

Powiązane problemy