2011-08-12 8 views
10

Próbuję przechwycić, gdy użytkownik naciśnie Ctrl + C w celu skopiowania tekstu do schowka. Jeśli użytkownik celowo naciśnie i przytrzyma klawisz Ctrl ..., a następnie naciśnie C, zarejestruje się.Delphi: Nie można przechwycić Ctrl + C, jeśli użytkownik zbyt szybko nacisnął sekwencję.

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; 

Czy istnieje powód, dla którego tak się dzieje?

Dzięki!

+10

Czy zastanawiałeś się tylko nad ustawieniem właściwości 'Skrót' elementu menu lub akcji powiązanych z tym poleceniem? Wtedy nie musisz ręcznie sprawdzać każdego możliwego skrótu w ten sposób. Nie musisz też martwić się przypadkowym przyjęciem kombinacji Ctrl + Shift + Alt + C, gdy potrzebujesz tylko Ctrl + C. –

+0

Chciałbym, ale zapomniałem wspomnieć, że jest to składnik DevExpress. Nie oferuje mi tych samych opcji, co zwykłe komponenty. Będę o tym pamiętać dla innych komponentów. Dzięki! – CodeSlinger512

Odpowiedz

19

Ctrl + C jest przetłumaczony na wiadomość znaków. Więc lepiej użyć OnKeyPress obsługi (która jest wypalana w odpowiedzi na WM_CHAR):

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


zmiana: mogę uwierzyć w to co się dzieje jest to: po naciśnięciu szybko, użytkownik naciska „Ctrl”, następnie naciskając klawisz "C", a następnie zwalniając "Ctrl", a następnie zwalniając "C". Jak widać po uruchomieniu OnKeyUp dla "C" klawisz "Ctrl" jest już zwolniony. Nie będziesz mieć tego rodzaju problemu z przetłumaczoną wiadomością, jeśli system operacyjny zarejestruje przycisk "Kopiuj", wtedy OnKeyPress zostanie uruchomiony.

2

To nie jest sekwencja, to kombinacja klawiszy. Oznacza to, że klawisze Ctrl i C muszą być wciśnięte w tym samym czasie. Jeśli użytkownik tego nie robi, nie można go przechwycić jako Ctrl + C.

Ale zgaduję. Nie mogę powiedzieć, co robi użytkownik. Być może jest też problem z klawiaturą lub sterownikiem.


Aby wyjaśnić co powiedział Rob (przypadkowo przyjmowanie innych klawiszy SHIFT), zmienić swój kod do:

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

Zdecydowanie zrobię Shift = ... zamiast tego, jak to zrobiłem. Dzięki za wskazówkę! – CodeSlinger512

4

Zwykle OnKeyDown jest bardziej preferowany niż OnKeyup dla takiego zestawu. Ponieważ użytkownicy zwykle wiedzą, że muszą nacisnąć ten klawisz Shift przed klawiszem znaku, ale nie mają ścisłego pojęcia, który z nich należy najpierw zwolnić. Można również zmienić klucz var na 0, aby uniemożliwić dalsze interpretowanie kluczy przez inne poziomy kluczowych zdarzeń, aby nadpisać pewne domyślne zachowanie.

+0

Nie rozważałem tego, ale masz rację, OnKeyDown wydaje się być lepszym miejscem do umieszczenia tego kodu – 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

Proszę wyjaśnij kod, który tutaj zamieściłeś ... –

Powiązane problemy