 |
 |
プロシージャタグをクリックし、プロシージャの追加ボタンをクリックする。
すると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);
|