第十回 日記帳のファイル操作 最終行で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