2011-08-12 14 views
10

Bir kullanıcı Ctrl + C tuşlarına basarak metni panoya kopyalamak için yakalamaya çalışıyorum. Kullanıcı kasıtlı olarak Ctrl ... tuşuna basıp basılı tutarsa, C'ye basar.Delphi: Kullanıcı çok hızlı bir şekilde diziye bastıysa Ctrl + C'yi yakalayamıyorum

procedure <anObject>.KeyUp(Sender: TObject; var Key: Word; Shift: TShiftState); 
begin  
    if (ssCtrl in Shift) and (upcase(Char(key)) = 'C') 
    then 
     begin 
     //Copy code  
     end; 
end; 

Bunun olmasının bir nedeni var mı?

Teşekkürler!

+10

Sadece menü öğesinin "Kısayol" özelliğini veya bu komutla ilişkili eylemi ayarlamayı düşündünüz mü? Sonra, olası her bir kısayolu manuel olarak kontrol etmeniz gerekmez. Ctrl + C istediğinizde Ctrl + ÜstKrktr + Alt + C'yi yanlışlıkla kabul etme konusunda endişelenmenize gerek kalmayacaktır. –

+0

İsterdim ki, bunun bir DevExpress bileşeni olduğunu belirtmeyi unuttum. Bu bana normal bileşenlerle aynı seçenekleri vermiyor. Bunu diğer bileşenler için akılda tutacağım. Teşekkürler! – CodeSlinger512

cevap

19

Ctrl + C: Rob (kazara diğer kaydırma tuşları kabul) söylediklerini hesaba katmak


, için kodunuzu değiştirin.

procedure <anObject>.KeyPress(Sender: TObject; var Key: Char); 
begin 
    if Key = ^C then 
    begin 
     // Copy code 
    end; 
end; 


güncelleme:: Ne olduğu inanmak şudur: Yani daha iyi (bir WM_CHAR cevaben ateşlenir) bir OnKeyPress işleyicisi kullanmak hızla basıldığında, kullanıcı 'Ctrl' baskı yapıyor, daha sonra 'C' ye basıp 'Ctrl' bırakarak son olarak 'C' yayınlanır. 'C' için OnKeyUp'ın ne zaman tetiklendiğini gördüğünüz gibi 'Ctrl' anahtarı zaten serbest bırakıldı. İşletim sistemi “kopya” anahtarını kaydettirdiyse, OnKeyPress işten çıkarılacaksa, çevrilmiş mesajla bu tür bir problem yaşamazsınız.

2

Bu bir sıra değil, anahtar bir kombinasyon. Bu, Ctrl ve C'nin aynı zamanda'a basılması gerektiği anlamına gelir. Kullanıcı bunu yapmazsa, Ctrl + C olarak yakalanamaz. Ama tahmin ediyorum. Kullanıcının ne yaptığını anlatamam. Belki de klavye ya da bunun için bir sürücü ile ilgili bir sorun var. Bir karakter mesaja çevrilmiştir

if (Shift = [ssCtrl]) and (Upcase(Char(Key)) = 'C') then 
+0

Kesinlikle bunu yaptığımın yerine kesinlikle Shift = ... yapacağım. İşaretçi için teşekkürler! – CodeSlinger512

4

Genellikle, OnKeyDown daha çok tercih edilir, daha sonra bu tür birleşik giriş için OnKeyup. Kullanıcılar genellikle bu tuşa basmadan önce bu tuşa basmayı bildiğinden, hangisinin daha önce serbest bırakılacağına dair kesin bir fikre sahip değildir. Ayrıca, bazı varsayılan olayları geçersiz kılmak için tuşların diğer önemli olaylarla daha fazla yorumlanmasını önlemek için var Anahtarını 0 olarak değiştirebilirsiniz.

+0

Bunu düşünmemiştim ama haklısın, OnKeyDown bu kodu koymak için daha iyi bir yer gibi görünüyor – CodeSlinger512

0
Procedure TForm1.StringGrid1KeyPress (Sender: TObject; var Key: Char); 

Var 
    Sel: TGridRect; // Selecting the Scenes 
    St: String; // Stroke 
    R, c: word; // Row-Stroke, Col-Column 

    Begin 
If Key =^C then 
    Begin 
    St: = '';// A full explanation of the structure 
    Sel: = StringGrid1.Selection; // Wait a while for a loose ticket 
    For r: = Sel.Top to Sel.Bottom do // query the lines of the first row 
    Begin 
    For c: = Sel.Left to Sel.Right do // query the number of lines in the foreground 
    // Scribble in the Stroke of a Distributor 
    If c = Sel.Right then St: = St + StringGrid1.Cells [c, r] else St: = St + StringGrid1.Cells [c, r] + # 9; 
    St: = St + # 13 # 10; // the pattern of the stencil 
    End; 
    ClipBoard.AsText: = St; // Displays the alarm 
    End; 

End; 
+1

Lütfen buraya gönderdiğiniz kodu açıkla ... –

İlgili konular