2011-12-11 6 views
10

Nel controllo TMemo di Delphi 7, un tentativo di fare la combinazione di tasti Ctrl + A per selezionare tutto non fa nulla (non seleziona tutto). Quindi ho effettuato questa procedura:Consentendo automaticamente Ctrl + A di selezionare tutto in un TMemo?

procedure TForm1.Memo1KeyDown(Sender: TObject; var Key: Word; 
    Shift: TShiftState); 
var 
    C: String; 
begin 
    if ssCtrl in Shift then begin 
    C:= LowerCase(Char(Key)); 
    if C = 'a' then begin 
     Memo1.SelectAll; 
    end; 
    end; 
end; 

C'è un trucco in modo che non debba eseguire questa procedura? E se no, allora questa procedura sembra OK?

+0

@RRUZ il memo è probabilmente denominato 'HTML'. –

+3

Personalmente preferirei creare un componente derivato dal memo standard e gestire la pressione del tasto lì in modo che non sia necessario inquinare tutti i moduli con un codice di gestione speciale. –

+2

@David: Sai se un controllo di modifica standard di Windows in modalità multilinea non consente il comando Ctrl + A o se c'è un problema con il wrapper VCL? (Il 'TEdit' gestisce Ctrl + A come ci si aspetterebbe.) –

risposta

24

Questo è più elegante:

procedure TForm1.Memo1KeyPress(Sender: TObject; var Key: Char); 
begin 
    if Key = ^A then 
    begin 
    (Sender as TMemo).SelectAll; 
    Key := #0; 
    end; 
end; 
+4

So che sto andando avanti un po 'ma potresti spiegare il '^ A' per chi non lo sapesse (eg me!) –

+9

Il tasto Ctrl + A viene inviato come un carattere con valore ordinale 1 (Ctrl + B come 2, Ctrl + C come 3, ecc.). Fondamentalmente penso che questo sia un residuo dei vecchi tempi. Questi 'caratteri' sono solitamente scritti '^ A','^B', ecc., E Delphi li supporta. Puoi vederli in tabelle ASCII, come [su Wikipedia] (http://en.wikipedia.org/wiki/ASCII). –

+2

Non l'ho visto per anni, deve essere da TP giorni. –

0

ho usato la risposta e la discussione precedente per creare un componente autonomo che gestisce l'evento Pressione che uso in piccoli programmi di test.

TSelectMemo = class(TMemo) 
protected 
    procedure KeyPress(var Key: Char); override; 
end; 

...

procedure TSelectMemo.KeyPress(var Key: Char); 
begin 
    inherited; 
    if Key = ^A then 
    SelectAll; 
end; 

Un altro modo di aggiungere "Seleziona tutto" comportamento a tutti i componenti in un modulo è quello di aggiungere una lista di azioni per il modulo con uno standard di selezionare tutte le azioni.