2010-08-14 2 views
3

En C#, vous pouvez exprimer des caractères pour l'événement KeyPress sous la forme Keys.Control | Keys.M. En F #, Keys.Control ||| Keys.M ne fonctionne pas. Que fait?Comment exprimez-vous (Keys.Control | Keys.M) en F #?

Modifier: Intéressant en effet. L'utilisation de System.Windows.Forms.Keys.Control ||| System.Windows.Forms.Keys.M selon la suggestion de Johannes Rössel ci-dessous dans la fenêtre interactive F # fonctionne exactement comme il le montre. il écrit dans un fichier .fs:

form.KeyPress.Add (fun e -> 
     if (e.KeyChar = (System.Windows.Forms.Keys.Control ||| System.Windows.Forms.Keys.M)) then textbox.SelectAll()) 

me donne l'erreur The type 'char' does not support any operators named '|||'. J'ai donc probablement mal identifié l'emplacement du problème. Il n'y a pas de typecasting de Keys à char.

+0

"Ne fonctionne pas" est très vague. Peut-être que vous pourriez poster une erreur spécifique à la place. – Gian

Répondre

2

Utilisation +:

Keys.Control + Keys.M 

FWIW, ||| fonctionne pour moi, bien que:

> System.Windows.Forms.Keys.Control ||| System.Windows.Forms.Keys.M;; 
val it : System.Windows.Forms.Keys = M, Control 
+0

Vous avez raison, j'ai modifié la question pour montrer où je me suis trompé. Quelle est la différence entre '+' et '|||' dans ce cas? –

+0

@Muhammad: '|||' est le bit ou l'opérateur. '+ 'est l'addition. –

4

juste un peu plus de la réponse de Johaness Rössel, il est plus agréable (ou 'plus fonctionnelle') façon de Pour ce faire, utilisez la programmation réactive.

form.KeyDown 
    |> Event.filter (fun e -> e.KeyData = (Keys.Control + Keys.M)) 
    |> Event.map (fun _ -> textbox.SelectAll()) 
    |> ignore 
+1

Je pense que vous pouvez utiliser 'Event.add' au lieu de' Event.map', puis supprimer '|> ignore'. – kvb

+0

@Matajon, merci. Je regarderai le FRP plus tard. Je traduisais juste un outil que j'avais déjà d'IronPython et je n'ai pas eu le temps de le rendre plus fonctionnel. –