スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

F#雑記 SimpleFormConverter(1)

 F#でウィンドウフォームプログラムを作っていて、ストレスがかかるのが、C#のようなフォームデザイナがないことです。C#のフォームデザイナが自動生成するコードをF#のコードに変換するソフトにはNobuhisaさんの作られた、F#-GUI Converterがあります。いまさら私が作ることもないのですが、少し仕様を変えて、性能をダウングレードしたものを作成していってみたいと思います。 
基本的方針は次の通りです。 
 
(1)「フォームを継承し、その要素として内部のコンポーネントを登録する」形式ではなく、フォームもコンポーネントも平等に扱う。 
(2)できるだけF#ぽいコードを吐き出すようにする 
(3)レイアウトの遅延はしない。 
(4)イベントハンドラには対応しない。 
(5)対応できないコンポーネントはとりあえず気にしないことにする。 
 
どうでしょうか、ないないずくしのとても安易な仕様ですが、Ver0.01ということで勘弁していただいて、とりあえず開発してみたいと思います。(出来上がりも180行程度の小さなものです。) 
 
これだけではイメージがわかないと思いますので、変換後のコード例を載せておきます。 
 
let f2c x = x :> System.Windows.Forms.Control  
let load_btn= new Button(Location = new Point(21, 12),Name = "load_btn",Size = new Size(75, 23),TabIndex = 0,Text = "Load",UseVisualStyleBackColor = true) 
let ori_source_rtb= new RichTextBox(Location = new Point(21, 41),Name = "ori_source_rtb",Size = new Size(819, 178),TabIndex = 1,Text = "") 
let conv_btn= new Button(Location = new Point(21, 225),Name = "conv_btn",Size = new Size(144, 54),TabIndex = 2,Text = "Convert",UseVisualStyleBackColor = true) 
let result_rtb= new RichTextBox(Location = new Point(21, 285),Name = "result_rtb",Size = new Size(819, 254),TabIndex = 4,Text = "") 
let to_clip_btn= new Button(Location = new Point(744, 225),Name = "to_clip_btn",Size = new Size(96, 54),TabIndex = 3,Text = "To Clipborad",UseVisualStyleBackColor = true) 
let error_rtb= new RichTextBox(Location = new Point(173, 241),Name = "error_rtb",Size = new Size(553, 38),TabIndex = 5,TabStop = false,Text = "") 
let label1= new Label(AutoSize = true,Location = new Point(171, 222),Name = "label1",Size = new Size(30, 12),TabIndex = 6,Text = "Error") 
let mainForm= new Form(AutoScaleDimensions = new SizeF(6.0f, 12.0f),AutoScaleMode = AutoScaleMode.Font,ClientSize = new Size(864, 570),Name = "minForm",Text = "SimpleFormConverter Ver0.01") 
[ f2c label1; f2c error_rtb; f2c to_clip_btn; f2c result_rtb; f2c conv_btn; f2c ori_source_rtb; f2c load_btn] |> List.iter(fun cnt -> mainForm.Controls.Add cnt) 
 
では始めてみます。 
まずvisual studioでプロジェクト新規作成で、F#アプリケーションを選び、名前をSimpleFormConverterとしてプロジェクトを作成します。 
 
ソリューションエクスプローラーの参照設定で参照の追加を選びSystem.Windows.Formsとopen System.Drawingを参照に付け加えた上でコードの先頭で次のようにしてておきます。 
 
open System 
open System.Text.RegularExpressions 
open System.Windows.Forms 
open System.Drawing 
 
//広域変数///////////////////////// 
let mutable oriText = "" 
let mutable formFlattenText = "" 
 
上の広域変数ですが、最終的にはなくなる予定です。 
次に上の変換されたコードをコピペします。 
 
そして、一番最後の行で 
mainForm.Show() 
としておいて、全行をF# Interactiveに送ると、次のようなフォームが表示されるはずです。 
 

SimpleFormConverter-1.jpg
 
さて、まずはファイルのロード部分を実装します。 
このボタン名はload_btnですから、イベントハンドラを追加します。 
 
load_btn.Click.Add 
    (fun _ -> try 
                let ofd = new OpenFileDialog(Filter = "Designer.csファイル(*.Designer.cs)|*.Designer.cs|すべてのファイル(*.*)|*.*") 
                if(ofd.ShowDialog() = DialogResult.OK) then 
                    use sr = new System.IO.StreamReader(ofd.FileName) 
                    ori_source_rtb.Text <- sr.ReadToEnd() 
                    oriText <- ori_source_rtb.Text 
              with 
                | ex ->  error_rtb.Text <- ex.Message  
    ) 
 
さて準備として「、C#のプロジェクトでフォームに簡単なコンポーネントを乗っけたもの」を用意してsaveしておいてください。 
 
この状態で全行をF# Interactiveに送ると、フォームが表示されるので、loadボタンを押して先ほど準備したDesigner.csファイルを読み込んでください。すると上のリッチテキストボックスにソースが表示されます。これが変換前のファイルとなります。 
さて上のコードのoriText <- ori_source_rtb.Textの部分から、この内容はoriTextで参照できるはずです。 
F#Interactiveで試してみます。(注意)行番号はあとから付け加えたものです。 
 
> oriText;; 
val it : string = 
/*  0*/namespace FormSample 
/*  1*/{ 
/*  2*/    partial class mainForm 
/*  3*/    { 
/*  4*/        /// <summary> 
/*  5*/        /// 必要なデザイナー変数です。 
/*  6*/        /// </summary> 
/*  7*/        private System.ComponentModel.IContainer components = null; 
/*  8*/ 
/*  9*/        /// <summary> 
/* 10*/        /// 使用中のリソースをすべてクリーンアップします。 
/* 11*/        /// </summary> 
/* 12*/        /// <param name="disposing">マネージ リソースが破棄される場合 true、破棄されない場合は false です。</param> 
/* 13*/        protected override void Dispose(bool disposing) 
/* 14*/        { 
/* 15*/            if (disposing && (components != null)) 
/* 16*/            { 
/* 17*/                components.Dispose(); 
/* 18*/            } 
/* 19*/            base.Dispose(disposing); 
/* 20*/        } 
/* 21*/ 
/* 22*/        #region Windows フォーム デザイナーで生成されたコード 
/* 23*/ 
/* 24*/        /// <summary> 
/* 25*/        /// デザイナー サポートに必要なメソッドです。このメソッドの内容を 
/* 26*/        /// コード エディターで変更しないでください。 
/* 27*/        /// </summary> 
/* 28*/        private void InitializeComponent() 
/* 29*/        { 
/* 30*/            this.load_btn = new System.Windows.Forms.Button(); 
/* 31*/            this.ori_source_rtb = new System.Windows.Forms.RichTextBox(); 
/* 32*/            this.conv_btn = new System.Windows.Forms.Button(); 
/* 33*/            this.result_rtb = new System.Windows.Forms.RichTextBox(); 
/* 34*/            this.to_clip_btn = new System.Windows.Forms.Button(); 
/* 35*/            this.error_rtb = new System.Windows.Forms.RichTextBox(); 
/* 36*/            this.label1 = new System.Windows.Forms.Label(); 
/* 37*/            this.SuspendLayout(); 
/* 38*/            //  
/* 39*/            // load_btn 
/* 40*/            //  
/* 41*/            this.load_btn.Location = new System.Drawing.Point(21, 12); 
/* 42*/            this.load_btn.Name = "load_btn"; 
/* 43*/            this.load_btn.Size = new System.Drawing.Size(75, 23); 
/* 44*/            this.load_btn.TabIndex = 0; 
/* 45*/            this.load_btn.Text = "Load"; 
/* 46*/            this.load_btn.UseVisualStyleBackColor = true; 
/* 47*/            //  
/* 48*/            // ori_source_rtb 
/* 49*/            //  
/* 50*/            this.ori_source_rtb.Location = new System.Drawing.Point(21, 41); 
/* 51*/            this.ori_source_rtb.Name = "ori_source_rtb"; 
/* 52*/            this.ori_source_rtb.Size = new System.Drawing.Size(819, 178); 
/* 53*/            this.ori_source_rtb.TabIndex = 1; 
/* 54*/            this.ori_source_rtb.Text = ""; 
/* 55*/            //  
/* 56*/            // conv_btn 
/* 57*/            //  
/* 58*/            this.conv_btn.Location = new System.Drawing.Point(21, 225); 
/* 59*/            this.conv_btn.Name = "conv_btn"; 
/* 60*/            this.conv_btn.Size = new System.Drawing.Size(144, 54); 
/* 61*/            this.conv_btn.TabIndex = 2; 
/* 62*/            this.conv_btn.Text = "Convert"; 
/* 63*/            this.conv_btn.UseVisualStyleBackColor = true; 
/* 64*/            //  
/* 65*/            // result_rtb 
/* 66*/            //  
/* 67*/            this.result_rtb.Location = new System.Drawing.Point(21, 285); 
/* 68*/            this.result_rtb.Name = "result_rtb"; 
/* 69*/            this.result_rtb.Size = new System.Drawing.Size(819, 254); 
/* 70*/            this.result_rtb.TabIndex = 4; 
/* 71*/            this.result_rtb.Text = ""; 
/* 72*/            //  
/* 73*/            // to_clip_btn 
/* 74*/            //  
/* 75*/            this.to_clip_btn.Location = new System.Drawing.Point(744, 225); 
/* 76*/            this.to_clip_btn.Name = "to_clip_btn"; 
/* 77*/            this.to_clip_btn.Size = new System.Drawing.Size(96, 54); 
/* 78*/            this.to_clip_btn.TabIndex = 3; 
/* 79*/            this.to_clip_btn.Text = "To Clipborad"; 
/* 80*/            this.to_clip_btn.UseVisualStyleBackColor = true; 
/* 81*/            //  
/* 82*/            // error_rtb 
/* 83*/            //  
/* 84*/            this.error_rtb.Location = new System.Drawing.Point(173, 241); 
/* 85*/            this.error_rtb.Name = "error_rtb"; 
/* 86*/            this.error_rtb.Size = new System.Drawing.Size(553, 38); 
/* 87*/            this.error_rtb.TabIndex = 5; 
/* 88*/            this.error_rtb.TabStop = false; 
/* 89*/            this.error_rtb.Text = ""; 
/* 90*/            //  
/* 91*/            // label1 
/* 92*/            //  
/* 93*/            this.label1.AutoSize = true; 
/* 94*/            this.label1.Location = new System.Drawing.Point(171, 222); 
/* 95*/            this.label1.Name = "label1"; 
/* 96*/            this.label1.Size = new System.Drawing.Size(30, 12); 
/* 97*/            this.label1.TabIndex = 6; 
/* 98*/            this.label1.Text = "Error"; 
/* 99*/            //  
/*100*/            // mainForm 
/*101*/            //  
/*102*/            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F); 
/*103*/            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; 
/*104*/            this.ClientSize = new System.Drawing.Size(864, 570); 
/*105*/            this.Controls.Add(this.label1); 
/*106*/            this.Controls.Add(this.error_rtb); 
/*107*/            this.Controls.Add(this.to_clip_btn); 
/*108*/            this.Controls.Add(this.result_rtb); 
/*109*/            this.Controls.Add(this.conv_btn); 
/*110*/            this.Controls.Add(this.ori_source_rtb); 
/*111*/            this.Controls.Add(this.load_btn); 
/*112*/            this.Name = "mainForm"; 
/*113*/            this.Text = "SimpleFormConverter Ver0.01"; 
/*114*/            this.ResumeLayout(false); 
/*115*/            this.PerformLayout(); 
/*116*/ 
/*117*/        } 
/*118*/ 
/*119*/        #endregion 
/*120*/ 
/*121*/        private System.Windows.Forms.Button load_btn; 
/*122*/        private System.Windows.Forms.RichTextBox ori_source_rtb; 
/*123*/        private System.Windows.Forms.Button conv_btn; 
/*124*/        private System.Windows.Forms.RichTextBox result_rtb; 
/*125*/        private System.Windows.Forms.Button to_clip_btn; 
/*126*/        private System.Windows.Forms.RichTextBox error_rtb; 
/*127*/        private System.Windows.Forms.Label label1; 
/*128*/ 
/*129*/    } 
/*130*/} 
/*131*/ 
 
 
このようにして、oriTextに、コードを割り付けておけば、F# Interactiveから参照可能なので、テストしながら実装を進めることができます。 
 
ではまずはフォーム名を抜き出す関数を定義します。 
フォーム名は上の112行のようなthis.Textの後の部分なので正規表現を利用して次の様に定義します。 
 
> let getFormName (ori_source:string) = 
    let rg = new Regex("this.Name = \"(?<FormName>[\w]+)") 
    let matched = rg.Match(ori_source) 
    (matched.Groups.["FormName"].Value).Trim() 
;; 
 
テストしてみます。 
> getFormName oriText;; 
val it : string = "mainForm" 
 
次に実装するのは、上の121行から127行までのコンポーネントの名前と型を抜き出す関数です。 
 
> let getControlNamesAndType (ori_source:string) = 
    let rg = new Regex("private\s+(?<typeOfComp>[\w|\.]+)\s+(?<name>[\w\.]+)\;") 
    let matchCol = rg.Matches(ori_source) 
    seq{ 
        for mc in matchCol do 
            yield ((mc.Groups.["name"].Value).Trim(), (mc.Groups.["typeOfComp"].Value).Trim()) 
        }   
;; 
 
val getControlNamesAndType : string -> seq<string * string> 
 
テストしてみます。 
 
> getControlNamesAndType oriText;; 
val it : seq<string * string> = 
  seq 
    [("load_btn", "System.Windows.Forms.Button"); 
     ("ori_source_rtb", "System.Windows.Forms.RichTextBox"); 
     ("conv_btn", "System.Windows.Forms.Button"); 
     ("result_rtb", "System.Windows.Forms.RichTextBox"); ...] 
 
(注意)このなかに("mainForm","System.Windows.Forms.Form")は入っていません。 
 
次に「フォームもコンポーネントも平等に扱う」ために次のような手順でテキストを整形します。 
(1)this.+コンポーネント名を「that.コンポーネント名」に置換。 
(2)this.を「this.フォーム名」に置換 
(3)thisを""に置換 
(4)thatを""に置換 
 
実装の前に置換専用の補助関数を導入しておきます。 
 
> //文字置換用関数//////////// 
let myReplace (regStr:string) (repStr:string) (oriSrcStr:string)= 
    (new Regex(regStr)).Replace(oriSrcStr,repStr);; 
 
val myReplace : string -> string -> string -> string 
 
次の様に使用します。 
 
> myReplace "this" "that" "this is this";; 
val it : string = "that is that" 
 
では、目的の関数を定義します。 
 
> let getFlattenSource (ori_source:string) = 
    (getControlNamesAndType ori_source) 
    |> Seq.fold(fun str (name,_)  ->let replacePart = "this." + name 
                                    let newWord = "that." + name 
                                    myReplace replacePart newWord str 
                ) 
                ori_source 
    |> myReplace "this." ("this." + (getFormName ori_source) + ".")  
    |> myReplace "this." ""  
    |> myReplace "that." "" ;; 
 
val getFlattenSource : string -> string 
 
テストしてみます。(注意)行番号はあとから付け加えたものです。 
> getFlattenSource oriText;; 
val it : string = 
/*  0*/namespace CommentAddFormDesign 
/*  1*/{ 
/*  2*/    partial class mainForm 
/*  3*/    { 
/*  4*/        /// <summary> 
/*  5*/        /// 必要なデザイナー変数です。 
/*  6*/        /// </summary> 
/*  7*/        private System.ComponentModel.IContainer components = null; 
/*  8*/        /// <summary> 
/*  9*/        /// 使用中のリソースをすべてクリーンアップします。 
/* 10*/        /// </summary> 
/* 11*/        /// <param name="disposing">マネージ リソースが破棄される場合 true、破棄されない場合は false です。</param> 
/* 12*/        protected override void Dispose(bool disposing) 
/* 13*/        { 
/* 14*/            if (disposing && (components != null)) 
/* 15*/            { 
/* 16*/                components.Dispose(); 
/* 17*/            } 
/* 18*/            base.Dispose(disposing); 
/* 19*/        } 
/* 20*/        #region Windows フォーム デザイナーで生成されたコード 
/* 21*/        /// <summary> 
/* 22*/        /// デザイナー サポートに必要なメソッドです。このメソッドの内容を 
/* 23*/        /// コード エディターで変更しないでください。 
/* 24*/        /// </summary> 
/* 25*/        private void InitializeComponent() 
/* 26*/        { 
/* 27*/            label1 = new System.Windows.Forms.Label(); 
/* 28*/            error_rtb = new System.Windows.Forms.RichTextBox(); 
/* 29*/            to_clip_btn = new System.Windows.Forms.Button(); 
/* 30*/            oritext_rtb = new System.Windows.Forms.RichTextBox(); 
/* 31*/            load_btn = new System.Windows.Forms.Button(); 
/* 32*/            groupBox1 = new System.Windows.Forms.GroupBox(); 
/* 33*/            radioButton2 = new System.Windows.Forms.RadioButton(); 
/* 34*/            radioButton1 = new System.Windows.Forms.RadioButton(); 
/* 35*/            Convert_btn = new System.Windows.Forms.Button(); 
/* 36*/            result_rtb = new System.Windows.Forms.RichTextBox(); 
/* 37*/            cls_btn = new System.Windows.Forms.Button(); 
/* 38*/            groupBox1.SuspendLayout(); 
/* 39*/            mainForm.SuspendLayout(); 
/* 40*/            //  
/* 41*/            // label1 
/* 42*/            //  
/* 43*/            label1.AutoSize = true; 
/* 44*/            label1.Location = new System.Drawing.Point(290, 166); 
/* 45*/            label1.Name = "label1"; 
/* 46*/            label1.Size = new System.Drawing.Size(30, 12); 
/* 47*/            label1.TabIndex = 13; 
/* 48*/            label1.Text = "Error"; 
/* 49*/            //  
/* 50*/            // error_rtb 
/* 51*/            //  
/* 52*/            error_rtb.Location = new System.Drawing.Point(292, 185); 
/* 53*/            error_rtb.Name = "error_rtb"; 
/* 54*/            error_rtb.Size = new System.Drawing.Size(446, 38); 
/* 55*/            error_rtb.TabIndex = 12; 
/* 56*/            error_rtb.TabStop = false; 
/* 57*/            error_rtb.Text = ""; 
/* 58*/            //  
/* 59*/            // to_clip_btn 
/* 60*/            //  
/* 61*/            to_clip_btn.Location = new System.Drawing.Point(753, 167); 
/* 62*/            to_clip_btn.Name = "to_clip_btn"; 
/* 63*/            to_clip_btn.Size = new System.Drawing.Size(73, 54); 
/* 64*/            to_clip_btn.TabIndex = 10; 
/* 65*/            to_clip_btn.Text = "To Clipborad"; 
/* 66*/            to_clip_btn.UseVisualStyleBackColor = true; 
/* 67*/            //  
/* 68*/            // oritext_rtb 
/* 69*/            //  
/* 70*/            oritext_rtb.Location = new System.Drawing.Point(12, 46); 
/* 71*/            oritext_rtb.Name = "oritext_rtb"; 
/* 72*/            oritext_rtb.Size = new System.Drawing.Size(819, 109); 
/* 73*/            oritext_rtb.TabIndex = 11; 
/* 74*/            oritext_rtb.Text = ""; 
/* 75*/            //  
/* 76*/            // load_btn 
/* 77*/            //  
/* 78*/            load_btn.Location = new System.Drawing.Point(12, 7); 
/* 79*/            load_btn.Name = "load_btn"; 
/* 80*/            load_btn.Size = new System.Drawing.Size(75, 33); 
/* 81*/            load_btn.TabIndex = 7; 
/* 82*/            load_btn.Text = "Load"; 
/* 83*/            load_btn.UseVisualStyleBackColor = true; 
/* 84*/            //  
/* 85*/            // groupBox1 
/* 86*/            //  
/* 87*/            groupBox1.Controls.Add(radioButton2); 
/* 88*/            groupBox1.Controls.Add(radioButton1); 
/* 89*/            groupBox1.Location = new System.Drawing.Point(114, 166); 
/* 90*/            groupBox1.Name = "groupBox1"; 
/* 91*/            groupBox1.Size = new System.Drawing.Size(172, 63); 
/* 92*/            groupBox1.TabIndex = 14; 
/* 93*/            groupBox1.TabStop = false; 
/* 94*/            groupBox1.Text = "Type"; 
/* 95*/            //  
/* 96*/            // radioButton2 
/* 97*/            //  
/* 98*/            radioButton2.AutoSize = true; 
/* 99*/            radioButton2.Location = new System.Drawing.Point(20, 44); 
/*100*/            radioButton2.Name = "radioButton2"; 
/*101*/            radioButton2.Size = new System.Drawing.Size(55, 16); 
/*102*/            radioButton2.TabIndex = 1; 
/*103*/            radioButton2.Text = "/*  */"; 
/*104*/            radioButton2.UseVisualStyleBackColor = true; 
/*105*/            //  
/*106*/            // radioButton1 
/*107*/            //  
/*108*/            radioButton1.AutoSize = true; 
/*109*/            radioButton1.Checked = true; 
/*110*/            radioButton1.Location = new System.Drawing.Point(20, 22); 
/*111*/            radioButton1.Name = "radioButton1"; 
/*112*/            radioButton1.Size = new System.Drawing.Size(51, 16); 
/*113*/            radioButton1.TabIndex = 0; 
/*114*/            radioButton1.TabStop = true; 
/*115*/            radioButton1.Text = "(*  *)"; 
/*116*/            radioButton1.UseVisualStyleBackColor = true; 
/*117*/            //  
/*118*/            // Convert_btn 
/*119*/            //  
/*120*/            Convert_btn.Location = new System.Drawing.Point(12, 167); 
/*121*/            Convert_btn.Name = "Convert_btn"; 
/*122*/            Convert_btn.Size = new System.Drawing.Size(75, 62); 
/*123*/            Convert_btn.TabIndex = 15; 
/*124*/            Convert_btn.Text = "Convert"; 
/*125*/            Convert_btn.UseVisualStyleBackColor = true; 
/*126*/            //  
/*127*/            // result_rtb 
/*128*/            //  
/*129*/            result_rtb.Location = new System.Drawing.Point(12, 235); 
/*130*/            result_rtb.Name = "result_rtb"; 
/*131*/            result_rtb.Size = new System.Drawing.Size(819, 190); 
/*132*/            result_rtb.TabIndex = 16; 
/*133*/            result_rtb.Text = ""; 
/*134*/            //  
/*135*/            // cls_btn 
/*136*/            //  
/*137*/            cls_btn.Location = new System.Drawing.Point(751, 12); 
/*138*/            cls_btn.Name = "cls_btn"; 
/*139*/            cls_btn.Size = new System.Drawing.Size(75, 23); 
/*140*/            cls_btn.TabIndex = 17; 
/*141*/            cls_btn.Text = "Clear"; 
/*142*/            cls_btn.UseVisualStyleBackColor = true; 
/*143*/            //  
/*144*/            // mainForm 
/*145*/            //  
/*146*/            mainForm.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F); 
/*147*/            mainForm.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; 
/*148*/            mainForm.ClientSize = new System.Drawing.Size(838, 469); 
/*149*/            mainForm.Controls.Add(cls_btn); 
/*150*/            mainForm.Controls.Add(result_rtb); 
/*151*/            mainForm.Controls.Add(Convert_btn); 
/*152*/            mainForm.Controls.Add(groupBox1); 
/*153*/            mainForm.Controls.Add(label1); 
/*154*/            mainForm.Controls.Add(error_rtb); 
/*155*/            mainForm.Controls.Add(to_clip_btn); 
/*156*/            mainForm.Controls.Add(oritext_rtb); 
/*157*/            mainForm.Controls.Add(load_btn); 
/*158*/            mainForm.Name = "mainForm"; 
/*159*/            mainForm.Text = "CommentAdder"; 
/*160*/            groupBox1.ResumeLayout(false); 
/*161*/            groupBox1.PerformLayout(); 
/*162*/            mainForm.ResumeLayout(false); 
/*163*/            mainForm.PerformLayout(); 
/*164*/        } 
/*165*/        #endregion 
/*166*/        private System.Windows.Forms.Label label1; 
/*167*/        private System.Windows.Forms.RichTextBox error_rtb; 
/*168*/        private System.Windows.Forms.Button to_clip_btn; 
/*169*/        private System.Windows.Forms.RichTextBox oritext_rtb; 
/*170*/        private System.Windows.Forms.Button load_btn; 
/*171*/        private System.Windows.Forms.GroupBox groupBox1; 
/*172*/        private System.Windows.Forms.RadioButton radioButton2; 
/*173*/        private System.Windows.Forms.RadioButton radioButton1; 
/*174*/        private System.Windows.Forms.Button Convert_btn; 
/*175*/        private System.Windows.Forms.RichTextBox result_rtb; 
/*176*/        private System.Windows.Forms.Button cls_btn; 
/*177*/    } 
/*178*/} 
 
146行~をみると、フォームも他のコントロールと同列扱いになっているのが分かります。 
 
最後にload_btn.Click.Addの一文として次を付け加えておきます。 
 
 formFlattenText <- getFlattenSource oriText 
  
  
 続きは次回ということで。ここまでのコードは以下の通りです。 
 open System 
open System.Text.RegularExpressions 
open System.Windows.Forms 
open System.Drawing 
 
//広域変数///////////////////////// 
let mutable oriText = "" 
let mutable formFlattenText = "" 
 
let getFormName (ori_source:string) = 
    let rg = new Regex("this.Name = \"(?<FormName>[\w]+)") 
    let matched = rg.Match(ori_source) 
    (matched.Groups.["FormName"].Value).Trim() 
 
 
let getControlNamesAndType (ori_source:string) = 
    let rg = new Regex("private\s+(?<typeOfComp>[\w|\.]+)\s+(?<name>[\w\.]+)\;") 
    let matchCol = rg.Matches(ori_source) 
    seq{ 
        for mc in matchCol do 
            yield ((mc.Groups.["name"].Value).Trim(), (mc.Groups.["typeOfComp"].Value).Trim()) 
        }   
 
let myReplace (regStr:string) (repStr:string) (oriSrcStr:string)= 
    (new Regex(regStr)).Replace(oriSrcStr,repStr) 
 
let getFlattenSource (ori_source:string) = 
    (getControlNamesAndType ori_source) 
    |> Seq.fold(fun str (name,_)  ->let replacePart = "this." + name 
                                    let newWord = "that." + name 
                                    myReplace replacePart newWord str 
                ) 
                ori_source 
    |> myReplace "this." ("this." + (getFormName ori_source) + ".")  
    |> myReplace "this." ""  
    |> myReplace "that." ""  
 
 
 
 
let f2c x = x :> System.Windows.Forms.Control  
let load_btn= new Button(Location = new Point(21, 12),Name = "load_btn",Size = new Size(75, 23),TabIndex = 0,Text = "Load",UseVisualStyleBackColor = true) 
let ori_source_rtb= new RichTextBox(Location = new Point(21, 41),Name = "ori_source_rtb",Size = new Size(819, 178),TabIndex = 1,Text = "") 
let conv_btn= new Button(Location = new Point(21, 225),Name = "conv_btn",Size = new Size(144, 54),TabIndex = 2,Text = "Convert",UseVisualStyleBackColor = true) 
let result_rtb= new RichTextBox(Location = new Point(21, 285),Name = "result_rtb",Size = new Size(819, 254),TabIndex = 4,Text = "") 
let to_clip_btn= new Button(Location = new Point(744, 225),Name = "to_clip_btn",Size = new Size(96, 54),TabIndex = 3,Text = "To Clipborad",UseVisualStyleBackColor = true) 
let error_rtb= new RichTextBox(Location = new Point(173, 241),Name = "error_rtb",Size = new Size(553, 38),TabIndex = 5,TabStop = false,Text = "") 
let label1= new Label(AutoSize = true,Location = new Point(171, 222),Name = "label1",Size = new Size(30, 12),TabIndex = 6,Text = "Error") 
let mainForm= new Form(AutoScaleDimensions = new SizeF(6.0f, 12.0f),AutoScaleMode = AutoScaleMode.Font,ClientSize = new Size(864, 570),Name = "minForm",Text = "SimpleFormConverter Ver0.01") 
[ f2c label1; f2c error_rtb; f2c to_clip_btn; f2c result_rtb; f2c conv_btn; f2c ori_source_rtb; f2c load_btn] |> List.iter(fun cnt -> mainForm.Controls.Add cnt) 
 
load_btn.Click.Add 
    (fun _ -> try 
                let ofd = new OpenFileDialog(Filter = "Designer.csファイル(*.Designer.cs)|*.Designer.cs|すべてのファイル(*.*)|*.*") 
                if(ofd.ShowDialog() = DialogResult.OK) then 
                    use sr = new System.IO.StreamReader(ofd.FileName) 
                    ori_source_rtb.Text <- sr.ReadToEnd() 
                    oriText <- ori_source_rtb.Text 
                    formFlattenText <- getFlattenSource oriText 
              with 
                | ex ->  error_rtb.Text <- ex.Message  
    ) 
 
mainForm.Show() 
スポンサーサイト

コメントの投稿

非公開コメント

プロフィール

T GYOUTEN

Author:T GYOUTEN
F#と英単語とフリーソフトと読書に興味があります。
ホームページでフリーソフトも公開しています。どぞ御贔屓に。

最新記事
最新コメント
最新トラックバック
月別アーカイブ
カテゴリ
フリーエリア
フリーエリア
blogram投票ボタン
検索フォーム
RSSリンクの表示
リンク
ブロとも申請フォーム

この人とブロともになる

QRコード
QRコード
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。