2012-10-30 4 views
6

私は現在、 "Real World Functional Programming"を使っています。私は、Windowsフォームを使用した "hello world"プログラムの例1.12を手に入れようとしています。これはコードです: -F#でWindowsフォームを使用するオブジェクト指向の "Hello world"

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

残念ながら、これはエラーをスローします - 「シングルスレッドで2番目のメッセージループを開始することは有効な操作ではありません。」だから明らかにウィンドウが開いていて終了していないので、プログラムが混乱しています。私はエラーを修正する方法を見ることができない、誰も私を助けることができますか?

私としても、最終的なコードブロックを入力しようとしている: -

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

しかし、それは助けにはなりません。コードは正常に実行されますが、最終行がコメントアウトされても結果は生成されません。

+2

私は 'hello'は、インデントする必要がありましょうからライン疑う - それはちょうどコピーかもしれないが –

+0

はいを。あなたは正しい、編集されます。 –

+0

これはあなたの問題を解決するものではありませんが、;;を使用する必要はありません。どこでも –

答えて

6

この例は、Windowsフォームアプリケーションとしてコンパイルして実行することを意図していました。 F#Interactiveで実行する場合は、Application.Run(frm)の代わりにfrm.Show()を使用する必要があります。

あなたは例がF#インタラクティブにし、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

さて、それは今動作します。ありがとう、私は解決策から非常に有用な何かを学んだ。 –

+0

興味があるから#は何を表していますか?これは、別のモードで呼び出されたかどうかを示すタグですか? F#に関連して演算子をGoogleにするのは少し難しいです! :) –

+1

参照のために私の答えのリンクに従ってください。 '#if'、'#else'、 '#endif'は、F#コンパイラが条件付きでコードをコンパイルするのを助けるためのプリプロセッサです。 – pad