24章 VisualBASIC感覚でSDKプログラミング(その2)

<html>

<head>
<meta http-equiv="Content-Type" content="text/html; charset=shift_jis"></meta>
<title>24章 VisualBASIC感覚でSDKプログラミング(その2)</title>
</head>

<body bgcolor="WHITE">
<font size="5">24章 VisualBASIC感覚でSDKプログラミング(その2)</font>
<hr>
<p align="CENTER">
<p>
 今回は、前章でダウンロードして使用していただいたテキスト型データーベースである簡易スケジューラーの全ソースを公開します。
<p>
 この中で、個々のコントロールからのメッセージを受け取り、個々のコントロールの状態を取得したりする事を学びます。きっと、<b><u><i>事象駆動型アプリケーションの煩雑さに驚くでしょう</i></u></b>。そして、これは、<b><u><i>VisualBASICにも全く同様の事が言えるのです</i></u></b>。<p>
 では、ソースコードを眺めてみましょう。拡張子がcのファイルのみ載せます。全てのコードが見たい方は<a href="chap23.lzh">ダウンロード</a>してください。
<hr>
<p>
<p>
<b>
・winmain.c
</b>
<p>
<table border="1" bgcolor="#F0F0F0">
<caption align="BOTTOM">リスト24-1
<tr><td>
<pre>
/* C言語で始めるWindowsプログラミング */
/* 23章のサンプルプログラム */
/* Programmed by Y.Kondo */
/* 注:TABサイズは4で見てください */

#define STRICT
#include &lt;windows.h&gt;
#include &lt;stdio.h&gt;
#include &lt;stdlib.h&gt;
#include &lt;direct.h&gt;
#include &lt;io.h&gt;
#include "resource.h"
#include "other.h"
#include "delete.h"

/* メインウインドウとなるダイアログボックスのダイアログプロシージャのプロトタイプ宣言 */
extern BOOL CALLBACK MainWindowProc(HWND,UINT,WPARAM,LPARAM);

/* このファイルでのグローバル変数 */
HINSTANCE hInst;

/* アプリケーションエントリーポイント */
int WINAPI WinMain(HINSTANCE hInstance,
                 HINSTANCE    hPrevInstance,
                  LPSTR        CmdLine,
                  int          CmdShow)
{
  struct  _finddata_t c_file;
   long    hFile;
   char    fullfilename[13];

  /*  インスタンスハンドルをファイル内でグローバルに持つ  */
   hInst=hInstance;

  _mkdir(".\\database");  /*  エラーがあってもとにかく作る    */
   _chdir(".\\database");  /*  カレントディレクトリを変更する  */

  /*  過ぎ去った予定を削除する:ここから  */
   if(-1!=(hFile=_findfirst("20*.txt",&c;_file)))
   {
       char*   filename;   /*  .txtを取ったファイル名  */  
       filename=strtok(c_file.name,".");
       if((c_file.attrib==_A_NORMAL | | c_file.attrib==_A_ARCH) 
           &amp;&amp; strcmp(filename,NowDate1())&lt;0 &amp;&amp; strlen(filename)==8)
       {
           sprintf(fullfilename,"%s.txt",filename);
           unlink(fullfilename);
       }
       while(_findnext(hFile,&c;_file)==0)
       {
           filename=strtok(c_file.name,".");
           if((c_file.attrib==_A_NORMAL | | c_file.attrib==_A_ARCH) 
               &amp;&amp; strcmp(filename,NowDate1())&lt;0 &amp;&amp; strlen(filename)==8)
           {
               sprintf(fullfilename,"%s.txt",filename);
               unlink(fullfilename);
           }
       }
       _findclose(hFile);
   }
   /*  過ぎ去った予定を削除する:ここまで  */
   
   /*  ここでメインウインドウを開ける  */
   DialogBox(hInst,MAKEINTRESOURCE(IDD_DIALOG1),NULL,(DLGPROC)MainWindowProc);

  _chdir("..\\");         /*  カレントディレクトリを元に戻す  */
   return  0;
}

/* メインウインドウとなるダイアログボックスのダイアログプロシージャで用いられる関数の
                                                          プロトタイプ宣言    */
static BOOL Wm_InitDialogProc(HWND);
static BOOL Wm_CommandProc(HWND,WORD,WORD,HWND);
static BOOL Wm_CloseProc(HWND);
static void InitInput(HWND);
/* メインウインドウとなるダイアログボックスのダイアログプロシージャ */
BOOL CALLBACK MainWindowProc(HWND hwnd,UINT msg,WPARAM wparam,LPARAM lparam)
{
  switch(msg)
   {
       /*  ダイアログボックス初期化    */
       case    WM_INITDIALOG:
           return  Wm_InitDialogProc(hwnd);
       /*  コントロールに応答          */
       case    WM_COMMAND:
           return  Wm_CommandProc(hwnd,HIWORD(wparam),LOWORD(wparam),(HWND)lparam);
       /*  終了ボタンに対応    */
       case    WM_CLOSE:
           Wm_CloseProc(hwnd);
           return  TRUE;
   }
   return  FALSE;
}

/* メインウインドウとなるダイアログボックスの初期化 */
static BOOL Wm_InitDialogProc(HWND hwnd)
{
  int     year;
   int     month;
   int     day;
   char    buf[5];
   struct  _finddata_t c_file;
   long    hFile;

  /*  コンボボックスに候補を入れる:ここから  */  
   for(year=2002;year&lt;=2030;year++)
   {
       sprintf(buf,"%04d",year);
       SendDlgItemMessage(hwnd,IDC_COMBO1,CB_ADDSTRING,0,(LPARAM)buf);
   }
   for(month=1;month&lt;=12;month++)
   {
       sprintf(buf,"%02d",month);
       SendDlgItemMessage(hwnd,IDC_COMBO2,CB_ADDSTRING,0,(LPARAM)buf);
   }
   for(day=1;day&lt;=31;day++)
   {
       sprintf(buf,"%02d",day);
       SendDlgItemMessage(hwnd,IDC_COMBO3,CB_ADDSTRING,0,(LPARAM)buf);
   }
   /*  コンボボックスに候補を入れる:ここまで  */

  /*  リストボックスに登録されている日付を入れる:ここから    */
   if(-1!=(hFile=_findfirst("20*.txt",&c;_file)))
   {
       char*   filename;   /*  .txtを取ったファイル名  */  
       filename=strtok(c_file.name,".");
       if((c_file.attrib==_A_NORMAL | | c_file.attrib==_A_ARCH) 
           &amp;&amp; strcmp(filename,NowDate1())&gt;=0 &amp;&amp; strlen(filename)==8)
           SendDlgItemMessage(hwnd,IDC_LIST1,LB_ADDSTRING,0,
               (LPARAM)ForListBoxDateType(filename));
       while(_findnext(hFile,&c;_file)==0)
       {
           filename=strtok(c_file.name,".");
           if((c_file.attrib==_A_NORMAL | | c_file.attrib==_A_ARCH) 
               &amp;&amp; strcmp(filename,NowDate1())&gt;=0 &amp;&amp; strlen(filename)==8)
               SendDlgItemMessage(hwnd,IDC_LIST1,LB_ADDSTRING,0,
                   (LPARAM)ForListBoxDateType(filename));
       }
       _findclose(hFile);
   }
   /*  リストボックスに登録されている日付を入れる:ここまで    */          

  /*  今日の予定があれば、メッセージボックスで警告する:ここから  */
   if(-1!=(hFile=_findfirst("20*.txt",&c;_file)))
   {
       char*   filename;   /*  .txtを取ったファイル名  */  
       filename=strtok(c_file.name,".");
       if((c_file.attrib==_A_NORMAL | | c_file.attrib==_A_ARCH) 
           &amp;&amp; strcmp(filename,NowDate1())==0 &amp;&amp; strlen(filename)==8)
       {
           MessageBox(hwnd,"今日は予定が入っています!","注意",MB_OK|MB_ICONINFORMATION);
           /*  先頭(今日)の予定を選択する    */
           SendDlgItemMessage(hwnd,IDC_LIST1,LB_SETCURSEL,0,0);
       }
       _findclose(hFile);
   }
   return  FALSE;
}

/* コントロールに応答する関数 */
static BOOL Wm_CommandProc(HWND hwnd,WORD wNotifyCode,WORD wID,HWND hwndCtl)
{
  /*========================================================================================*/
   if(wID==IDC_LIST1 &amp;&amp; wNotifyCode==LBN_DBLCLK)
   {   /*  リストボックスがダブルクリックされた場合    */
       char    buf[11];    /*  リストボックスからの文字列の取得用  */
       char*   filename;
       int     CurrentPos;
       FILE    *fp;
       int     filesize;
       char*   textbuffer;
       char*   forcombostring;

      CurrentPos=SendDlgItemMessage(hwnd,IDC_LIST1,LB_GETCURSEL,0,0);
       SendDlgItemMessage(hwnd,IDC_LIST1,LB_GETTEXT,CurrentPos,(LPARAM)buf);
       filename=ForFileType((ForDateFileType(buf)));   /*ここまででロードするファイル名を作成する*/

      /*  ロードする  */
       filesize=GetBufferSize(filename);
       textbuffer=malloc(filesize+1);
       fp=fopen(filename,"rb");
       fread(textbuffer,1,filesize,fp);
       fclose(fp);
       textbuffer[filesize]='\0';
       SendDlgItemMessage(hwnd,IDC_EDIT1,WM_SETTEXT,0,(LPARAM)textbuffer);
       free(textbuffer);

      /*  コンボボックスの設定    */
       forcombostring=strtok(buf,"/");
       SendDlgItemMessage(hwnd,IDC_COMBO1,CB_SELECTSTRING ,0,(LPARAM)forcombostring);
       forcombostring=strtok(NULL,"/");
       SendDlgItemMessage(hwnd,IDC_COMBO2,CB_SELECTSTRING ,0,(LPARAM)forcombostring);
       forcombostring=strtok(NULL,"/");
       SendDlgItemMessage(hwnd,IDC_COMBO3,CB_SELECTSTRING ,0,(LPARAM)forcombostring);
   }
   /*========================================================================================*/
   else if((wID==IDC_COMBO1 | | wID==IDC_COMBO2 | | wID==IDC_COMBO3) &amp;&amp; wNotifyCode==CBN_SELCHANGE )
   {   /*  3つのどれかのコンボボックスが変更された場合    */
       /*  日付に変更があれば、元のファイルをロードする    */
       LONG    indexyear;
       LONG    indexmonth;
       LONG    indexday;
       LONG    item;
       char    year[5];
       char    month[3];
       char    day[3];

      /*  コンボボックスに空白が無いか調べる  */
       indexyear=SendDlgItemMessage(hwnd,IDC_COMBO1,CB_GETCURSEL,0,0);
       indexmonth=SendDlgItemMessage(hwnd,IDC_COMBO2,CB_GETCURSEL,0,0);
       indexday=SendDlgItemMessage(hwnd,IDC_COMBO3,CB_GETCURSEL,0,0);
       if(indexyear==CB_ERR | | indexmonth==CB_ERR | | indexday==CB_ERR)
           return  TRUE;
       
       /*  コンボボックスの文字列を取得する    */
       SendDlgItemMessage(hwnd,IDC_COMBO1,CB_GETLBTEXT,indexyear,(LPARAM)year);
       SendDlgItemMessage(hwnd,IDC_COMBO2,CB_GETLBTEXT,indexmonth,(LPARAM)month);
       SendDlgItemMessage(hwnd,IDC_COMBO3,CB_GETLBTEXT,indexday,(LPARAM)day);

      /*  リストボックスに該当するものが無いか調べる  */
       if((item=SendDlgItemMessage(hwnd,IDC_LIST1,LB_FINDSTRING,0,(LPARAM)ToListBoxStyle(year,month,day)))!=LB_ERR)
       {   /*  該当する予定日があった場合  */
           FILE    *fp;
           char*   filename;
           LONG    filesize;
           char*   textbuffer;

          /*  ロードする  */
           filename=ForFileType(ForDateFileType(ToListBoxStyle(year,month,day)));
           filesize=GetBufferSize(filename);
           textbuffer=malloc(filesize+1);
           fp=fopen(filename,"rb");
           fread(textbuffer,1,filesize,fp);
           fclose(fp);
           textbuffer[filesize]='\0';
           SendDlgItemMessage(hwnd,IDC_EDIT1,WM_SETTEXT,0,(LPARAM)textbuffer);
           free(textbuffer);
       }
       else
       {
           if(SendDlgItemMessage(hwnd,IDC_EDIT1,WM_GETTEXTLENGTH,0,0)!=0)
               if(MessageBox(hwnd,"該当する日にちは、登録されていません\r\n"
                                   "予定項目画面を消去しますか?","メッセージ",
                                   MB_YESNO|MB_ICONQUESTION)==IDYES)
                   SendDlgItemMessage(hwnd,IDC_EDIT1,WM_SETTEXT,0,(LPARAM)"");
       }
   }
   /*========================================================================================*/
   else if(wID==IDC_BUTTON1 &amp;&amp; wNotifyCode==BN_CLICKED)
   {   /*  登録ボタンが押された場合    */
       FILE    *fp;
       char*   filename;
       LONG    filesize;
       char*   textbuffer;
       LONG    indexyear;
       LONG    indexmonth;
       LONG    indexday;
       char    year[5];
       char    month[3];
       char    day[3];

      /*  コンボボックスに空白が無いか調べる  */
       indexyear=SendDlgItemMessage(hwnd,IDC_COMBO1,CB_GETCURSEL,0,0);
       indexmonth=SendDlgItemMessage(hwnd,IDC_COMBO2,CB_GETCURSEL,0,0);
       indexday=SendDlgItemMessage(hwnd,IDC_COMBO3,CB_GETCURSEL,0,0);
       if(indexyear==CB_ERR | | indexmonth==CB_ERR | | indexday==CB_ERR)
       {
           MessageBox(hwnd,"予定日を選択してください","注意",MB_OK|MB_ICONEXCLAMATION);
           return  TRUE;
       }
       /*  エディットコントロールから文字列を取得する  */

      <b>/*  BUG
       filesize=SendDlgItemMessage(hwnd,IDC_EDIT1,WM_GETTEXTLENGTH,0,0)+1;
       textbuffer=malloc(filesize);
       SendDlgItemMessage(hwnd,IDC_EDIT1,WM_GETTEXT,filesize,(LPARAM)textbuffer);
       */

      /*  BEGIN DEBUG */
       filesize=SendDlgItemMessage(hwnd,IDC_EDIT1,WM_GETTEXTLENGTH,0,0);
       textbuffer=malloc(filesize+1);
       SendDlgItemMessage(hwnd,IDC_EDIT1,WM_GETTEXT,filesize+1,(LPARAM)textbuffer);
       /*  END   DEBUG */</b>

      /*  ファイル名を作成する    */
       SendDlgItemMessage(hwnd,IDC_COMBO1,CB_GETLBTEXT,indexyear,(LPARAM)year);
       SendDlgItemMessage(hwnd,IDC_COMBO2,CB_GETLBTEXT,indexmonth,(LPARAM)month);
       SendDlgItemMessage(hwnd,IDC_COMBO3,CB_GETLBTEXT,indexday,(LPARAM)day);
       /*  過去は予約できない  */
       if(strcmp(ToListBoxStyle(year,month,day),NowDate2())&lt;0)
       {
           MessageBox(hwnd,"過去は予約できません","(笑)",MB_OK|MB_ICONSTOP);
           free(textbuffer);
           return  TRUE;
       }
       /*  ファイルに書き込む:ここから    */
       filename=ForFileType(ForDateFileType(ToListBoxStyle(year,month,day)));
       fp=fopen(filename,"wb");
       fwrite(textbuffer,1,filesize,fp);
       fclose(fp);
       free(textbuffer);
       /*  ファイルに書き込む:ここまで    */
       /*  リストボックスに追加する    */
       if(SendDlgItemMessage(hwnd,IDC_LIST1,LB_FINDSTRING,0,(LPARAM)ToListBoxStyle(year,month,day))==LB_ERR)
           SendDlgItemMessage(hwnd,IDC_LIST1,LB_ADDSTRING,0,(LPARAM)ToListBoxStyle(year,month,day));
       /*  予定日コンボボックスと予定エディットコントロールを初期化    */
       InitInput(hwnd);
   }
   /*========================================================================================*/
   else if(wID==IDC_BUTTON2 &amp;&amp; wNotifyCode==BN_CLICKED)
   {   /*  削除ボタンが押された場合    */
       /*  リストボックスで選択されている項目を削除する    */
       char    selecteditem[11];
       char    itemstring[11];
       char*   fullfilename;
       int     index;
       LONG    comboindex1;    /*  年  */
       LONG    comboindex2;    /*  月  */
       LONG    comboindex3;    /*  日  */

      /*  削除する項目が選ばれていない場合    */
       index=SendDlgItemMessage(hwnd,IDC_LIST1,LB_GETCURSEL,0,0);
       if(index==LB_ERR)
       {
           MessageBox(hwnd,"削除する項目を選んでください","警告",MB_OK|MB_ICONEXCLAMATION);
           return  TRUE;
       }
       /*  削除:ここから  */
       SendDlgItemMessage(hwnd,IDC_LIST1,LB_GETTEXT,index,(LPARAM)itemstring);
       fullfilename=ForFileType(ForDateFileType(itemstring));
       /*  内容を表示し、削除の確認を求める    */
       if(DialogBoxParam(hInst,MAKEINTRESOURCE(IDD_DIALOG2),hwnd,(DLGPROC)DeleteWindowProc,(LPARAM)fullfilename)==IDOK)
       {
           /*  現在登録中の項目を削除しようとした場合  */
           comboindex1=SendDlgItemMessage(hwnd,IDC_COMBO1,CB_GETCURSEL ,0,0);
           comboindex2=SendDlgItemMessage(hwnd,IDC_COMBO2,CB_GETCURSEL ,0,0);
           comboindex3=SendDlgItemMessage(hwnd,IDC_COMBO3,CB_GETCURSEL ,0,0);
           if(comboindex1!=CB_ERR &amp;&amp; comboindex2!=CB_ERR &amp;&amp; comboindex3!=CB_ERR)
           {
               char    year[5];
               char    month[3];
               char    day[3];
               char    yyyymmdd[11];
               SendDlgItemMessage(hwnd,IDC_COMBO1,CB_GETLBTEXT,comboindex1,(LPARAM)year);
               SendDlgItemMessage(hwnd,IDC_COMBO2,CB_GETLBTEXT,comboindex2,(LPARAM)month);
               SendDlgItemMessage(hwnd,IDC_COMBO3,CB_GETLBTEXT,comboindex3,(LPARAM)day);
               sprintf(yyyymmdd,"%s/%s/%s",year,month,day);
               SendDlgItemMessage(hwnd,IDC_LIST1,LB_GETTEXT,index,(LPARAM)selecteditem);
               if(!strcmp(yyyymmdd,selecteditem))
                   InitInput(hwnd);    /*  入力コントロールも初期化する    */
           }
           unlink(fullfilename);                                       /*  ファイルを削除  */
           SendDlgItemMessage(hwnd,IDC_LIST1,LB_DELETESTRING,index,0); /*  リストボックスから削除  */
           InitInput(hwnd);    /*  予定日コンボボックスと予定エディットコントロールを初期化    */
       }
       /*  削除:ここまで  */
   }
   return  TRUE;
}

/* アプリケーションを閉じるときの確認の関数 */
static BOOL Wm_CloseProc(HWND hwnd)
{
  if(MessageBox(hwnd,"簡易スケジューラーを終了しますか?","警告",MB_YESNO|MB_ICONEXCLAMATION)==IDYES)
       EndDialog(hwnd,IDOK);

  return  TRUE;
}

/* 予定日コンボボックスと予定エディットコントロールを初期化する関数 */
static void InitInput(HWND hwnd)
{
  /*  コンボボックスを初期化する  */
   SendDlgItemMessage(hwnd,IDC_COMBO1,CB_SETCURSEL,(WPARAM)-1,0);
   SendDlgItemMessage(hwnd,IDC_COMBO2,CB_SETCURSEL,(WPARAM)-1,0);
   SendDlgItemMessage(hwnd,IDC_COMBO3,CB_SETCURSEL,(WPARAM)-1,0);
   /*エディットコントロールを初期化する    */
   SendDlgItemMessage(hwnd,IDC_EDIT1,WM_SETTEXT,0,(LPARAM)"");
}</pre>
</table>
<hr>
<p>
<b>
・delete.c
</b>
<p>
<table border="1" bgcolor="#F0F0F0">
<caption align="BOTTOM">リスト24-2
<tr><td>
<pre>
/* C言語で始めるWindowsプログラミング */
/* 23章のサンプルプログラム */
/* Programmed by Y.Kondo */
/* 注:TABサイズは4で見てください */

#define STRICT
#include &lt;windows.h&gt;
#include &lt;stdio.h&gt;
#include &lt;stdlib.h&gt;
#include &lt;io.h&gt;
#include "resource.h"
#include "delete.h"
#include "other.h"


/* 削除確認となるダイアログボックスのダイアログプロシージャで用いられる関数の
                                                          プロトタイプ宣言    */
static BOOL Wm_InitDialogProc(HWND,const char*);
static BOOL Wm_CommandProc(HWND,WORD,WORD,HWND);

/* 削除確認ダイアログボックスのダイアログプロシージャ */
BOOL CALLBACK DeleteWindowProc(HWND hwnd,UINT msg ,WPARAM wparam,LPARAM lparam)
{
  switch(msg)
   {
   case    WM_INITDIALOG:
           return  Wm_InitDialogProc(hwnd,(const char*)lparam);
       case    WM_COMMAND:
           return  Wm_CommandProc(hwnd,HIWORD(wparam),LOWORD(wparam),(HWND)lparam);
   }
   return  FALSE;
}

/* ダイアログボックスの初期化 */
static BOOL Wm_InitDialogProc(HWND hwnd,const char* filename)
{
  FILE    *fp;
   int     filesize;
   char*   textbuffer;

  filesize=GetBufferSize(filename);
   textbuffer=malloc(filesize+1);
   fp=fopen(filename,"rb");
   fread(textbuffer,1,filesize,fp);
   fclose(fp);
   textbuffer[filesize]='\0';
   SendDlgItemMessage(hwnd,IDC_EDIT1,WM_SETTEXT,0,(LPARAM)textbuffer);
   free(textbuffer);
   return  FALSE;
}

/* コントロールに応答する関数 */
static BOOL Wm_CommandProc(HWND hwnd,WORD wNotifyCode,WORD wID,HWND hwndCtl)
{
  if(wID==IDOK &amp;&amp; wNotifyCode==BN_CLICKED)
       EndDialog(hwnd,wID);
   else if(wID==IDCANCEL &amp;&amp; wNotifyCode==BN_CLICKED)
       EndDialog(hwnd,wID);
   return  TRUE;
}
</pre>
</table>
<hr>
<p>
<b>
・other.c
</b>
<p>
<table border="1" bgcolor="#F0F0F0">
<caption align="BOTTOM">リスト24-3
<tr><td>
<pre>
/* C言語で始めるWindowsプログラミング */
/* 23章のサンプルプログラム */
/* Programmed by Y.Kondo */
/* 注:TABサイズは4で見てください */

#include &lt;stdio.h&gt;
#include &lt;time.h&gt;
#include &lt;io.h&gt;
#include "other.h"

/* 今日の年を4桁の数字で返す関数 */
char* NowYear(void)
{
  static  char    ret[5];
   char    date[9];
   _strdate(date);
   sprintf(ret,"20%c%c",date[6],date[7]);
   return  ret;
}

/* 今日の月を2桁の数字で返す関数 */
char* NowMonth(void)
{
  static  char    ret[3];
   char    date[9];
   _strdate(date);
   sprintf(ret,"%c%c",date[0],date[1]);
   return  ret;
}

/* 今日の日を2桁の数字で返す関数 */
char* NowDay(void)
{
  static  char    ret[3];
   char    date[9];
   _strdate(date);
   sprintf(ret,"%c%c",date[3],date[4]);
   return  ret;
}

/* 今日の日にちをyyyymmdd形式の文字列で返す関数 */
char* NowDate1(void)
{
  static  char    ret[9];
   sprintf(ret,"%s%s%s",NowYear(),NowMonth(),NowDay());
   return  ret;
}

/* 今日の日にちをyyyy/mm/dd形式の文字列で返す関数 */
char* NowDate2(void)
{
  static  char    ret[11];
   sprintf(ret,"%s/%s/%s",NowYear(),NowMonth(),NowDay());
   return  ret;
}

/* yyyymmdd形式の文字列をyyyy/mm/dd形式にする関数 */
char* ForListBoxDateType(const char* date)
{
  static  char    ret[11];
   sprintf(ret,"%c%c%c%c/%c%c/%c%c",
               date[0],date[1],date[2],date[3],
               date[4],date[5],
               date[6],date[7]);
   return  ret;
}

/* yyyy/mm/dd形式の文字列をyyyymmdd形式にする関数 */
char* ForDateFileType(const char* date)
{
  static  char    ret[9];
   sprintf(ret,"%c%c%c%c%c%c%c%c",
               date[0],date[1],date[2],date[3],
               date[5],date[6],
               date[8],date[9]);
   return  ret;
}

/* yyyymmdd形式の文字列を、ファイル名yyyymmdd.txtに変換する */
char* ForFileType(const char* date)
{
  static  char    ret[13];
   sprintf(ret,"%s.txt",date);
   return  ret;
}

/* ファイルサイズを取得する関数 */
/* 戻り値が-1ならエラー */
int GetBufferSize(const char* fullfilename)
{
  struct  _finddata_t c_file;
   long    hFile;
   int     ret=-1;
   
   if(-1!=(hFile=_findfirst(fullfilename,&c;_file)))
   {
       ret=c_file.size;
       _findclose(hFile);
   }
   return  ret;
}

/* yyyy/mm/dd形式にする関数 */
char* ToListBoxStyle(const char* year,const char* month, const char* day)
{
  static  char    ret[11];
   sprintf(ret,"%s/%s/%s",year,month,day);
   return  ret;
}
</pre>
</table>
<hr>
<p>
 まず、画面の単純さからして、ソースコードに圧倒されますね。<br>
 もっと単純なソースコードを期待していたのではありませんか?<br>
 これが、事象駆動型アプリケーションのプログラムの難しさです。つまり、<b><u><i>オペレーターが決まった順序で入力してくれない事を前提としている</i></u></b>からです。つまり、予定が登録されている日にちに知らずに、“新規の予定”と思い、入力してくるかもしれないし、削除候補を選ばずに削除ボタンを押すかもしれません。
<p>
 しかし、これでも、自前でウインドウクラスを登録し、メッセージループを書く手間は省かれています。これが、VisualBASIC感覚でSDKプログラミングのゆえんです。
<p>
 次章では、個々の事象にどのように対処しているのか、詳しく見ていきましょう。

<hr>
<p align="RIGHT">
2002年7月2日<br>
修正2002年7月9日<br>
修正2002年7月17日<br>
<hr>
<p align="RIGHT">
<a href="/web/20160504210631/http://web.kyoto-inet.or.jp:80/people/ysskondo/index.html">目次</a><br>
<a href="chap25.html">次へ</a>
<hr>
<p align="RIGHT">
著作権者:近藤妥

</body>
</html>

  • 最終更新:2018-03-11 05:14:40

このWIKIを編集するにはパスワード入力が必要です

認証パスワード