Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xslt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在F#中为WinForms应用程序创建按钮处理程序_Winforms_Events_F#_Click_Messagebox - Fatal编程技术网

在F#中为WinForms应用程序创建按钮处理程序

在F#中为WinForms应用程序创建按钮处理程序,winforms,events,f#,click,messagebox,Winforms,Events,F#,Click,Messagebox,我正在尝试用F#做一个非常简单的应用程序。我只想用click事件创建一个小按钮,它将调用MessageBox.Show()方法 open System open System.Windows.Forms module FSI = [<System.Runtime.InteropServices.DllImport("user32.dll")>] extern bool ShowWindow(nativeint hWnd, int flags) let Hid

我正在尝试用F#做一个非常简单的应用程序。我只想用click事件创建一个小按钮,它将调用
MessageBox.Show()
方法

open System
open System.Windows.Forms

module FSI =
    [<System.Runtime.InteropServices.DllImport("user32.dll")>]
    extern bool ShowWindow(nativeint hWnd, int flags)
    let HideConsole() = 
        let proc = System.Diagnostics.Process.GetCurrentProcess()
        ShowWindow(proc.MainWindowHandle, 0)

FSI.HideConsole()

let form1 = new Form()
form1.Text <- "App"

let Test() = ( MessageBox.Show("Clicked.") )

let button1 = new Button( Text = "Click Me" )
button1.Click.AddHandler(fun _ _ -> Test())

form1.Controls.Add(button1)    

[<STAThread>]
do
   Application.Run(form1)
开放系统
打开System.Windows.Forms
模块FSI=
[]
外部布尔显示窗口(nativeint hWnd、int标志)
设HideConsole()
让proc=System.Diagnostics.Process.GetCurrentProcess()
ShowWindow(proc.MainWindowHandle,0)
FSI.hideconole()
设form1=新表单()
form1.Text Test())
表单1.控件.添加(按钮1)
[]
做
Application.Run(form1)
出现以下错误:

  • FSI.HideConsole()//警告
  • button1.Click.AddHandler(fun->Test())//编译器错误
它们是相似的

第一届:

  • 警告:此表达式应具有类型“unit”,但具有类型“bool”。使用“忽略”放弃表达式的结果,或使用“let”将结果绑定到名称
第二次:

  • 此表达式应具有unit类型,但此处具有DialogResult类型
F#函数隐式返回其上一个表达式的结果,因此当前您的函数Test()返回
MessageBox.Show(string)
的结果。要创建返回void/unit的函数,可以使用ignore操作符

let Test() = ignore (MessageBox.Show("Clicked."))
必须进行额外的括号换行有点麻烦,因此通常使用pipeforward(
|>
)操作符,它不需要:-

let Test() = MessageBox.Show("Clicked.") |> ignore
这也适用于您对Hideconole的调用。编译器使用此警告通知您未使用HideConsole的返回值。

F#函数隐式返回其上一个表达式的结果,因此当前您的函数Test()返回
MessageBox.Show(string)
的结果。要创建返回void/unit的函数,可以使用ignore操作符

let Test() = ignore (MessageBox.Show("Clicked."))
必须进行额外的括号换行有点麻烦,因此通常使用pipeforward(
|>
)操作符,它不需要:-

let Test() = MessageBox.Show("Clicked.") |> ignore

这也适用于您对Hideconole的调用。编译器使用此警告通知您未使用HideConsole的返回值。

当我按照您在此处所说的那样做时,我遇到了一个新错误:连续参数应该用空格或元组分隔,涉及函数或方法应用程序的参数应该用括号括起来。刚刚编辑了我的答案。您必须将呼叫包装到MessageBox。显示在括号中。谢谢!它现在可以工作了,但是您在这里提供的第一个变体在VS中对我不起作用:(@GeloVolro请参见编辑。(顺便说一句,第一个在VS2012中对我起作用)@RubenBartelink我使用了VS2010,但我安装了最后一个.NET FW。当我按照您在这里所说的那样做时,我遇到了一个新错误:连续的参数应该用空格或元组分隔,涉及函数或方法应用程序的参数应该用括号括起来。只需编辑我的答案。您必须将对MessageBox.Show的调用包装在括号中。thanks!它现在可以工作了,但是你在这里提供的第一个变体在VS中对我不起作用:(@GeloVolro请参见编辑。(顺便说一句,第一个在VS2012中对我起作用)@RubenBartelink我使用了VS2010,但我安装了最后一个.NET FW。