Очень простая форма F # блокируется при вводе с клавиатуры - PullRequest
5 голосов
/ 07 июля 2010

Используя очень простой код, приведенный ниже, как только я нажимаю клавишу на клавиатуре, когда форма находится в фокусе, форма полностью блокируется.Я запускаю это внутри F # интерактивно.Единственный способ закрыть форму - нажать «Сбросить сеанс» в F # интерактиве.Я попытался добавить обработчики событий в KeyPress, с теми же результатами.У меня не было проблем с добавлением обработчиков событий мыши, меню, полей со списком и т. Д.

Я, должно быть, делаю что-то не так, так же очевидно, как нажатие клавиши на клавиатуре, вероятно, не должно быть ошибкойочко для F #.Есть идеи?

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

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

Я использую F # 2.0 для Windows + Visual Studio 2008 (выпуск от апреля 2010 г.) на Windows XP.

Спасибо!

Ответы [ 3 ]

3 голосов
/ 07 июля 2010

Я думаю, вам нужен звонок на

Application.Run(a)

, но у меня нет времени, чтобы попробовать и проверить прямо сейчас.

РЕДАКТИРОВАТЬ:

Полезная вещьсделать это: создать проект C # Windows Form и посмотреть, с какого кода он вас запускает.Это дает вам следующее:

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

, поэтому, конечно, вы можете сделать то же самое в F #:

open System.Windows.Forms 

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

[<System.STAThread>]
do
    Main()
2 голосов
/ 07 июля 2010

Вы определенно не должны вызывать Application.Run(a) в F # Interactive, потому что он управляет собственным циклом сообщений (фактически, вы не можете этого сделать).

Создание формы и установка Visible на true должны работать (и это работает на моей машине!) К сожалению, я не уверен, что может вызвать проблему, о которой вы сообщили, но это определенноне ожидаемое поведение (кажется, что это какая-то ошибка).

Использование ShowDialog не является хорошей идеей, потому что когда вы вызываете его, он блокирует вас от ввода дальнейших команд в F # Interactive до закрытия диалогового окна.Это очень прискорбно - типичное использование F # Interactive - создание и отображение формы, а затем ее изменение путем ввода других команд.Например:

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

(помечено как вики сообщества, потому что я не ответила на вопрос.)

0 голосов
/ 09 июля 2010

Эта ошибка, связанная с потоками, существует в F # уже много лет и была для нас огромной PITA, когда наши продукты для визуализации были построены на Windows Forms. Возможно, вы сможете вернуть отзывчивость, нажав несколько раз return в вашей интерактивной сессии F #.

Единственный совет, который я могу дать, - это использовать WPF, но получить надежную работу из F # interactive все еще довольно сложно. Это, пожалуй, самый полезный аспект нашей библиотеки F # для визуализации ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...