2011-06-07 63 views
3

从F#交互控制台数据可视化窗口的形式,我可以做到以下几点:F#:在编译的程序

open System.Windows.Forms 
let testgrid (x) =  
      let form = new Form(Visible = true)  
      let data = new DataGridView(Dock = DockStyle.Fill)  
      form.Controls.Add(data)  
      data.DataSource <- x 

testgrid [|(1,1);(2,2)|] 

但是,如果把上面的已编译的F#程序,并在程序中调用testgrid [|(1,1);(2,2)|] ,我只有没有数据的冻结窗口。需要做些什么才能使这个testgrid适用于编译的F#程序? 编辑:与ildjarn的答案和一些搜索,是下面的代码好吗?任何陷阱?

let testgrid x = 
    let makeForm() = 
     use form = new Form() 
     new DataGridView(Dock = DockStyle.Fill, DataSource = x) |> form.Controls.Add 
     Application.Run form 
    let thread = new System.Threading.Thread(makeForm) 
    thread.SetApartmentState(Threading.ApartmentState.STA) 
    thread.Start() 
+0

@matlabdbuser - 你可能会感兴趣的项目,我的工作on,FsEye(http://code.google.com/p/fseye/),一个基于WinForms的可视对象树检查器,用于FSI。 – 2011-06-07 20:34:02

+0

@Stephen,THanks为您的链接。这个项目是一个伟大的工具。 – matlabdbuser 2011-06-07 20:39:33

+0

@Stephen:真棒,值得更多曝光。 – ildjarn 2011-06-07 23:31:29

回答

3

您需要一个消息泵; FSI已经有一个,这就是为什么你的代码从FSI控制台工作,但一个独立的程序将不会有一个,除非你做一个:

open System 
open System.Windows.Forms 

let testgrid x = 
    use form = new Form() 
    new DataGridView(Dock = DockStyle.Fill, DataSource = x) |> form.Controls.Add 
    Application.Run form 

[<STAThread>] 
do testgrid [|(1,1);(2,2)|] 
+0

@ildjam,谢谢。如何使该函数在主程序调用时在独立线程中运行? – matlabdbuser 2011-06-07 20:31:20

+0

@matlabdbuser:每个进程只允许有一个UI线程,所以它取决于你的主程序的功能。它也有一个用户界面吗? – ildjarn 2011-06-07 20:36:09

+0

@ ildjam,我的程序没有aUI。问题是,如果我在'do testgrid [|(1,1);(2,2)|]'之后有代码,看起来prgram停留在窗体上并停止运行以下代码? – matlabdbuser 2011-06-07 20:42:23