6

私は現在、「実世界関数型プログラミング」に取り組んでいます。Windowsフォームを使用した「HelloWorld」プログラムである例1.12を機能させようとしています。これはコードです:-

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

しかし、それは役に立ちません。コードは正常に実行されますが、最後の行がコメント化された結果は生成されません。

4

1 に答える 1

6

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

コンパイラ ディレクティブを使用して、F# Interactive とコンパイル済みプロジェクトの両方でこの例を機能させることができます。

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
于 2012-10-30T10:24:12.580 に答える