スポンサーサイト

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

F#雑記 SimpleFormConverter(2)

 前回からの続きです。 
 
前回までで、 
 
> oriText;; 
val it : string = 
/*  0*/namespace FormSample 
/*  1*/{ 
/*  2*/    partial class mainForm 
/*  3*/    { 
中略 
/* 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); 
後略 
 
とう形のテキストと、これを変換した、 
 
/*  0*/namespace CommentAddFormDesign 
/*  1*/{ 
中略 
/* 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"; 
中略 
/*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*/        } 
後略 
 
という名前のテキストが oriTextとformFlattenTextに割り付けられるところまで実装しました。 
(ここで、前回最後のコードをすべてF# Interactiveに送り、適当なDesigner.csファイルをロードしておいたものとして、話を進めます。(これによりoriTextとformFlattenTextに実際のテキストが割り付けられます。)) 
 
今回は、コンストラクタ部分を実装します。 
コンストラクタ部分は 
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 mainForm= new Form(AutoScaleDimensions = new SizeF(6.0f, 12.0f),AutoScaleMode = AutoScaleMode.Font,ClientSize = new Size(864, 570),Name = "minForm",Text = "SimpleFormConverter Ver0.01") 
というようなコードに変換したいので、まず 
 getPropNameValueEqualStr フラットソーステキスト "load_btn";;で 
 seq 
    ["Location = new System.Drawing.Point(21, 12)"; "Name = "load_btn""; 
     "Size = new System.Drawing.Size(75, 23)"; "TabIndex = 0"; ...]が返るように、 
関数getPropNameValueEqualStrを定義します。次のようになります。 
 
> let getPropNameValueEqualStr (flatten_source:string) (contName:string)  = 
     let rgStr =  contName+"\.(?<PropName>[^\s=]+?)\s*=\s*(?<PropValue>(.|\n)+?)\;" 
     let rg = new Regex (rgStr) 
     let matchCol = rg.Matches (flatten_source) 
     seq{ 
        for mc in matchCol do 
            yield ( (mc.Groups.["PropName"].Value) + " = " + (mc.Groups.["PropValue"].Value)) 
    };; 
 
val getPropNameValueEqualStr : string -> string -> seq<string> 
 
テストしてみます。 
 
> getPropNameValueEqualStr formFlattenText "load_btn";; 
val it : seq<string> = 
  seq 
    ["Location = new System.Drawing.Point(21, 12)"; "Name = "load_btn""; 
     "Size = new System.Drawing.Size(75, 23)"; "TabIndex = 0"; ...] 
 
> getPropNameValueEqualStr formFlattenText "mainForm";; 
val it : seq<string> = 
  seq 
    ["AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F)"; 
     "AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font"; 
     "ClientSize = new System.Drawing.Size(864, 570)"; "Name = "mainForm""; 
     ...] 
  
 では次に 
getConstractStrs フラットソーステキスト オリジナルソーステキスト 
で、 
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 = "") 
.... 
というような文字列を返す関数getConstractStrsを次のように定義します。 
 
> let getConstractStrs (ori_source:string) (flatten_source:string) = 
    let sb = new System.Text.StringBuilder() 
    for (name,ptype) in Seq.append (getControlNamesAndType ori_source) (seq[(getFormName ori_source , "Form")]) do 
        let propNameValueEqualStrSeq = (getPropNameValueEqualStr flatten_source name)  
        let joinedStr = String.Join (",", propNameValueEqualStrSeq) 
        sb.Append("let " + name + "= " + "new " + ptype + "(" + joinedStr + ")" + "\n") |>ignore     
    sb.ToString() |> myReplace "System.Windows.Forms." "" |> myReplace "System.Drawing." "";; 
 
val getConstractStrs : string -> string -> string 
 
Seq.append (getControlNamesAndType ori_source) (seq[(getFormName ori_source , "Form")]) の部分は内部コンポーネントと同様になるようにFormを追加しています。 
    sb.ToString() |> myReplace "System.Windows.Forms." "" |> myReplace "System.Drawing." "";; 
の部分は,System.Windows.Forms.とSystem.Drawing.を省略しています。 
 
ではテストです。 
 
> getConstractStrs oriText formFlattenText;; 
val it : string = 
  "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(6F, 12F),AutoScaleMode = AutoScaleMode.Font,ClientSize = new Size(864, 570),Name = "mainForm",Text = "SimpleFormConverter Ver0.01") 
うまくいっているようです。(ただ6Fという書式はF#では使えないのでこれを6.0f等に変換する部分は後で実装します。) 
Convertボタンを押すとこの部分が下のテキストボックスに表示されるように、次のコードを追加します。 
conv_btn.Click.Add 
    (fun _ -> try 
                   result_rtb.Text <- getConstractStrs oriText formFlattenText 
              with 
                | ex -> error_rtb.Text <- ex.Message  
    ) 
 
実行例は次の様になります。 
 
SimpleFormConverter-2.jpg
 
では今回までのソースです。 
 
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." ""  
 
// getPropNameValueEqualStr フラットソーステキスト "load_btn";;で 
// seq    ["Location = new System.Drawing.Point(21, 12)"; "Name = "load_btn""; 
//         "Size = new System.Drawing.Size(75, 23)"; "TabIndex = 0"; ...]が返る 
let getPropNameValueEqualStr (flatten_source:string) (contName:string)  = 
     let rgStr =  contName+"\.(?<PropName>[^\s=]+?)\s*=\s*(?<PropValue>(.|\n)+?)\;" 
     let rg = new Regex (rgStr) 
     let matchCol = rg.Matches (flatten_source) 
     seq{ 
        for mc in matchCol do 
            yield ( (mc.Groups.["PropName"].Value) + " = " + (mc.Groups.["PropValue"].Value)) 
    } 
//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 getConstractStrs (ori_source:string) (flatten_source:string) = 
    let sb = new System.Text.StringBuilder() 
    for (name,ptype) in Seq.append (getControlNamesAndType ori_source) (seq[(getFormName ori_source , "Form")]) do 
        let propNameValueEqualStrSeq = (getPropNameValueEqualStr flatten_source name)  
        let joinedStr = String.Join (",", propNameValueEqualStrSeq) 
        sb.Append("let " + name + "= " + "new " + ptype + "(" + joinedStr + ")" + "\n") |>ignore     
    sb.ToString() |> myReplace "System.Windows.Forms." "" |> myReplace "System.Drawing." "" 
 
 
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  
    ) 
 
 
conv_btn.Click.Add 
    (fun _ -> try 
                   result_rtb.Text <- getConstractStrs oriText formFlattenText 
              with 
                | ex -> error_rtb.Text <- ex.Message  
    ) 
 
mainForm.Show() 
 
スポンサーサイト

テーマ : プログラミング
ジャンル : コンピュータ

コメントの投稿

非公開コメント

プロフィール

T GYOUTEN

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

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

この人とブロともになる

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