6

我目前正在研究“真实世界函数式编程”。我正在尝试让示例 1.12 工作,这是一个使用 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();;

不幸的是,这会引发错误 - “在单个线程上启动第二个消息循环不是有效的操作。” 所以很明显有一个窗口打开而不是终止,这使程序感到困惑。我看不到如何修复错误,有人可以帮助我吗?

我还尝试将最终代码块输入为:-

    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 回答