none
Problemas al crear un windows form con F#, RRS feed

  • Pregunta

  • Saludos cordiales msdn, les presento muy amablamente este caso :  el problema es que estoy analizando un ejemplo de la dirección http://msdn.microsoft.com/es-es/magazine/cc164244.aspx si nos damos cuenta la identación de las sangrias estan ok pero me lanza error de finalización de bloque:

     

    #light
    
    open System
    open System.IO
    open System.Windows.Forms
    open Printf
    
    let form = new Form(Text="My First F# Form", Visible=true)
    
    let menu = form.Menu <- new MainMenu()
    let mnuFile = form.Menu.MenuItems.Add("&File")
    let filter = "txt files (*.txt)|*.txt|All files (*.*)|*.*"
    
    let mnuiOpen =
      new MenuItem("&Open...",
        new EventHandler(fun _ _ ->
          let dialog = 
            new OpenFileDialog(InitialDirectory="c:\\",
              Filter=filter;
              FilterIndex=2, 
              RestoreDirectory=true) 
            if dialog.ShowDialog() = DialogResult.OK then
              match dialog.OpenFile() with
              | null -> printf "Could not read the file...\n"
              | s ->
                let r = new StreamReader(s) 
                printf "First line is: %s!\n" (r.ReadLine());
                s.Close();
        ),
        Shortcut.CtrlO)
    
    mnuFile.MenuItems.Add(mnuiOpen)
    
    [<STAThread>]
    do Application.Run(form)

     

    Entonces sucede esto Error    1    El bloque que sigue a este 'let' está sin finalizar. Se espera una expresión. Me doy cuenta que en el let mnuiOpen no funciona la identación que está mal, no entiendo mucho de f# pero creo que está bien el codigo del ejemplo..que puedo agradecer.....muchas gracias por su atención....

     

    PD: Entorno Visual Studio 2010

     


    • Editado adri1987 jueves, 22 de septiembre de 2011 19:26
    jueves, 22 de septiembre de 2011 19:23

Respuestas

  • Hola,
     
    yo creo que el ejemplo está desactualizado, al menos para F# 2, que viene con Visual Studio 2010. Corregí el código y funciona.
     
     
     
    #light
     
    open System
    open System.IO
    open System.Windows.Forms
    open Printf
     
    let form = new Form(Text="My First F# Form", Visible=true)
     
    let menu = form.Menu <- new MainMenu()
    let mnuFile = form.Menu.MenuItems.Add("&File")
    let filter = "txt files (*.txt)|*.txt|All files (*.*)|*.*"
     
    let mnuiOpen =
      new MenuItem("&Open...",
        new EventHandler(fun _ _ ->
          let dialog = new OpenFileDialog()
          dialog.InitialDirectory <- "C:\\"
          dialog.Filter <- filter;
          dialog.FilterIndex <- 2
          dialog.RestoreDirectory <- true
          if dialog.ShowDialog() = DialogResult.OK then
            match dialog.OpenFile() with
            | null -> printf "Could not read the file...\n"
            | s ->
              let r = new StreamReader(s)
              printf "First line is: %s!\n" (r.ReadLine());
              s.Close();
        ),
        Shortcut.CtrlO)
     
    let _ = mnuFile.MenuItems.Add(mnuiOpen)
     
    [<STAThread>]
     
    do Application.Run(form)

     
    ¡Saludos!
     


    Fernando Gómez
    fermasmas.wordpress.com
    • Editado Fernando A. Gómez jueves, 22 de septiembre de 2011 19:38
    • Marcado como respuesta adri1987 jueves, 22 de septiembre de 2011 20:12
    jueves, 22 de septiembre de 2011 19:37
  • Changos... alternativamente, el código original tiene un punto y coma al inicializar el OpenFileDialog... cómo no lo ví antes de cambiarlo... :P

     

    #light
    
    open System
    open System.IO
    open System.Windows.Forms
    open Printf
    
    let form = new Form(Text="My First F# Form", Visible=true)
    
    let menu = form.Menu <- new MainMenu()
    let mnuFile = form.Menu.MenuItems.Add("&File")
    let filter = "txt files (*.txt)|*.txt|All files (*.*)|*.*"
    
    let mnuiOpen =
      new MenuItem("&Open...",
        new EventHandler(fun _ _ -> 
          let dialog = new OpenFileDialog(InitialDirectory="c:\\", Filter=filter, FilterIndex=2, RestoreDirectory=true) 
          if dialog.ShowDialog() = DialogResult.OK then
            match dialog.OpenFile() with
            | null -> printf "Could not read the file...\n"
            | s ->
              let r = new StreamReader(s) 
              printf "First line is: %s!\n" (r.ReadLine());
              s.Close();
        ),
        Shortcut.CtrlO)
    
    let _ = mnuFile.MenuItems.Add(mnuiOpen) 
    
    [<STAThread>]
    
    do Application.Run(form)


     



    Fernando Gómez
    fermasmas.wordpress.com
    • Editado Fernando A. Gómez jueves, 22 de septiembre de 2011 19:48
    • Marcado como respuesta adri1987 jueves, 22 de septiembre de 2011 20:11
    jueves, 22 de septiembre de 2011 19:47
  • Hola,

    quizás puedes usar String.Split.

    http://msdn.microsoft.com/en-us/library/b873y76a.aspx#Y0

     

    member Split : 
            separator:char[] -> string[] 

    Saludos.



    Fernando Gómez
    fermasmas.wordpress.com
    • Marcado como respuesta adri1987 viernes, 23 de septiembre de 2011 4:06
    jueves, 22 de septiembre de 2011 23:18

Todas las respuestas

  • Hola,
     
    yo creo que el ejemplo está desactualizado, al menos para F# 2, que viene con Visual Studio 2010. Corregí el código y funciona.
     
     
     
    #light
     
    open System
    open System.IO
    open System.Windows.Forms
    open Printf
     
    let form = new Form(Text="My First F# Form", Visible=true)
     
    let menu = form.Menu <- new MainMenu()
    let mnuFile = form.Menu.MenuItems.Add("&File")
    let filter = "txt files (*.txt)|*.txt|All files (*.*)|*.*"
     
    let mnuiOpen =
      new MenuItem("&Open...",
        new EventHandler(fun _ _ ->
          let dialog = new OpenFileDialog()
          dialog.InitialDirectory <- "C:\\"
          dialog.Filter <- filter;
          dialog.FilterIndex <- 2
          dialog.RestoreDirectory <- true
          if dialog.ShowDialog() = DialogResult.OK then
            match dialog.OpenFile() with
            | null -> printf "Could not read the file...\n"
            | s ->
              let r = new StreamReader(s)
              printf "First line is: %s!\n" (r.ReadLine());
              s.Close();
        ),
        Shortcut.CtrlO)
     
    let _ = mnuFile.MenuItems.Add(mnuiOpen)
     
    [<STAThread>]
     
    do Application.Run(form)

     
    ¡Saludos!
     


    Fernando Gómez
    fermasmas.wordpress.com
    • Editado Fernando A. Gómez jueves, 22 de septiembre de 2011 19:38
    • Marcado como respuesta adri1987 jueves, 22 de septiembre de 2011 20:12
    jueves, 22 de septiembre de 2011 19:37
  • Changos... alternativamente, el código original tiene un punto y coma al inicializar el OpenFileDialog... cómo no lo ví antes de cambiarlo... :P

     

    #light
    
    open System
    open System.IO
    open System.Windows.Forms
    open Printf
    
    let form = new Form(Text="My First F# Form", Visible=true)
    
    let menu = form.Menu <- new MainMenu()
    let mnuFile = form.Menu.MenuItems.Add("&File")
    let filter = "txt files (*.txt)|*.txt|All files (*.*)|*.*"
    
    let mnuiOpen =
      new MenuItem("&Open...",
        new EventHandler(fun _ _ -> 
          let dialog = new OpenFileDialog(InitialDirectory="c:\\", Filter=filter, FilterIndex=2, RestoreDirectory=true) 
          if dialog.ShowDialog() = DialogResult.OK then
            match dialog.OpenFile() with
            | null -> printf "Could not read the file...\n"
            | s ->
              let r = new StreamReader(s) 
              printf "First line is: %s!\n" (r.ReadLine());
              s.Close();
        ),
        Shortcut.CtrlO)
    
    let _ = mnuFile.MenuItems.Add(mnuiOpen) 
    
    [<STAThread>]
    
    do Application.Run(form)


     



    Fernando Gómez
    fermasmas.wordpress.com
    • Editado Fernando A. Gómez jueves, 22 de septiembre de 2011 19:48
    • Marcado como respuesta adri1987 jueves, 22 de septiembre de 2011 20:11
    jueves, 22 de septiembre de 2011 19:47
  • Gracias por tu atención caballero, pero tengo una duda adicional,  la versión de F# 2.0 no tiene las propiedades length y split como muestro en el siguiente codigo:

     

    /// Get the contents of the URL via a web request 
    let http(url: string) = 
      let req = System.Net.WebRequest.Create(url) 
      let resp = req.GetResponse() 
      let stream = resp.GetResponseStream() 
      let reader = new System.IO.StreamReader(stream) 
      let html = reader.ReadToEnd() 
      resp.Close() 
      html
    let getWords s = String.split [ ' '; '\n'; '\t'; '<'; '>'; '=' ] s 
    let getStats site = 
      let url = "http://" + site 
      let html = http url 
      let words = html |> getWords 
      let hrefs = html |> getWords |> List.filter (fun s -> s = "href") 
      (site,html.Length, words.Length, hrefs.Length)

    Gracias.......


    Adrian Wong M
    jueves, 22 de septiembre de 2011 20:27
  • Hola,

    quizás puedes usar String.Split.

    http://msdn.microsoft.com/en-us/library/b873y76a.aspx#Y0

     

    member Split : 
            separator:char[] -> string[] 

    Saludos.



    Fernando Gómez
    fermasmas.wordpress.com
    • Marcado como respuesta adri1987 viernes, 23 de septiembre de 2011 4:06
    jueves, 22 de septiembre de 2011 23:18
  • Hola,

    quizás puedes usar String.Split.

    http://msdn.microsoft.com/en-us/library/b873y76a.aspx#Y0

     

     

    member Split : 
            separator:char[] -> string[] 

    Saludos.

     



    Fernando Gómez
    fermasmas.wordpress.com

    Gracias por tu ayuda...me has ayudado mucho, pero no entiendo muy bien los cambios F# 2.0 muchas gracias ya estoy leyendo Appress de F#, Gracias por la ayuda porque para mi es un cambio  muy grande de C# a F#
    Adrian Wong M
    viernes, 23 de septiembre de 2011 4:05
  • Hola, sí, es un cambio grande, para mí también lo ha sido: tienes que pensar de forma diferente, no pensar tanto en objetos y pensar más en funciones y composición de funciones... Pero está padre, qué bueno que has tomado interés!

    Saludos!



    Fernando Gómez
    fermasmas.wordpress.com
    viernes, 23 de septiembre de 2011 16:00