2013年10月22日火曜日

【なでしこ】カレンダーを作ってみる

今、gnakoを使って少し大きめのアプリ書いてるんですが…。
gnakoの問題点が色々分かって、やっぱりGUIのエディタは
別のモノを使ったほうがいいんじゃないかと。通信DLLは
大体出来てるので、この辺り片付けたら、次はWinAPIを
もうちょっとダイレクトに触れるDLLなりexeなり作ろうかなあ。

さて、今回は「少し大きめのアプリ」でも使ってるカレンダー
機能のお話し。なでしこのくみこみ関数使ってある程度は
できるんですが、GUI用に使うならこれぐらいは欲しいかなあ
と言う部分を補完。

------ここから------

 ■GRP年月日
 ・{整数}年
  ・{整数}月
  ・{整数}日数
  ・日
  ・日数設定~
   日数=月日数判断(年、月)
  ・曜日設定~
  日数回
     年月日=「{年}」&「/」&「{月}」&「/」&「{回数}」
   日\回数=年月日の曜日

●二月日数判断(Yの)
 もしYを4で割った余り=0ならば
   もしYを100で割った余り=0ならば
     もしYを400で割った余り=0ならば
       日数=29
      違えば
       日数=28
    違えば
     日数=29
  違えば
   日数=28

 日数で戻る

●月日数判断(Y、M)
 Mで条件分岐
   1ならば
     日数=31
    2ならば
     日数=Yの二月日数判断
  3ならば
     日数=31
  4ならば
     日数=30
  5ならば
     日数=31
  6ならば
     日数=30
  7ならば
     日数=31
  8ならば
     日数=31
  9ならば
     日数=30
  10ならば
     日数=31
  11ならば
     日数=30
  12ならば
     日数=31
    違えば
     日数=0
   
  日数で戻る

------ここまで------

こんなもんでしょうか。「■GRP年月日」がカレンダー情報を
保持していて、要素「日」は配列です。「年」と「月」を設定して
「日数設定」メソッドと、「曜日設定」メソッドを呼べば、「日数」
にその月が何日あるかと、「日」にそれぞれの日が何曜日か
を代入します。「日」は配列の添え字(0~)が日(1~)に対応
してます。

アルゴリズム的にはC言語とそんなに変わらない感じ。なでしこは
グループ昨日を使いこなしていけばそこそこ複雑なことも出きる
ので、「なでしこでアルゴリズム」みたいな本があれば面白いのに
なあ。

2013年10月6日日曜日

【なでしこ】グループをシリアライズしてみる

ああ、なんか時間取れない…と思ってるウチにかなり時間が
開いてしまった( ̄ω ̄;。

DLLの話はちょっとおいておいて、なでしこのグループの話。
なでしこのグループを作成して、それをいったんファイルに保存
しておき、今度ファイルからよんでまたグループに値を代入する
と言うお話。なでしこは中間コードを生成するわけではないので
ホントにシリアライズは出来ないんだけど、まあイベントとか
関数とか含まないグループならファイルに保存するぐらいなら
可能かな。

ってことでまずはグループを作ってみます。

------ここから------

■GRPプロジェクト
 ・{文字列}GRP名{=「GRPプロジェクト」}
 ・{整数}ノード{=0}
 ・{文字列}名前
 ・{文字列}開始日
 ・{文字列}終了日
 ・{整数}次ノード{=1}

------ここまで------

実はちょっと仕掛けが必要で、グループ要素の先頭に
文字列で「GRPプロジェクト」と、グループ名(GRP名)を
入れておきます。あとは文字列とか整数とかで値を列挙。

#あるプログラム用なので、要素名とかはあまり気に
 しないでください(^^;。

これをファイルに保存しておきたい分けですが、折角
だからXML風に保存します。

------ここから------

<GRPプロジェクト>
    <コード>0</コード>
    <名前>IIU向け新PFの開発</名前>
    <開始日>2013/10/04</開始日>
    <終了日></終了日>
    <関係者コード>100</関係者コード>
    <管理項目コード>200</管理項目コード>
    <フェーズコード>300</フェーズコード>
</GRPプロジェクト>

------ここまで------

グループ名が<GRPプロジェクト>~</GRPプロジェクト>の
タグになって、あとは要素がそれぞれのタグとなります。

これを実現するのに、下記のコードを書きました。

------ここから------

●XML化(GRPを)
 GRP名=GRPのグループ判定
 
  もしGRP名=空ならば
   #何もしない
  違えば
   メンバーズはGRPのメンバ詳細列挙
   メンバ数はメンバーズの配列要素数
   メンバ数回
    メンバーズ\(回数-1)の「(」から「)」まで範囲切り取る
   タグペアはメンバーズ\(回数-1)を「 =  」で区切る

 もし(回数-1)=0ならば
  グループ終了タグ=「</」&「{タグペア\1}」&「>」
  XML結果=「<」&「{タグペア\1}」&「>」&改行
 違えば
  アイテム開始タグ=「    」&「<」&「{タグペア\0}」&「>」
  アイテム終了タグ=「</」&「{タグペア\0}」&「>」
XML結果=XML結果&アイテム開始タグ&「{タグペア\1}」&アイテム終了タグ&改行

XML結果=XML結果&グループ終了タグ&改行&改行

  XML結果で戻る

------ここまで------

「グループ判定」「メンバ詳細列挙」というのはなでしこの命令です。
一番最初なら大くくりのタグを作って、2番目以降は1行に開始
タグと終了タグを入れてます。

ファイルから呼んでグループに戻すのは…省略(^^;。比較的簡単に
出来ますよ。最初のタグ読んだときにグループを生成し、それ以降は
生成したグループに値(<xxxx>~</xxxx>の間にある文字列)を入れる
だけ。

なでしこの変数はファジーに出来ていて、

{整数}X

と宣言したところにたとえば文字列で「1」と入れてあげても、以降
ちゃんと整数として扱ってくれます(2byte系の文字列「1」ではダメ
でした。半角数字なら 整数として代入してくれるようです)。なので
ファイルに文字列として書き出していても、次にそれを読み込んで
変数に代入すれば整数として扱ってくれるんですね~♪