2012-10-30 17 views
6

Obecnie pracuję nad "Programowaniem funkcjonalnym w świecie rzeczywistym". Próbuję uzyskać przykład 1.12 pracy, program "cześć świat" za pomocą formularzy systemu Windows. To jest kod: -Orientacja obiektowa "Witaj świecie" za pomocą Windows Forms w języku F #

open System.Drawing;; 
    open System.Windows.Forms;; 

    type HelloWindow() = 
     let frm = new Form(Width = 400, Height = 140) 
     let fnt = new Font("Times New Roman", 28.0f) 
     let lbl = new Label(Dock = DockStyle.Fill, Font = fnt, 
           TextAlign = ContentAlignment.MiddleCenter) 
     do frm.Controls.Add(lbl) 


     member x.SayHello(name) = 
       let msg = "Hello" + name + "!" 
       lbl.Text <- msg 

     member x.Run() = 
       Application.Run(frm);; 

    let hello = new HelloWindow();; 
    hello.SayHello("you");; 
    hello.Run();; 

Niestety, powoduje to błąd - "Uruchomienie drugiej pętli wiadomości na jednym wątku nie jest prawidłową operacją." Oczywiste jest, że istnieje okno, które się nie otwiera, a to dezorientuje program. Nie widzę sposobu naprawienia błędu, czy ktoś może mi pomóc?

Próbowałem również wprowadzenie ostatecznej blok kodu jak: -

let hello = new HelloWindow() 
    hello.SayHello("you") 
    hello.Run();; 

Ale to nie pomaga. Kod działa poprawnie, ale nie daje wyniku, skomentowano ostatni wiersz.

+2

Podejrzewam linie od 'niech hello' trzeba wcięcie - mimo że może być po prostu kopiowanie –

+0

Tak . Masz rację, dokonasz edycji. –

+0

To nie rozwiązuje twojego problemu, ale nie musisz go używać ;; wszędzie –

Odpowiedz

6

Przykład miał na celu skompilowanie i uruchomienie jako aplikacja Windows Form. Jeśli chcesz uruchomić go w F # Interactive, musisz użyć frm.Show() zamiast Application.Run(frm).

Można zrobić przykład pracować zarówno w F # Interactive i zestawionych projektów przy użyciu compiler directives:

type HelloWindow() = 
    let frm = new Form(Width = 400, Height = 140) 
    // ... 
    // The same as before 

    member x.Run() = 
     #if INTERACTIVE 
     frm.Show() 
     #else 
     Application.Run(frm) 
     #endif 
+0

OK, to działa teraz. Dzięki, nauczyłem się czegoś bardzo przydatnego w rozwiązaniu. –

+0

Ciekawe, co oznacza #? Czy jest to tag wskazujący, czy jest wywoływany w innym trybie? Trochę trudno jest google to operator w stosunku do F # !! :) –

+1

Proszę kliknąć na link w mojej odpowiedzi dla odniesienia. '# if',' # else' i '# endif' to preprocesory wspomagające kompilator F # w kompilacji warunkowo kodu. – pad

Powiązane problemy