2010-07-07 5 views
5

En utilisant le code ultra-simple ci-dessous, dès que j'appuie sur une touche de mon clavier alors que le formulaire est au point, le formulaire se bloque complètement. Je cours ceci dedans F # interactif. La seule façon de fermer le formulaire est de cliquer sur "Réinitialiser la session" dans F # interactif. J'ai essayé d'ajouter des gestionnaires d'événements à KeyPress, avec les mêmes résultats. Je n'ai eu aucun problème à ajouter des gestionnaires d'événements souris, des menus, des listes déroulantes, etc.Formulaire F # très simple verrouillé sur l'entrée du clavier

Je dois faire quelque chose de mal, car quelque chose d'aussi évident que d'appuyer sur une touche sur un clavier ne devrait probablement pas être un bug pour le moment F#. Des idées? J'utilise F # 2.0 pour Windows + Visual Studio 2008 (version d'avril 2010) sur Windows XP.

Merci!

Répondre

3

Je pense que vous avez besoin d'un appel à

Application.Run(a) 

mais je n'ai pas le temps d'essayer et de vérifier en ce moment.

EDIT:

Une chose utile à faire est: créer un projet C# Windows Form, et voir quel code il vous commence avec. Il vous donne ceci:

[STAThread] 
    static void Main() 
    { 
     Application.EnableVisualStyles(); 
     Application.SetCompatibleTextRenderingDefault(false); 
     Application.Run(new Form1()); 
    } 

si bien sûr vous pouvez faire la même chose en F #:

open System.Windows.Forms 

let Main() = 
    Application.EnableVisualStyles() 
    Application.SetCompatibleTextRenderingDefault(false) 
    Application.Run(new Form()) 

[<System.STAThread>] 
do 
    Main() 
+1

Cela ne fonctionnait pas: "Démarrer une deuxième boucle de messages sur un seul thread n'est pas une opération valide. Utilisez plutôt Form.ShowDialog." Toutefois, a.ShowDialog semble fonctionner. Merci! – Dave

2

Vous certainement ne pas besoin d'appeler Application.Run(a) en F # Interactive, car il gère son propre boucle de message (en fait, vous ne pouvez pas faire cela).

Création d'un formulaire et la mise Visible à true devrait fonctionner (et il fonctionne sur ma machine!) Unfortunatelly, je ne sais pas ce qui pourrait causer le problème que vous avez signalé, mais il est certainement pas le comportement attendu (il semble être un bug). L'utilisation de ShowDialog n'est pas une bonne idée, car lorsque vous l'appelez, cela vous empêche de saisir d'autres commandes dans F # Interactive jusqu'à la fermeture de la boîte de dialogue. C'est très regrettable - l'utilisation typique de F # Interactive est de créer et d'afficher un formulaire, puis de le modifier en entrant d'autres commandes. Par exemple:

> let a = new Form();; 
val a : Form = System.Windows.Forms.Form, Text: 

> a.Visible <- true;; // Displays the form 
val it : unit =() 

> a.Text <- "Hello";; // Changes title of the form 
val it : unit =() 

(. Marqué comme communauté wiki, parce que je ne l'ai pas vraiment répondu à la question)

+0

À droite, dans F # Interactive, ça marche. Mais il semble que le PO fasse un projet compilé. – Brian

+0

@Brian: Il a mentionné qu'il est en cours d'exécution dans F # interactif dans la question ... Oui, cela devrait fonctionner (et je n'ai jamais expérimenté le comportement qu'il a décrit). –

+0

Oh, oups, j'ai besoin de mieux lire. :) Oui, ça a l'air doré. – Brian

0

Ce bug lié fil est en F # depuis de nombreuses années et était un PITA énorme pour nous lorsque nos produits de visualisation ont été construits sur Windows Forms. Vous pourriez être en mesure d'obtenir la réactivité en frappant revenir plusieurs fois dans votre session interactive F #. Le seul conseil que je peux donner est d'utiliser WPF à la place, mais le faire fonctionner de manière fiable à partir de F # interactif est encore assez difficile. Ceci est probablement l'aspect le plus utile de notre bibliothèque F # pour Visualization ...