2010-07-07 14 views
5

Utilizando el código ultra-simple a continuación, tan pronto como presiono una tecla en mi teclado mientras el formulario está en foco, la forma se bloquea por completo. Estoy ejecutando esto dentro de F # interactivo. La única forma de cerrar el formulario es haciendo clic en "Restablecer sesión" en F # interactivo. Intenté agregar controladores de eventos a KeyPress, con los mismos resultados. No he tenido problemas para agregar manejadores de eventos de mouse, menús, cuadros combinados, etc.La forma F # muy simple se bloquea en la entrada del teclado

Debo estar haciendo algo mal, ya que algo tan obvio como presionar una tecla en un teclado probablemente no debería ser un error en este punto para F#. ¿Algunas ideas?

// Add reference to System.Windows.Forms to project 
open System.Windows.Forms 

let a = new Form() 
a.Visible <- true 

estoy usando F # 2.0 para Windows + Visual Studio 2008 (abril de 2010 la liberación) en Windows XP.

Gracias!

Respuesta

3

Creo que se necesita una llamada a

Application.Run(a) 

pero no tengo tiempo para tratar de verificar en este momento.

EDIT:

Una cosa útil que hacer es: crear un proyecto de C# de Windows Forms, y ver lo que el código que se inicia con. Le da esto:

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

así que por supuesto se puede hacer lo mismo en C#:

open System.Windows.Forms 

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

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

Eso no funcionó: "Iniciar un segundo bucle de mensaje en un solo hilo no es una operación válida. Use Form.ShowDialog en su lugar". Sin embargo, a.ShowDialog parece funcionar. ¡Gracias! – Dave

2

Definitivamente no lo hacen tenga que llamar Application.Run(a) en Fa # interactivo, ya que gestiona su propio ciclo de mensajes (de hecho, no puedes hacer eso).

Crear un formulario y establecer Visible a true debería funcionar (y funciona en mi máquina!) Por desgracia, no estoy seguro de lo que podría causar el problema que usted reportó, pero definitivamente no es el comportamiento esperado (se parece ser un error).

El uso de ShowDialog no es una buena idea, porque cuando lo llamas, te impide ingresar más comandos en F # Interactive hasta que se cierra el cuadro de diálogo. Esto es muy desafortunado: el uso típico de F # Interactive es crear y mostrar un formulario y luego modificarlo ingresando otros comandos. Por ejemplo:

> 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 =() 

(. Marcado como wiki de la comunidad, ya que realmente no responder a la pregunta)

+0

Correcto, en F # Interactive, simplemente funciona. Pero parece que OP está haciendo un proyecto compilado. – Brian

+0

@Brian: Mencionó que está ejecutando esto en F # interactivo en la pregunta ... Sí, debería funcionar (y nunca he experimentado el comportamiento que describió). –

+0

Oh, vaya, necesito leer mejor. :) Sí, suena a pescado. – Brian

0

Este error relacionados con los subprocesos ha estado en F # durante muchos años y era un PITA muy importante para nosotros cuando nuestros productos de visualización se construyeron sobre Windows Forms. Es posible que pueda recuperar la capacidad de respuesta al presionar return varias veces en su sesión interactiva F #.

El único consejo que puedo dar es utilizar WPF en su lugar, pero conseguir que funcione de forma confiable desde F # interactivo sigue siendo bastante complicado. Este es probablemente el aspecto más útil de nuestra biblioteca F # para Visualización ...

Cuestiones relacionadas