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

第八回 動的配列のプログラムを作る

プログラム作成にあたって、私のような初心者は意味もわからず、「こうするもんだ」でやってしまうことが多いのです。後で、理解できればいいし、出来なくとも、それに類するパターンについて経験をつんでいくことで、何の不安も無くプログラムを組める場合が結構多いのだということを知っています。
この掲載の第二回目は「第二回 配列の取扱(実験)」でありボタンの名前を配列化することにより、配列操作が可能であることを既に学んでおります。
今回はプログラム上でオブジェクトを生成し、配列化し、それから発生するイベント(トリガ)を生成してみたいと思います。とりあえず、年移動ボタンについては2つしかないので、生成するプログラムを書くよりはプロシージャタグからプロシージャの追加で設定した方が楽なので、そちらを使用します。
今回作成するオブジェクトとイベントは の2つについて行います。



月移動ボタンの動的配列化とイベントプログラムの生成

WSCvbtn* mmbtn[12]; //<<=====ボタンを配列で宣言しておく
int set_month(int sty) //<<======ここからが関数です。
{
    int i,x,y;
    char dmy[6];
    int ht;
    char *mmbtn_name[12]={
        "mmbtn00","mmbtn01","mmbtn03","mmbtn03","mmbtn04","mmbtn05",
        "mmbtn06","mmbtn07","mmbtn08","mmbtn09","mmbtn10","mmbtn11",
    };
    ht=MM_HT;
    WSCbase* baseobj[12];
    for(i=0;i<12;i++){
        //<<====以下4行がボタン生成のおまじない
        baseobj[i]=WSCbase::getNewInstance("WSCvbtn",newwin000,mmbtn_name[i]);
        baseobj[i]->initialize();
        baseobj[i]->clear();
        mmbtn[i]=(WSCvbtn*)baseobj[i]->cast("WSCvbtn");

        x = ST_LEFT+MM_WD * (i % 6); //<<=====月のボタン表示の横軸の位置を計算
        y = sty + ht * (i /6); //<<==============月のボタン表示の縦軸の位置を計算
        mmbtn[i]->setProperty(WSNheight,ht); //<<========月のボタンの高さを設定
        mmbtn[i]->setProperty(WSNwidth,MM_WD); //<<====月ボタンの幅を設定
        mmbtn[i]->setProperty(WSNx,x); //<<=============月のボタン表示の横軸の位置を設定
        mmbtn[i]->setProperty(WSNy,y); //<<=============月のボタン表示の縦軸の位置を設定
        sprintf(dmy,"%02d月",i+1); //<<=========月ボタンの表示文字列を作成        mmbtn[i]->setProperty(WSNlabelString,dmy); //<<===月ボタンの表示文字列を設定
        mmbtn[i]->setProperty(WSNvis,(WSCbool)1); //<<===月ボタンを表示


        //ボタンオブジェクトのイベントプロシージャの生成
        //トリガはマウスの左ボタンが押されたら起動するのだが
        //その起動プログラム名をchgMinth.cppとしたわけです。
        //この以下の4行もおまじないだと思ってください。
        WSCprocedure* btn_ep_obj = new WSCprocedure("monthchg_ep",WSEV_ACTIVATE);
        extern void chgMonth(WSCbase*);
        btn_ep_obj->setFunction(chgMonth,"chgMonth");
        mmbtn[i]->addProcedure(btn_ep_obj);
    }
    return((sty+ht*2));
}


同様に日移動ボタンの動的配列化とイベントプログラムの生成
ここでは全ておまじないをであり、こうやって、動的にボタンを配列として生成し
イベントのプログラム名をsetSchedule.cppとして生成します。
月のボタンではボタンにかんするプロパティ(位置や表示文字列など)も同時に
設定しましたが、日は月や年によって変動しますので、プロパティは次の関数
(reset_day)で設定します

WSCvbtn* ddbtn[31];
void set_day(void)
{
    char *ddbtn_name[31]={
        "ddbtn00","ddbtn01","ddbtn02","ddbtn03","ddbtn04",
        "ddbtn05","ddbtn06","ddbtn07","ddbtn08","ddbtn09",
        "ddbtn10","ddbtn11","ddbtn12","ddbtn13","ddbtn14",
        "ddbtn15","ddbtn16","ddbtn17","ddbtn18","ddbtn19",
        "ddbtn20","ddbtn21","ddbtn22","ddbtn23","ddbtn24",
        "ddbtn25","ddbtn26","ddbtn27","ddbtn28","ddbtn29","ddbtn30"
    };
    WSCbase* baseobj[31];
    for(i=0;i<31;i++){
        //for(i=0;i<max_day;i++){
        baseobj[i]=WSCbase::getNewInstance("WSCvbtn",newwin000,ddbtn_name[i]);
        baseobj[i]->initialize();
        baseobj[i]->clear();
        ddbtn[i]=(WSCvbtn*)baseobj[i]->cast("WSCvbtn");
        //ボタンオブジェクトのイベントプロシージャの生成
        WSCprocedure* btn_ep_obj = new WSCprocedure("yotei_ep",WSEV_ACTIVATE);
        extern void setSchedule(WSCbase*);
        btn_ep_obj->setFunction(setSchedule,"setSchedule");
        ddbtn[i]->addProcedure(btn_ep_obj);
    }
}



生成された日ボタンにイベント(位置や表示文字列)を設定するプログラムです。
int reset_day(int offset_yobi,int max_day,int sty)
{
    int i,x,y;
    char ttl[6];
    int ht;
    ht=DD_HT;
    for(i=0;i<31;i++)
        ddbtn[i]->setProperty(WSNvis,(WSCbool)0);
    for(i=0;i<max_day;i++){
        //for(i=0;i<max_day;i++){
        sprintf(ttl,"%02d日",i+1);
        y=((i+offset_yobi)/7)*ht+sty;
        x=((i+offset_yobi) % 7)*DD_WD+ST_LEFT;
        ddbtn[i]->setProperty(WSNwidth,DD_WD);
        ddbtn[i]->setProperty(WSNheight,DD_WD);
        ddbtn[i]->setProperty(WSNx,x);
        ddbtn[i]->setProperty(WSNy,y);
        ddbtn[i]->setProperty(WSNlabelString,ttl);
    }
    for(i=0;i<max_day;i++) ddbtn[i]->setProperty(WSNvis,(WSCbool)1);
    return(y+ht);
}