2010-07-07 17 views
5

Korzystając z bardzo prostego kodu poniżej, po naciśnięciu klawisza na klawiaturze, gdy fokus jest w formularzu, formularz całkowicie się blokuje. Używam tego wewnątrz F # interaktywnego. Jedynym sposobem na zamknięcie formularza jest kliknięcie "Zresetuj sesję" w F # interaktywnym. Próbowałem już dodawać programy obsługi zdarzeń do KeyPress, z tymi samymi wynikami. Nie miałem problemu z dodaniem programów obsługi zdarzeń myszy, menu, pól kombi itd.Bardzo prosty formularz F # blokuje się przy wprowadzaniu z klawiatury

Musiałem robić coś nie tak, ponieważ coś tak oczywistego jak naciskanie klawisza na klawiaturze prawdopodobnie nie powinno być błędem w tym momencie FA#. Jakieś pomysły?

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

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

Używam F # 2.0 dla Windows + Visual Studio 2008 (wersja z kwietnia 2010) w systemie Windows XP.

Dzięki!

Odpowiedz

3

myślę, że trzeba zadzwonić do

Application.Run(a) 

ale nie mam czasu, aby wypróbować i sprawdzić teraz.

EDIT:

Przydatną rzeczą do zrobienia jest: utworzyć projekt C# Windows Form i zobaczyć, co kod zaczyna cię z. To daje w ten sposób:

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

więc oczywiście można zrobić to samo w F #:

open System.Windows.Forms 

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

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

To nie działało: "Uruchomienie drugiej pętli wiadomości na jednym wątku nie jest poprawną operacją. Zamiast tego użyj Form.ShowDialog." Jednak a.ShowDialog wydaje się działać. Dzięki! – Dave

2

pewno nie trzeba zadzwonić Application.Run(a) w F # Interactive, ponieważ zarządza własną pętla wiadomości (w rzeczywistości nie możesz tego zrobić).

Tworzenie formularza i ustawienie Visible do true powinien działać (i działa na moim komputerze!) Niestety, nie jestem pewien, co może być przyczyną tego problemu, które podano, ale to na pewno nie jest oczekiwane zachowanie (to wydaje się być jakimś błędem).

Używanie ShowDialog nie jest dobrym pomysłem, ponieważ po jego wywołaniu blokuje dostęp do kolejnych poleceń w F # Interactive, dopóki okno dialogowe się nie zamknie. To bardzo niefortunne - typowym zastosowaniem F # Interactive jest tworzenie i pokazywanie formularza, a następnie modyfikowanie go poprzez wprowadzanie innych poleceń. Na przykład:

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

(. Oznaczone jako Wiki, bo tak naprawdę nie odpowiedzieć na pytanie)

+0

Dobrze, w F # Interactive, po prostu działa. Ale wygląda na to, że OP robi skompilowany projekt. – Brian

+0

@Brian: Wspomniał, że uruchamia to w języku F # w pytaniu ... Tak, to powinno działać (i nigdy nie doświadczyłem zachowania, które opisał). –

+0

Och, oops, muszę przeczytać lepiej. :) Tak, brzmi podejrzanie. – Brian

0

to związane wątku bug został w F # przez wiele lat i był ogromny PITA dla nas kiedy nasze produkty do wizualizacji zostały zbudowane na Windows Forms. Możesz być w stanie odzyskać responsywność, kilkakrotnie uderzając klawiszem powrotu w sesję interaktywną F #.

Jedyną radą jaką mogę dać jest użycie WPF zamiast tego, ale sprawienie, że działa niezawodnie z F # interactive jest wciąż dość trudne. Jest to prawdopodobnie najbardziej przydatny aspekt naszej biblioteki F # for Visualization ...

Powiązane problemy