TOP Column Menu 戻る
WideStudio かんどころ(1)
WideStudioによる無作法なC++  2003/05/01

わずかにCをやったことのある超初心者の私めが感をたよりにWideStudioにチャレンジします。VisualC#.netやVisualC++なんかプログラムを組む力より、ややこしく、長ったらしいクラスライブラリーを覚えるのが半分であとはIDEを覚えるのが半分、つまりプログラ無みたいな。
VisualBasicやDelphiみたいなIDEであればまだしも、とってもつかいずらいので、C++(BorlandのBuilderは使いやすかったが、最近高くなったのでやめた)もC#もつ買う前に落ちこぼれてしまった。
で、ここで、くどくどとイカにしてWideStudioと知り合えたかを言う。 つまり、フリーでマルチプラットフォームなIDE環境なんだ。CやC++でもRubyやJAVAでも、それをWindowsのXPや2000や98でもLinuxでFreeBSDでもSOLARISでも動くGUOの開発環境ってわけだ。おまけに純国産なので、マニュアルが完全に日本語に対応しているのも、オープンソースのソフトでは珍しい。
どんなに素晴らしいものかについてや特徴についてはWideStudio Home pageで確認してください。


日や月単位のデータを操作するプログラムを仕事として作るのでとりあえず、今回は月のカレンダーを作ろう。
出来上がりの画面はこんなものでどうだろうか。

プログラムの仕様だが

第一回目は体力勝負のだ

Ⅰ画面の作成
  WideStudioを立ち上げると
①「プロジェクト作成ダイアログに従ってプロジェクト名と作業ディレクトリを設定する。
  ②プロジェクトの種別で「通常のアプリケーション」を選択
  ③プロジェクトの作成で生成ボタンを押す
と左の総合操作画面があらわれる。
総合操作画面から[ファイル(F)]の[新規ウィンドウ(N)]を選択すると左のウィンドウ作成ダイアログが現れる。通常のウィンドウを選択し[次へ>>]のボタンをクリック
ウインドウの名前はこのままで[次へ>>]のボタンをクリック
そのまま[生成]ボタンをクリック
上記の順番でテンプレートを使わずにウィンドウを生成すると左のようにフォームが生成される。
総合操作画面のメニューから表示(V)のオブジェクトボックス(O)をクリックすると左のようなオブジェクトボックスのダイアログがポップアップする。ここでCommandsタブをクリックして必要な部品をフォームウィンドウにドラッグ&ドロップする。

月移動のボタンを2個
月のボタンを12個をしようする
年月を表示するLABELを1つ仕様する。
総合操作画面でプロパティタグをクリックする
対応する各部品(ボタンやラベル)について
名称 X座標 Y座標 横幅 縦幅 表示文字列を設定する。

例えば<<前年移動のボタンは
名称:mvyy_01
X座標:0
Y座標:0
横幅;116
縦幅:30
表示文字列:<<前年移動
全ての部品を左のように設定します
月のボタンはnewvbtn_001〜newvbtn_012
年移動はmvyy_01とmvyy_02
年月表示ラベルはnewlab_002とした

Ⅱプログラミング

プロシージャタグをクリックし、プロシージャの追加ボタンをクリックする。
するとCreateProcedureダイアログがポップアップする。起動関数名を入力する。今回は01月のボタンなのでmbtn_01とした。12月ならmbtn_12となる予定。
起動トリガをクリックするとプルダウンメニューが現れる。ACTIVATEはボタンクリックで起動されるイベント名なのでACTIVATEを選択する。
起動トリガをACTIVATEにしてひな型作成し設定ボタンをクリックする
生成されたひな型(月の選択ボタン)のプログラム

#include <WScom.h>
#include <WSCfunctionList.h>
#include <WSCbase.h>
#include <WSCvlabel.h>
extern WSCvlabel* newvlab_002;
//----------------------------------------------------------
//Function for the event procedure
//----------------------------------------------------------
void mbtn_01(WSCbase* object){
  //do something...
}
static WSCfunctionRegister  op("mbtn_01",(void*)mbtn_01);

ひな型の加工(1)
ボタンをクリックするとラベル newvlab_002の月表示部分をボタンのキャプションの数字部分におきかえます。
そのためにはnewvlab_002が操作できるようにしなければなりません。その手続きが(A)行に下のイタリック表示の2行です。あまり深く考えずにやってみましょう。

#include <WScom.h>
#include <WSCfunctionList.h>
#include <WSCbase.h>

//------(A)
#include <WSCvlabel.h>
extern WSCvlabel* newvlab_002;


ひな型の加工(2)

(A)オブジェクトのキャプションを取得するには
getProperty()にWSNlabelStringを指定してやる。つまりボタンでもラベルでも同じです。
  getProperty(WSNlabelString)
 そしてどのオブジェクトかを指定してやる。
  newvlab_002->getProperty(WSNlabelString);
 変数(dm1)に入れるときは
   WSCvariant dm1=newvlab_002->getProperty(WSNlabelString);  dm1[0]='0'

(B)の説明
 もしもnewvlab_002ラベルのキャプションが 2003/05 であり、ボタンキャプションが 01月 なら
 dm1="2003/05"です。即ち
 dm1[0]='2'
 dm1[1]='0'
 dm1[2]='0'
 dm1[3]='3'
 dm1[4]='/'
 dm1[5]='0'
 dm1[6]='5'
となってdm1に格納されていますので
  dm1[5]='0';dm1[6]='1'; とすることで dm1="2003/01" となります。
  月によってコーディングが変わるのはこの部分です。
  もし12月なら dm1[5]='1';dm1[6]='2';となるわけですね。

(C)指定した文字列をオブジェクトのキャプションにセットする
  dm1をせっとします。
  setProperty(WSNlabelString , dm1);
  勿論、オブジェクトはnewvlab_002ですから
 newvlab_002->setProperty(WSNlabelString , dm1);


//----------------------------------------------------------
//Function for the event procedure
//----------------------------------------------------------
void mbtn_01(WSCbase* object){
  //do something...
  WSCvariant dm1=newvlab_002->getProperty(WSNlabelString);//←(A)
  dm1[5]='0';dm1[6]='1';//←(B)
  newvlab_002->setProperty(WSNlabelString,dm1);//←(C)
}
static WSCfunctionRegister  op("mbtn_01",(void*)mbtn_01);


(注意)
でもこれは void mbtn_02(WSCbase* object) の時には0と2をそれぞれ絶対文字で代入しますのでエレガントさがない。と思えるなら、
//←(A)の下に
WSCvariant dm2=object->getProperty(WSNlabelString);
をいれ、
dm1[5]='0';dm1[6]='1'; //←(B)

dm1[5]=dm2[0];dm1[6]=dm2[1];
とすれば全ての月のボタンのACTIVEイベントのプログラムに通じるでしょう。
これを12回にわたって書き込む(貼り付ける)のがいやなら、関数化すればいいのですが、それは第二回目以後にいたしましょう

全体でこういう風になります。
#include <WScom.h>
#include <WSCfunctionList.h>
#include <WSCbase.h>
#include <WSCvlabel.h>
extern WSCvlabel* newvlab_002;
//----------------------------------------------------------
//Function for the event procedure
//----------------------------------------------------------
void mbtn_01(WSCbase* object){
  //do something...
  WSCvariant dm1=newvlab_002->getProperty(WSNlabelString);
  dm1[5]='0';dm1[6]='1';
  newvlab_002->setProperty(WSNlabelString,dm1);
}
static WSCfunctionRegister  op("mbtn_01",(void*)mbtn_01);

生成されたひな型(年移動の選択ボタン)のプログラム

#include <WScom.h>
#include <WSCfunctionList.h>
#include <WSCbase.h>
//----------------------------------------------------------
//Function for the event procedure
//----------------------------------------------------------
void mbyy_01(WSCbase* object){
  //do something...
}
static WSCfunctionRegister  op("mbyy_01",(void*)mbyy_01);

ひな型の加工(3)
ボタンをクリックするとラベル newvlab_002の年表示部分をボタンの1年マイナスします。
そのためにはnewvlab_002が操作できるようにしなければなりません。その手続きはひな型の加工(1)と同じに
#include <WSCvlabel.h>
extern WSCvlabel* newvlab_002;
行を挿入するのでしたね。
ひな型の加工(4)
ここはプログラム部分ですが、別に難しいことはありませんね。とりあえず年の部分をdmyの変数にいれてそれをatoiで数字化します。それがint 型のyyですがそれを一つ数を減らします。つまり、y--ですね。これが次年移動ならy++となるわけです。それを再度sprintfでdmyにもどしまして、dm1の[0]〜[3]までに一文字づつ複写します。あとはdm1を先ほどと同様に
newvlab_002->setProperty(WSNlabelString,dm1);
してラベルのキャプションを変更しておわります。

//----------------------------------------------------------
//Function for the event procedure
//----------------------------------------------------------
void mbyy_01(WSCbase* object){
  //do something...
  char dmy[6];
  int i,yy;
  WSCvariant dm1=newvlab_002->getProperty(WSNlabelString);
  for(i=0;i<4;i++) dmy[i]=dm1[i];
  dmy[4]='\0'; yy=atoi(dmy); yy--;
  sprintf(dmy,"%04d",yy);
  for(i=0;i<4;i++) dm1[i]=dmy[i];
  newvlab_002->setProperty(WSNlabelString,dm1);
}
static WSCfunctionRegister  op("mbyy_01",(void*)mbyy_01);

全体としては以下のようになります。 void mbyy_02(WSCbase* object)の場合(次年度動)はy--をy++にすればいいわけですね。 p>#include <WScom.h>
#include <WSCfunctionList.h>
#include <WSCbase.h>
#include <WSCvlabel.h>
extern WSCvlabel* newvlab_002;
//----------------------------------------------------------
//Function for the event procedure
//----------------------------------------------------------
void mbyy_01(WSCbase* object){
  //do something...
  char dmy[6];
  int i,yy;
  WSCvariant dm1=newvlab_002->getProperty(WSNlabelString);
  for(i=0;i<4;i++) dmy[i]=dm1[i];
  dmy[4]='\0'; yy=atoi(dmy); yy--;
  sprintf(dmy,"%04d",yy);
  for(i=0;i<4;i++) dm1[i]=dmy[i];
  newvlab_002->setProperty(WSNlabelString,dm1);
}
static WSCfunctionRegister  op("mbyy_01",(void*)mbyy_01);
最後にプログラムが起動したときに行うイベントを記述しましょう

最初につけたウィンドウの名前はnewwin000でした。総合操作画面でプロシージャタブをクリックしボタンでイベント関数を作成した のと同様に起動関数名をつけます。この場合はwin_epとしました。そして起動トリガをINITALIZEとします。これで生成されたスケルトンにてを加えます。
今回はとりあえず、起動したら、今月をラベルに表示させるのがもくてきです。すなわち今月が2003年の5月なら 2003/05と表示させるのです。
本日を取得するためにtime.hから時の構造体をつかうことにしました。
#include <time.h>が必要ですね。

time_t today_time;
struct tm today;

のかんじでやっちゃいました。
当然表示する場所は newvlab_002 なのであのおまじないを記述いたします。
#include <WSCvlabel.h>
extern WSCvlabel* newvlab_002;

全体としては以下のようになります。
#include <WScom.h>
#include <WSCfunctionList.h>
#include <WSCbase.h>
#include<time.h>
#include <WSCvlabel.h>
  extern WSCvlabel* newvlab_002;
//----------------------------------------------------------
//Function for the event procedure
//----------------------------------------------------------
void win_ep(WSCbase* object){
  //do something...
  time_t today_time;
  struct tm today;
  int yy,mm,dd;
  char ttl[32];
  //WSCvariant tp;
   today_time=time(NULL);
  today=*localtime(&today_time);
  yy=today.tm_year+1900;//+YEAR;
  mm=today.tm_mon+1;
  sprintf(ttl,"%04d/%02d",yy,mm);
  newvlab_002->setProperty(WSNlabelString,ttl);
  //newvlab_002.WSNlabelString=ttl;
}
static WSCfunctionRegister  op("win_ep",(void*)win_ep);

今回はこれで終了  Source calen_01.lzh

そして、今後の予定ですが(プログラムは出来ていますがHTML書き込みが大変)
第二回はこの月カレンダーのボタンを配列化してすこしはエレガントにしたいと思っています。
第三回は本格的なカレンダープログラムにしたてます。
第四回はカレンダーを利用した日記に挑戦