2012-10-30 25 views
6

我目前正在通過「真實世界函數式編程」的方式工作。我正在嘗試使用Windows窗體獲得示例1.12工作,這是一個「hello world」程序。這是代碼: - 「開始在單個線程第二個消息循環是無效操作」 -在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();; 

不幸的是,這將引發一個錯誤所以顯然有一個窗口打開,並沒有終止,這是令人困惑的程序。我看不出如何解決這個錯誤,任何人都可以幫我解決問題嗎?

我也曾嘗試輸入最後的代碼塊爲: -

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

但是,這並不能幫助。代碼運行良好,但沒有結果,最後一行被註釋掉。

+2

我懷疑從'讓hello'需縮進,行 - 儘管這可能只是複製 –

+0

是。你是對的,會編輯。 –

+0

這不是解決你的問題,但你不需要使用;;無處不在 –

回答

6

該示例旨在作爲Windows窗體應用程序進行編譯和運行。如果您想在F#Interactive中運行它,則必須使用frm.Show()而不是Application.Run(frm)

你可以讓這個例子在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#相關的谷歌操作符有點困難! :) –

+1

請按照我的答案中的鏈接參考。 '#if','#else'和'#endif'是預處理器,以協助F#編譯器有條件地編譯代碼。 – pad