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

第十回 日記帳のファイル操作 最終行でDownLoad

八回までで作成したカレンダーの応用として日記帳をつくってみよう。今回は全く画面と仕様の説明でして、次回にプログラムを書き込みます。プログラムを書き込んだりHTTP化するのって、結構、プログラムを作るよりシンドイってのが私の実感です。日記帳の画面構成は写真のようにカレンダーとテキストフィールドとが並んで表示されていて、カレンダー操作は、以前作成した操作そのままであり、年月日表示ラベルの日記データがあれば、それをテキストフィールドに表示する。

日記データはテキストデータのみに対応していて、クリップボードに対応している。
データ構造はプログラムのフォルダーの中に年のフォルダーが作られる。
ファイル名は[年月日.txt]となっているので、2003年5月15日の日記データは2003フォルダーに20050515.txtとして作成される。
日記が表示される条件
以上の時にもしその年月日のデータ(日記記録)があれば表示されるようにする。
ファイル操作関数を作成する
現在表示されている日記の内容を保存する
現在とは newvlab_000 (年月日タイトルラベル)に表示されている年月日をいう
表示領域はcaltext_000である。
保存は年のディレクトリに年月日.txtの形式で保存される。
 即ちnewvlab_000 が"2003/05/26"ならば2003\20030526.txtで保存される
 split関数は文字列"2003/05/26"を"2003", "05", "26" の3つの文字列に分解する
void save_file(void)
{
    char *sp[5];
    char dttl[20],fname[20];
    WSCstring data_space;
    data_space=caltext_000->getString();
    if(data_space.getChars()>0){
        WSCvariant ttl=(newvlab_000->getProperty(WSNlabelString));
        strcpy(dttl,ttl);
        split(dttl,'/',sp);
        if( (chdir(sp[0]))==(-1)){
            mkdir(sp[0]);
            chdir(sp[0]);
        }
        sprintf(fname,"%s%s%s.txt",sp[0],sp[1],sp[2]);
        if(WSGFreplaceTextFile((WSCstring)fname,data_space,False)!=WS_NO_ERR){
            WSCmessageDialog* msg=WSGIappMessageDialog();
            msg->setProperty(WSNlabelString,"ファイルの書き込みに失敗しました\n");
            msg->popup();
        }else chdir("..\\");
    }
}
現在表示されている日記の内容をファイルから取得し表示する。
表示領域はcaltext_000である。
現在とは newvlab_000 (年月日タイトルラベル)に表示されている年月日をいう
データは年のディレクトリに年月日.txtの形式で保存される。
 即ちnewvlab_000 が"2003/05/26"ならば2003\20030526.txtを参照する
参照されたデータは表示領域に表示されるが、データが存在しないときは表示領域はクリアされる。
 split関数は文字列"2003/05/26"を"2003", "05", "26" の3つの文字列に分解する
void load_file(void)
{
    char *sp[5];
    char dttl[20],fname[36];
    WSCstring data_space;
    WSCvariant ttl=(newvlab_000->getProperty(WSNlabelString));
    strcpy(dttl,ttl);
    split(dttl,'/',sp);
    sprintf(fname,"%s%s%s.txt",sp[0],sp[1],sp[2]);
    caltext_000->setProperty(WSNuserString,fname);
    sprintf(fname,"%s\\%s%s%s.txt",sp[0],sp[0],sp[1],sp[2]);
    if(WSGFcheckExistFile(fname)!=True){
        caltext_000->setProperty(WSNlabelString,"\0");
    }else{
        data_space = *WSGFreadTextFile((WSCstring)fname);
        caltext_000->setProperty(WSNlabelString,data_space.getString());
    }
}
split関数については説明は不要だろう。
int split(char *dat,char delimita,char *a[])
{
    int i,l,cnt=0;
    char *p,flag;
    l=strlen(dat);
    p=dat;
    a[cnt]=p;
    for(i=0;i<l;i++){
        flag=0;
        if(dat[i]==delimita){
            dat[i]='\0';flag=1;
            p++;
            a[++cnt]=p;
        }
        if(flag==0) p++;
    }
    return(cnt);
}

とりあえずこのプログラムを圧縮ファイルとしておく Calender.lzh