2012-10-30 8 views
6

Ich arbeite mich gerade durch "Real World Functional Programming". Ich versuche, Beispiel 1.12 zum Arbeiten zu bringen, ein "Hallo Welt" -Programm mit Windows-Formularen. Dies ist der Code: - „eine zweite Nachrichtenschleife auf einem einzigen Thread zu starten ist keine gültige Operation“ -Objektorientierte "Hallo Welt" mit Windows Forms in F #

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();; 

Leider ist dies ein Fehler wirft Offensichtlich gibt es ein Fenster, das sich öffnet und nicht endet, und das verwirrte das Programm. Ich kann nicht sehen, wie ich den Fehler beheben kann, kann mir jemand helfen?

Ich habe auch den letzten Codeblock als Eingabe versucht: -

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

Aber das hilft nicht. Der Code wird ordnungsgemäß ausgeführt, führt jedoch zu keinem Ergebnis, da die letzte Zeile auskommentiert ist.

+2

Ich vermute, dass die Linien von 'lassen hello' ohne Einzug werden müssen - obwohl das nur das Kopieren sein kann –

+0

Ja . Du hast Recht, redigieren. –

+0

Dies ist nicht Ihr Problem lösen, aber Sie müssen nicht verwenden ;; überall –

Antwort

6

Das Beispiel sollte kompiliert und als Windows Form-Anwendung ausgeführt werden. Wenn Sie es in F # Interactive ausführen möchten, müssen Sie frm.Show() statt Application.Run(frm) verwenden.

Sie könnten das Beispiel sowohl in F # Interactive funktioniert und in kompilierten Projekte mit 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

Ok, das klappt jetzt. Danke, ich habe etwas sehr nützliches aus der Lösung gelernt. –

+0

Aus Interesse was bedeutet die #? Ist das ein Tag, um anzuzeigen, ob es in einem anderen Modus aufgerufen wird? Es ist ein bisschen schwierig, diesen Operator in Bezug auf F # zu googlen !! :) –

+1

Bitte folgen Sie dem Link in meiner Antwort als Referenz. '# if',' # else' und '# endif' sind Präprozessoren, die dem F # -Compiler helfen, den Code bedingt zu kompilieren. – pad