f #: форма windows в скомпилированной программе - PullRequest
3 голосов
/ 08 июня 2011

Чтобы визуализировать данные из интерактивной консоли 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()

1 Ответ

3 голосов
/ 08 июня 2011

Вам нужен насос сообщения; У 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)|]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...