Nice!

FWIW, it looks like the TABS got a bit messed up on pasting - in general don't paste directly from VS 2005, but rather from emacs or notepad and use the "F#" button on the editing toolbar. (You may have to be logged in to get access to that - I'm not sure if that's still the case)

Here's a version of the code using more standard F# formatting, including the #light syntax. I've also made a few other modifications, e.g. the use of .Add to wire up event handlers, and the use of "|> ignore". Also I'm not sure it's necessary to create a new buffer each time around the reading loops.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
 

#light

open System
open System.Collections.Generic
open System.ComponentModel
open System.Data
open System.Drawing
open System.Text
open System.Windows.Forms
open System.IO
open System.Diagnostics
open System.Threading

type MainForm = 
    class
        inherit System.Windows.Forms.Form as base
        override this.Dispose(disposing) =
            if (disposing && (match this.components with null -> false | _ -> true)) then
                this.components.Dispose();
            base.Dispose(disposing)
        member this.InitializeComponent() =
            this.tbWorkArea <- new System.Windows.Forms.TextBox();
            this.proc <- new System.Diagnostics.Process();
            this.msMain <- new System.Windows.Forms.MenuStrip();
            this.fileToolStripMenuItem <- new System.Windows.Forms.ToolStripMenuItem();
            this.saveToolStripMenuItem <- new System.Windows.Forms.ToolStripMenuItem();
            this.openToolStripMenuItem <- new System.Windows.Forms.ToolStripMenuItem();
            this.exitToolStripMenuItem <- new System.Windows.Forms.ToolStripMenuItem();
            this.workspaceToolStripMenuItem <- new System.Windows.Forms.ToolStripMenuItem();
            this.fontToolStripMenuItem <- new System.Windows.Forms.ToolStripMenuItem();
            this.textColorToolStripMenuItem <- new System.Windows.Forms.ToolStripMenuItem();
            this.backgroundColorToolStripMenuItem <- new System.Windows.Forms.ToolStripMenuItem();
            this.sfdSave <- new System.Windows.Forms.SaveFileDialog();
            this.ofdOpen <- new System.Windows.Forms.OpenFileDialog();
            this.cdColor <- new System.Windows.Forms.ColorDialog();
            this.fdFont <- new System.Windows.Forms.FontDialog();
            this.msMain.SuspendLayout();
            this.SuspendLayout();
            // 
            // tbWorkArea
            // 
            this.tbWorkArea.Dock <- System.Windows.Forms.DockStyle.Fill;
            this.tbWorkArea.Font <- new System.Drawing.Font("Courier New", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, Convert.ToByte(0));
            this.tbWorkArea.Location <- new System.Drawing.Point(0, 24);
            this.tbWorkArea.Multiline <- true;
            this.tbWorkArea.Name <- "tbWorkArea";
            this.tbWorkArea.Size <- new System.Drawing.Size(566, 377);
            this.tbWorkArea.TabIndex <- 0;
            this.tbWorkArea.WordWrap <- false;
            this.tbWorkArea.KeyUp.Add(fun e -> this.tbWorkArea_KeyUp e);
            // 
            // proc
            // 
            this.proc.StartInfo.Domain <- "";
            this.proc.StartInfo.LoadUserProfile <- false;
            this.proc.StartInfo.Password <- null;
            // this.proc.StartInfo.StandardErrorEncoding <- null;
            // this.proc.StartInfo.StandardOutputEncoding <- null;
            this.proc.StartInfo.UserName <- "";
            this.proc.SynchronizingObject <- this;
            // 
            // msMain
            // 
            // new System.Windows.Forms.ToolStripItem[]
            this.msMain.Items.AddRange([| (this.fileToolStripMenuItem :> System.Windows.Forms.ToolStripItem) ; (this.workspaceToolStripMenuItem :> System.Windows.Forms.ToolStripItem) |]);
            this.msMain.Location <- new System.Drawing.Point(0, 0);
            this.msMain.Name <- "msMain";
            this.msMain.Size <- new System.Drawing.Size(566, 24);
            this.msMain.TabIndex <- 1;
            this.msMain.Text <- "menu";
            // 
            // fileToolStripMenuItem
            // 
            // new System.Windows.Forms.ToolStripItem[]
            this.fileToolStripMenuItem.DropDownItems.AddRange([|(this.saveToolStripMenuItem:>System.Windows.Forms.ToolStripItem); (this.openToolStripMenuItem:>System.Windows.Forms.ToolStripItem); (this.exitToolStripMenuItem:>System.Windows.Forms.ToolStripItem)|]);
            this.fileToolStripMenuItem.Name <- "fileToolStripMenuItem";
            this.fileToolStripMenuItem.Size <- new System.Drawing.Size(35, 20);
            this.fileToolStripMenuItem.Text <- "&File";
            // 
            // saveToolStripMenuItem
            // 
            this.saveToolStripMenuItem.Name <- "saveToolStripMenuItem";
            this.saveToolStripMenuItem.ShortcutKeys <- unbox(box(unbox(box(System.Windows.Forms.Keys.Control)) lor unbox(box(System.Windows.Forms.Keys.S))));
            // this.saveToolStripMenuItem.ShortcutKeys <- (unbox(box(131072 lor 83)));
            this.saveToolStripMenuItem.Size <- new System.Drawing.Size(140, 22);
            this.saveToolStripMenuItem.Text <- "&Save";
            this.saveToolStripMenuItem.Click.Add(fun e -> this.saveToolStripMenuItem_Click e);
            // 
            // openToolStripMenuItem
            // 
            this.openToolStripMenuItem.Name <- "openToolStripMenuItem";
            this.openToolStripMenuItem.ShortcutKeys <- unbox(box(unbox(box(System.Windows.Forms.Keys.Control)) lor unbox(box(System.Windows.Forms.Keys.O))));
            this.openToolStripMenuItem.Size <- new System.Drawing.Size(140, 22);
            this.openToolStripMenuItem.Text <- "&Open";
            this.openToolStripMenuItem.Click.Add(fun e -> this.openToolStripMenuItem_Click e);
            // 
            // exitToolStripMenuItem
            // 
            this.exitToolStripMenuItem.Name <- "exitToolStripMenuItem";
            this.exitToolStripMenuItem.Size <- new System.Drawing.Size(140, 22);
            this.exitToolStripMenuItem.Text <- "E&xit";
            this.exitToolStripMenuItem.Click.Add(fun e -> this.exitToolStripMenuItem_Click e);
            // 
            // workspaceToolStripMenuItem
            // 
            // new System.Windows.Forms.ToolStripItem[]
            this.workspaceToolStripMenuItem.DropDownItems.AddRange
                ([| (this.fontToolStripMenuItem:>System.Windows.Forms.ToolStripItem);
                    (this.textColorToolStripMenuItem:>System.Windows.Forms.ToolStripItem);
                    (this.backgroundColorToolStripMenuItem:>System.Windows.Forms.ToolStripItem)|]);
            this.workspaceToolStripMenuItem.Name <- "workspaceToolStripMenuItem";
            this.workspaceToolStripMenuItem.Size <- new System.Drawing.Size(72, 20);
            this.workspaceToolStripMenuItem.Text <- "&Workspace";
            // 
            // fontToolStripMenuItem
            // 
            this.fontToolStripMenuItem.Name <- "fontToolStripMenuItem";
            this.fontToolStripMenuItem.Size <- new System.Drawing.Size(158, 22);
            this.fontToolStripMenuItem.Text <- "F&ont";
            this.fontToolStripMenuItem.Click.Add(fun e -> this.fontToolStripMenuItem_Click e);
            // 
            // textColorToolStripMenuItem
            // 
            this.textColorToolStripMenuItem.Name <- "textColorToolStripMenuItem";
            this.textColorToolStripMenuItem.Size <- new System.Drawing.Size(158, 22);
            this.textColorToolStripMenuItem.Text <- "&Text Color";
            this.textColorToolStripMenuItem.Click.Add(fun e -> this.textColorToolStripMenuItem_Click e);
            // 
            // backgroundColorToolStripMenuItem
            // 
            this.backgroundColorToolStripMenuItem.Name <- "backgroundColorToolStripMenuItem";
            this.backgroundColorToolStripMenuItem.Size <- new System.Drawing.Size(158, 22);
            this.backgroundColorToolStripMenuItem.Text <- "&Background Color";
            this.backgroundColorToolStripMenuItem.Click.Add(fun e -> this.backgroundColorToolStripMenuItem_Click e);
            // 
            // sfdSave
            // 
            this.sfdSave.CheckFileExists <- true;
            this.sfdSave.FileOk.Add(fun e -> this.sfdSave_FileOk e);
            // 
            // ofdOpen
            // 
            this.ofdOpen.FileName <- "openFileDialog1";
            this.ofdOpen.FileOk.Add(fun e -> this.ofdOpen_FileOk e);
            // 
            // MainForm
            // 
            this.AutoScaleDimensions <- new System.Drawing.SizeF(Convert.ToSingle(6), Convert.ToSingle(13));
            this.AutoScaleMode <- System.Windows.Forms.AutoScaleMode.Font;
            this.ClientSize <- new System.Drawing.Size(566, 401);
            this.Controls.Add(this.tbWorkArea);
            this.Controls.Add(this.msMain);
            this.MainMenuStrip <- this.msMain;
            this.Name <- "MainForm";
            this.Text <- "MainForm";
            this.FormClosing.Add(fun e -> this.MainForm_FormClosing e);
            this.msMain.ResumeLayout(false);
            this.msMain.PerformLayout();
            this.ResumeLayout(false);
            this.PerformLayout();
        val mutable tbWorkArea : System.Windows.Forms.TextBox;
        val mutable proc : System.Diagnostics.Process;
        val mutable msMain : System.Windows.Forms.MenuStrip;
        val mutable fileToolStripMenuItem : System.Windows.Forms.ToolStripMenuItem;
        val mutable saveToolStripMenuItem : System.Windows.Forms.ToolStripMenuItem;
        val mutable exitToolStripMenuItem : System.Windows.Forms.ToolStripMenuItem;
        val mutable openToolStripMenuItem : System.Windows.Forms.ToolStripMenuItem;
        val mutable sfdSave : System.Windows.Forms.SaveFileDialog;
        val mutable ofdOpen : System.Windows.Forms.OpenFileDialog;
        val mutable workspaceToolStripMenuItem : System.Windows.Forms.ToolStripMenuItem;
        val mutable textColorToolStripMenuItem : System.Windows.Forms.ToolStripMenuItem;
        val mutable backgroundColorToolStripMenuItem : System.Windows.Forms.ToolStripMenuItem;
        val mutable cdColor : System.Windows.Forms.ColorDialog;
        val mutable fontToolStripMenuItem : System.Windows.Forms.ToolStripMenuItem;
        val mutable fdFont :  System.Windows.Forms.FontDialog;
        val mutable bookmark : System.Int32;
        val mutable components: System.ComponentModel.Container;
        val mutable writer : System.Threading.Thread;
        val mutable reader : System.Threading.Thread;
        val mutable err_reader : System.Threading.Thread;
        val mutable stop : System.Threading.ManualResetEvent;
        member this.tbWorkArea_KeyUp (e : KeyEventArgs) =
            if (e.KeyData = Keys.Enter) then 
                let mutable toWrite = "" 
                
                if (this.bookmark < this.tbWorkArea.Text.Length) then
                        toWrite <- this.tbWorkArea.Text.Substring(this.bookmark);
                                        this.proc.StandardInput.Write(toWrite);
                            if (this.bookmark >= this.tbWorkArea.Text.Length) then
                                    this.bookmark <- this.tbWorkArea.Text.Length;
        member this.saveToolStripMenuItem_Click (e:EventArgs) =
            this.sfdSave.ShowDialog() |> ignore
        member this.openToolStripMenuItem_Click (e:EventArgs) =
            this.ofdOpen.ShowDialog() |> ignore
        member this.exitToolStripMenuItem_Click (e:EventArgs) =
            this.Close()
        member this.fontToolStripMenuItem_Click (e:EventArgs) =
            if (this.fdFont.ShowDialog() = DialogResult.OK) then this.tbWorkArea.Font <- this.fdFont.Font
        member this.textColorToolStripMenuItem_Click (e:EventArgs) =
            if (this.cdColor.ShowDialog() = DialogResult.OK) then this.tbWorkArea.ForeColor <- this.cdColor.Color
        member this.backgroundColorToolStripMenuItem_Click (e:EventArgs) =
            if (this.cdColor.ShowDialog() = DialogResult.OK) then this.tbWorkArea.BackColor <- this.cdColor.Color
        member this.sfdSave_FileOk (e:CancelEventArgs) =
            let sw = new StreamWriter(this.sfdSave.FileName)
            sw.Write(this.tbWorkArea.Text);
            sw.Close();
            sw.Dispose()
        member this.ofdOpen_FileOk (e:CancelEventArgs) =
            let sr = new StreamReader(this.ofdOpen.FileName)
            let cod = sr.ReadToEnd()
            sr.Close();
            this.tbWorkArea.AppendText(cod)
        member this.MainForm_FormClosing (e:FormClosingEventArgs) =
            this.DoOnExit()
        member this.DoOnStart() =
            let psi = new ProcessStartInfo()
            this.tbWorkArea.ForeColor <- Color.FromArgb(255, 0, 0, 160);
            this.tbWorkArea.BackColor <- Color.FromArgb(255, 192, 192, 192);
            psi.FileName <- "ocaml";
            psi.CreateNoWindow <- true;
            psi.RedirectStandardError <- true; //This was the cause that some responses could not be seen.
            psi.RedirectStandardInput <- true;
            psi.RedirectStandardOutput <- true;
            psi.UseShellExecute <- false;
            this.proc.StartInfo <- psi;
            this.proc.Start(); |> ignore;
            this.stop <- new ManualResetEvent(false);
            this.reader <- new Thread(new ThreadStart(fun x -> this.readerMtd()));
            this.writer <- new Thread(new ThreadStart(fun x -> this.writerMtd()));
            this.err_reader <- new Thread(new ThreadStart(fun x -> this.err_readerMtd()));
            this.reader.Start();
            this.writer.Start();
            this.err_reader.Start()
        member this.readerMtd() =
            let MAX_BUF = 4096
            let lbuffer = Array.create MAX_BUF '0' //char[]
            let mutable bread = 0
            while not (this.stop.WaitOne(1, true)) do
                try
                    bread <- this.proc.StandardOutput.Read(lbuffer, 0, MAX_BUF);
                    while (bread > 0) do
                        this.AppendText(new string(lbuffer, 0, bread));
                        bread <- this.proc.StandardOutput.Read(lbuffer, 0, MAX_BUF);
                    done;
                with
                | :?NullReferenceException -> ();
                | _ -> ();
            done;
        member this.err_readerMtd() =
            let MAX_BUF = 4096
            let lbuffer = Array.create MAX_BUF '0'
            let mutable bread = 0
            while not (this.stop.WaitOne(1, true)) do
                try
                    bread <- this.proc.StandardError.Read(lbuffer, 0, MAX_BUF);
                    while (bread > 0) do
                        this.AppendText(new string(lbuffer, 0, bread));
                        bread <- this.proc.StandardError.Read(lbuffer, 0, MAX_BUF);
                    done;
                with
                | :? NullReferenceException -> ();
                | _ -> ();
            done;
        member this.writerMtd() = ()
        new () as this = 
                { tbWorkArea = null;
                  proc = null;
                  msMain = null;
                  fileToolStripMenuItem = null;
                  saveToolStripMenuItem = null;
                  exitToolStripMenuItem = null;
                  openToolStripMenuItem = null;
                  sfdSave = null;
                  ofdOpen = null;
                  workspaceToolStripMenuItem = null;
                  textColorToolStripMenuItem = null;
                  backgroundColorToolStripMenuItem = null;
                  cdColor = null;
                  fontToolStripMenuItem = null;
                  fdFont = null;
                  bookmark = 0;
                  components = null;
                  writer = null;
                  reader = null;
                  err_reader = null;
                  stop = null;}
            then
                this.InitializeComponent();
                this.sfdSave.Filter <- "ML files (*.ml)|*.ml|MLI files (*.mli)|*.mli|All Files (*.*)|*.*";
                this.ofdOpen.Filter <- "ML files (*.ml)|*.ml|MLI files (*.mli)|*.mli|All Files (*.*)|*.*";
                this.DoOnStart();
        member this.AppendText(text) = 
            let fd = new Converter<_,_>(fun latext -> this.AppendText(latext))
            if (this.tbWorkArea.InvokeRequired) then 
                this.Invoke(fd, [|box(text)|]) |> ignore
            else 
                this.tbWorkArea.AppendText(text)
            this.bookmark <- this.tbWorkArea.Text.Length;
        member this.DoOnExit() = 
            this.stop.Set() |> ignore
            try
                    this.proc.StandardError.Close();
            with
                    | _ -> ();
            try
                    this.proc.StandardInput.Close();
            with
                    | _ -> ();
            try
                    this.proc.StandardOutput.Close();
            with
                    | _ -> ();
            try
                    if not (this.proc.WaitForExit(200)) then
                            this.proc.Kill();
                    this.proc.Close();
            with
                    | _ -> ();
            try
                    if not (this.reader.Join(200)) then 
                            this.reader.Abort();
            with
                    | _ -> ();
            try
                    if not (this.err_reader.Join(200)) then
                            this.err_reader.Abort();
            with
                    | _ -> ();
            try
                    if not (this.writer.Join(200)) then
                            this.writer.Abort();
            with
                    | _ -> ();
    end

[<STAThread>]
let main() = 
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);
        Thread.Sleep(400);
        Application.Run(new MainForm());

[<STAThread>]
do main()

By on 10/9/2006 3:16 AM ()

Thank you for a very educational, great sample. I've taken the liberty to revamp it a little. Specifically, I changed the following:

  1. Fixed the clean-up code in DoOnExit: the exception patterns bind more tightly than sequencing, so unless an exception is thrown, latter code doesn't get executed. I've used a higher-order function, swallow, with a form reminiscent of ignore.
  2. Added detection of process exiting to close the form.
  3. Abstracted the reading code for stdin and stdout into a common, ThreadStart-returning method.
  4. Used Enum.Combine to simplify adding accelerator keys to menu items.
  5. Used Idioms.using around some IDisposable acquisitions.
  6. Re-formatted the code a little to make it a bit more idiomatic F#/ML.

I've found the code instructive, and I wanted to share what I've learned. Thank you.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
open System
open System.Collections.Generic
open System.ComponentModel
open System.Data
open System.Drawing
open System.Text
open System.Windows.Forms
open System.IO
open System.Diagnostics
open System.Threading

let ml_pattern_filter = "ML files (*.ml)|*.ml|MLI files (*.mli)|*.mli|All Files (*.*)|*.*"
let swallow (thunk : unit -> unit) =
    try thunk () with _ -> ()
type MainForm =
    class
        inherit System.Windows.Forms.Form as base
 
        val mutable tbWorkArea : System.Windows.Forms.TextBox
        val mutable proc : System.Diagnostics.Process
        val mutable msMain : System.Windows.Forms.MenuStrip
        val mutable miFile : System.Windows.Forms.ToolStripMenuItem
        val mutable miSave : System.Windows.Forms.ToolStripMenuItem
        val mutable miOpen : System.Windows.Forms.ToolStripMenuItem
        val mutable miExit : System.Windows.Forms.ToolStripMenuItem
        val mutable miWorkspace : System.Windows.Forms.ToolStripMenuItem
        val mutable miFont : System.Windows.Forms.ToolStripMenuItem
        val mutable miTextColor : System.Windows.Forms.ToolStripMenuItem
        val mutable miBackColor : System.Windows.Forms.ToolStripMenuItem
        val mutable sfdSave : System.Windows.Forms.SaveFileDialog
        val mutable ofdOpen : System.Windows.Forms.OpenFileDialog
        val mutable cdColor : System.Windows.Forms.ColorDialog
        val mutable fdFont :  System.Windows.Forms.FontDialog
        
        val mutable bookmark : System.Int32
        val mutable stdoutReader : System.Threading.Thread
        val mutable stderrReader : System.Threading.Thread
        val mutable stopSignal : System.Threading.ManualResetEvent
        
        val mutable components: System.ComponentModel.Container 
          new () as this =
                { tbWorkArea = null;
                  proc = null;
                  msMain = null;
                  miFile = null;
                  miSave = null;
                  miExit = null;
                  miOpen = null;
                  sfdSave = null;
                  ofdOpen = null;
                  miWorkspace = null;
                  miTextColor = null;
                  miBackColor = null;
                  cdColor = null;
                  miFont = null;
                  fdFont = null;
                  bookmark = 0;
                  components = null;
                  stdoutReader = null;
                  stderrReader = null;
                  stopSignal = null; }
            then
                this.InitializeComponent ();
                this.DoOnStart ()
        
        override this.Dispose disposing =
            if disposing && this.components <> null then
                this.components.Dispose ();
            base.Dispose disposing
        
        member this.InitializeComponent () =
            this.tbWorkArea <- new System.Windows.Forms.TextBox ();
            this.proc <- new System.Diagnostics.Process ();
            this.msMain <- new System.Windows.Forms.MenuStrip ();
            this.miFile <- new System.Windows.Forms.ToolStripMenuItem ();
            this.miSave <- new System.Windows.Forms.ToolStripMenuItem ();
            this.miOpen <- new System.Windows.Forms.ToolStripMenuItem ();
            this.miExit <- new System.Windows.Forms.ToolStripMenuItem ();
            this.miWorkspace <- new System.Windows.Forms.ToolStripMenuItem ();
            this.miFont <- new System.Windows.Forms.ToolStripMenuItem ();
            this.miTextColor <- new System.Windows.Forms.ToolStripMenuItem ();
            this.miBackColor <- new System.Windows.Forms.ToolStripMenuItem ();
            this.sfdSave <- new System.Windows.Forms.SaveFileDialog ();
            this.ofdOpen <- new System.Windows.Forms.OpenFileDialog ();
            this.cdColor <- new System.Windows.Forms.ColorDialog ();
            this.fdFont <- new System.Windows.Forms.FontDialog ();
            this.msMain.SuspendLayout ();
            this.SuspendLayout ();
            //
            // tbWorkArea
            //
            this.tbWorkArea.Dock <- System.Windows.Forms.DockStyle.Fill;
            this.tbWorkArea.Font <- new System.Drawing.Font ("Courier New", 8.F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, Convert.ToByte 0);
            this.tbWorkArea.Location <- new System.Drawing.Point (0, 24);
            this.tbWorkArea.Multiline <- true;
            this.tbWorkArea.ScrollBars <- System.Windows.Forms.ScrollBars.Vertical;
            this.tbWorkArea.Name <- "tbWorkArea";
            this.tbWorkArea.Size <- new System.Drawing.Size (566, 377);
            this.tbWorkArea.ForeColor <- Color.FromArgb (255, 0, 0, 0);
            this.tbWorkArea.BackColor <- Color.FromArgb (255, 255, 255, 255);
            this.tbWorkArea.TabIndex <- 0;
            this.tbWorkArea.WordWrap <- false;
            this.tbWorkArea.KeyUp.Add (fun e -> this.tbWorkArea_KeyUp e);
            //
            // proc
            //
            this.proc.StartInfo.UseShellExecute <- false;
            this.proc.StartInfo.CreateNoWindow <- true;
            this.proc.StartInfo.RedirectStandardInput <- true;
            this.proc.StartInfo.RedirectStandardOutput <- true;
            this.proc.StartInfo.RedirectStandardError <- true;
            this.proc.StartInfo.Domain <- "";
            this.proc.StartInfo.LoadUserProfile <- false;
            this.proc.StartInfo.UserName <- "";
            this.proc.StartInfo.Password <- null;
            this.proc.SynchronizingObject <- this;
            //
            // msMain
            //
            this.msMain.Items.AddRange [|
                (this.miFile :> System.Windows.Forms.ToolStripItem);
                (this.miWorkspace :> System.Windows.Forms.ToolStripItem);
            |];
            this.msMain.Location <- new System.Drawing.Point (0, 0);
            this.msMain.Name <- "msMain";
            this.msMain.Size <- new System.Drawing.Size (566, 24);
            this.msMain.TabIndex <- 1;
            this.msMain.Text <- "menu";
            //
            // miFile
            //
            this.miFile.DropDownItems.AddRange [|
                (this.miSave :> System.Windows.Forms.ToolStripItem);
                (this.miOpen :> System.Windows.Forms.ToolStripItem);
                (this.miExit :> System.Windows.Forms.ToolStripItem)
            |];
            this.miFile.Name <- "miFile";
            this.miFile.Size <- new System.Drawing.Size (35, 20);
            this.miFile.Text <- "&File";
            //
            // miSave
            //
            this.miSave.Name <- "miSave";
            this.miSave.ShortcutKeys <- Enum.combine [System.Windows.Forms.Keys.Control; System.Windows.Forms.Keys.S];
            this.miSave.Size <- new System.Drawing.Size (140, 22);
            this.miSave.Text <- "&Save";
            this.miSave.Click.Add (fun e -> this.miSave_Click e);
            //
            // miOpen
            //
            this.miOpen.Name <- "miOpen";
            this.miOpen.ShortcutKeys <- Enum.combine [System.Windows.Forms.Keys.Control; System.Windows.Forms.Keys.O];
            this.miOpen.Size <- new System.Drawing.Size (140, 22);
            this.miOpen.Text <- "&Open";
            this.miOpen.Click.Add (fun e -> this.miOpen_Click e);
            //
            // miExit
            //
            this.miExit.Name <- "miExit";
            this.miExit.Size <- new System.Drawing.Size (140, 22);
            this.miExit.Text <- "E&xit";
            this.miExit.Click.Add (fun e -> this.miExit_Click e);
            //
            // miWorkspace
            //
            this.miWorkspace.DropDownItems.AddRange [|
                (this.miFont :> System.Windows.Forms.ToolStripItem);
                (this.miTextColor :> System.Windows.Forms.ToolStripItem);
                (this.miBackColor :> System.Windows.Forms.ToolStripItem);
            |];
            this.miWorkspace.Name <- "miWorkspace";
            this.miWorkspace.Size <- new System.Drawing.Size (72, 20);
            this.miWorkspace.Text <- "&Workspace";
            //
            // miFont
            //
            this.miFont.Name <- "miFont";
            this.miFont.Size <- new System.Drawing.Size (158, 22);
            this.miFont.Text <- "F&ont";
            this.miFont.Click.Add (fun e -> this.miFont_Click e);
            //
            // miTextColor
            //
            this.miTextColor.Name <- "miTextColor";
            this.miTextColor.Size <- new System.Drawing.Size (158, 22);
            this.miTextColor.Text <- "&Text Color";
            this.miTextColor.Click.Add (fun e -> this.miTextColor_Click e);
            //
            // miBackColor
            //
            this.miBackColor.Name <- "miBackColor";
            this.miBackColor.Size <- new System.Drawing.Size (158, 22);
            this.miBackColor.Text <- "&Background Color";
            this.miBackColor.Click.Add (fun e -> this.miBackColor_Click e);
            //
            // sfdSave
            //
            this.sfdSave.Filter <- ml_pattern_filter;
            this.sfdSave.CheckFileExists <- true;
            this.sfdSave.FileOk.Add (fun e -> this.sfdSave_FileOk e);
            //
            // ofdOpen
            //
//            this.ofdOpen.FileName <- "openFileDialog1";
            this.ofdOpen.Filter <- ml_pattern_filter;
            this.ofdOpen.FileOk.Add (fun e -> this.ofdOpen_FileOk e);
            //
            // MainForm
            //
            this.AutoScaleDimensions <- new System.Drawing.SizeF (Convert.ToSingle 6, Convert.ToSingle 13);
            this.AutoScaleMode <- System.Windows.Forms.AutoScaleMode.Font;
            this.ClientSize <- new System.Drawing.Size (566, 401);
            this.Controls.Add this.tbWorkArea;
            this.Controls.Add this.msMain;
            this.MainMenuStrip <- this.msMain;
            this.Name <- "MainForm";
            this.Text <- "OCaml";
            this.FormClosing.Add (fun e -> this.MainForm_FormClosing e);
            this.msMain.ResumeLayout false;
            this.msMain.PerformLayout ();
            this.ResumeLayout false;
            this.PerformLayout ()
	member this.miOpen_Click (e:EventArgs) =
            this.ofdOpen.ShowDialog () |> ignore
	member this.miSave_Click (e : EventArgs) =
            this.sfdSave.ShowDialog () |> ignore
	member this.miExit_Click (e:EventArgs) =
            this.Close ()
	member this.miFont_Click (e:EventArgs) =
            if this.fdFont.ShowDialog () = DialogResult.OK then
                this.tbWorkArea.Font <- this.fdFont.Font
	member this.miTextColor_Click (e:EventArgs) =
            if this.cdColor.ShowDialog () = DialogResult.OK then
                this.tbWorkArea.ForeColor <- this.cdColor.Color
	member this.miBackColor_Click (e:EventArgs) =
            if this.cdColor.ShowDialog () = DialogResult.OK then
                this.tbWorkArea.BackColor <- this.cdColor.Color
	member this.ofdOpen_FileOk (e:CancelEventArgs) =
            using (new StreamReader (this.ofdOpen.FileName)) (fun sr ->
                let cod = sr.ReadToEnd () in
                sr.Close ();
                this.tbWorkArea.AppendText cod)
	member this.sfdSave_FileOk (e:CancelEventArgs) =
            using (new StreamWriter (this.sfdSave.FileName)) (fun sw ->
                sw.Write this.tbWorkArea.Text;
                sw.Close ())
	member this.MainForm_FormClosing (e:FormClosingEventArgs) =
            this.DoOnClose ()
        
        member this.tbWorkArea_KeyUp (e : KeyEventArgs) =
            if e.KeyData = Keys.Enter then begin
                let text =
                    if this.bookmark >= this.tbWorkArea.Text.Length then begin
                        this.bookmark <- this.tbWorkArea.Text.Length;
                        ""
                    end else if this.tbWorkArea.SelectionLength > 0 then begin
                        this.bookmark <- this.tbWorkArea.Text.Length;
                        this.tbWorkArea.SelectedText
                    end else this.tbWorkArea.Text.Substring this.bookmark
                in this.proc.StandardInput.Write text
            end
        member this.Process_Exited (e : EventArgs) =
            this.Close ()
        
        member this.DoOnStart () =
            this.proc.StartInfo.FileName <- "ocaml";
            this.proc.StartInfo.Arguments <- "";
            this.proc.Exited.Add (fun e -> this.Process_Exited e);
            this.proc.EnableRaisingEvents <- true;
            this.proc.Start () |> ignore;
            this.stopSignal <- new ManualResetEvent false;
            this.stdoutReader <- new Thread (this.DoReadFrom this.proc.StandardOutput);
            this.stderrReader <- new Thread (this.DoReadFrom this.proc.StandardError);
            this.stdoutReader.Start ();
            this.stderrReader.Start ()
        
        member this.DoOnClose () =
            this.stopSignal.Set () |> ignore;
            (fun () -> this.proc.StandardError.Close ()) |> swallow;
            (fun () -> this.proc.StandardInput.Close ()) |> swallow;
            (fun () -> this.proc.StandardOutput.Close ()) |> swallow;
            (fun () ->
                if not (this.proc.WaitForExit 200) then
                    this.proc.Kill ();
                this.proc.Close ()) |> swallow;
            (fun () ->
                if not (this.stdoutReader.Join 100) then
                    this.stdoutReader.Abort ()) |> swallow;
            (fun () ->
                if not (this.stderrReader.Join 100) then
                    this.stderrReader.Abort ()) |> swallow;
	member this.DoReadFrom (reader : System.IO.StreamReader) : ThreadStart =
            let MAX_BUF = 4096 in
            new ThreadStart (fun () ->
                let lbuffer = Array.zero_create MAX_BUF in
                let mutable bread = 0 in
                try while true do
                    bread <- reader.Read (lbuffer, 0, MAX_BUF);
                    while bread > 0 do
                        this.AppendText (new string (lbuffer, 0, bread));
                        bread <- reader.Read (lbuffer, 0, MAX_BUF)
                    done;
                    if this.stopSignal.WaitOne (10, true) then raise Exit
                done with _ -> ())
	member this.AppendText text =
            if this.tbWorkArea.InvokeRequired then
                let del = new Converter<_,_> (fun t -> this.AppendText t) in
                this.Invoke (del, [| box text |]) |> ignore
            else begin
                this.tbWorkArea.AppendText text;
                this.bookmark <- this.tbWorkArea.Text.Length
            end
    end

[<STAThread>]
let main () =
    Application.EnableVisualStyles ();
    Application.SetCompatibleTextRenderingDefault false;
    Thread.Sleep 400;
    Application.Run (new MainForm ())

[<STAThread>]
do main ()
By on 12/28/2006 8:08 AM ()

Thankyou very much!

By on 12/30/2006 4:49 AM ()
IntelliFactory Offices Copyright (c) 2011-2012 IntelliFactory. All rights reserved.
Home | Products | Consulting | Trainings | Blogs | Jobs | Contact Us | Terms of Use | Privacy Policy | Cookie Policy
Built with WebSharper