DialogBox で成績データの管理

DialogBox を使って簡単な成績データの管理プログラムを作成します。

前田稔(Maeda Minoru)の超初心者のプログラム入門

プロジェクトの設定

  1. 新規プロジェクト(Dlgmark)を作成します。
    [プロジェクト][リソースの追加][Dialog][新規作成]で DialogBoxを作成します。
    プロジェクトと DialogBox の作成方法は タイトルバーに時刻を表示する を参照して下さい。
  2. ページ先頭の画像を参考にして[EditControl]と[ScrollBar]と[Button]を配置して下さい。
    今回はメッセージのボックス(Text Box)は不要です。
    次の表に合わせて「キャプションとID」を設定して下さい。
    BOXキャプションID
    DialogBox 成績データ IDD_DIALOG1
    EditBox 学籍番号 IDC_EDIT1
    EditBox 名前 IDC_EDIT2
    EditBox 数学 IDC_EDIT3
    EditBox 英語 IDC_EDIT4
    EditBox C言語 IDC_EDIT5
    Button 更新 IDC_UPD
    Button 追加 IDC_INS
    Button 削除 IDC_DEL
    Button 終了 IDCANCEL
    ScrollBar IDC_SCROLLBAR1
    TextBox ScrollBarの値IDC_NO
  3. テスト用の成績データファイルを seiseki.txt の名前でフォルダーに格納して下さい。
    Edit Box に表示するデータ形式は文字列で、文字列の終わりには \0 を置かなければなりません。
    そのために、各項目の後には「1バイトのスペース」を確保しています。
    下の表ではわかりにくいと思いますが、最後の点数の後にも1バイトのスペースを確保しています。
    010 愛知  真唯子    100 100 100 
    020 青森  孝雄        0   0   0 
    030 秋田  景子       10  10  10 
    040 石川  雅夫       20  20  20 
    050 茨城  優子       30  30  30 
    060 岩手  あゆみ     40  40  40 
    070 愛媛  和子       50  50  50 
    080 大分  慎吾       60  60  60 
    090 大阪  恵         70  70  70 
    100 岡山  英子       80  80  80 
    110 沖縄  妙子       90  90  90 
    120 香川  祐子       10  20  30 
    130 鹿児島  浩司     40  50  60 
    140 神奈川  真路     70  80  90 
    150 岐阜  真実       68  70  85 
    160 京都  智史       75  95  84 
    170 熊本  志保       63  47  80 
    180 群馬  健一       92  98  84 
    190 高知  優子       35  56  78 
    200 埼玉  隆         68  48  79 
    210 佐賀  紀恵       68  76  95 
    220 滋賀  佳奈子     87  85  78 
    230 静岡  志依       98  78  85 
    240 島根  紀夫       68  79  57 
    250 千葉  泉         79  57  84 
    260 東京  拓生       67  85  47 
    270 徳島  瞳         78  95  48 
    280 栃木  雅己       94  68  78 
    290 鳥取  雅美子     68  57  87 
    300 富山  伊織       68  97  87 
    310 長崎  英明       67  82  74 
    320 長野  政則       60  52  73 
    330 奈良  憲彦       95  76  81 
    340 新潟  浩子       86  72  73 
    350 兵庫  美佐子     81  95  70 
    360 広島  まい       95  72  64 
    370 福井  真実       78  50  49 
    380 福岡  大樹       78  84  93 
    390 福島  紳悟       75  84  92 
    400 北海道  静       78  94  76 
    410 三重  由香理     75  86  91 
    420 宮城  亜樹       80  76  92 
    430 宮崎  亜弓       78  95  72 
    440 山形  真澄       96  78  80 
    450 山口  美樹       75  73  81 
    460 山梨  優         75  81  75 
    470 和歌山  絢子     82  74  92 
    
  4. ソースプログラムをプロジェクトに追加して、ビルドに続いて実行を行います。

プログラムの説明

DialogBox を使って簡単な成績データの管理プログラムを作成します。
この種のプログラムは正規の Windows を使わなくても DialogBox だけで十分プログラムできます。
  1. 成績レコードを struct で定義して100人分の領域を確保します。
    work は編集作業用の領域です。
    g_CNT は現在のレコード件数で g_RNO は表示中のレコード番号です。
        #include    <windows.h>
        #include    "resource.h"
    
        struct  D_DEF
        {   char    num[4];
            char    name[16];
            char    ten1[4];
            char    ten2[4];
            char    ten3[4];
            char    crlf[2];
        }   DATA[100];
    
        struct D_DEF    work;
        int             g_CNT,g_RNO;
        
  2. WM_INITDIALOG: には DialogBox の初期化のときに制御が渡されます。
    InitDlg() で成績データを入力して DATA[100] に格納します。
        LRESULT CALLBACK DialogProc(HWND hDlg,UINT msg,WPARAM wParam,LPARAM lParam)
        {
            switch(msg)
            {   case WM_INITDIALOG:
                    initDlg(hDlg);
                    break;
        
  3. Botton がクリックされたときの処理です。
    ここでは処理を行う関数を呼び出すだけです。
                case WM_COMMAND:
                    switch(LOWORD(wp))
                    {   case IDCANCEL:
                            EndDialog(hDlg, IDCLOSE);
                            break;
                        case IDC_UPD:
                            Update(hDlg);
                            break;
                        case IDC_DEL:
                            id = MessageBox(hDlg,"削除しても良いですか","削除確認",
                                            MB_OKCANCEL | MB_ICONQUESTION);
                            if (id==IDOK)   Delete(hDlg);
                            break;
                        case IDC_APP:
                            Append(hDlg);
                            break;
                    }
                    break;
        
  4. ScrollBar が操作されたときの処理です。
    ScrollBar の端がプレスされたときは SB_LINELEFT:(左端), SB_LINERIGHT:(右端)に制御が渡されます。
    g_RNO は現在表示中のレコード番号で、この値をインクリメント(デクリメント)して新しいレコードを表示します。
    ScrollBar の中がクリックされたときは SB_PAGELEFT:, SB_PAGERIGHT: に制御が渡されます。
    g_RNO 値を更新して新しいレコードを表示します。
    g_RNO が範囲を超えたかの判定は Disp() で行っています。
    ScrollBar の制御は ScrollBar でレコードを選択する を参照して下さい。
                case WM_HSCROLL:
                    switch(LOWORD(wp))
                    {   case SB_LINELEFT:
                            g_RNO--;
                            break;
                        case SB_LINERIGHT:
                            g_RNO++;
                            break;
                        case SB_PAGELEFT:
                            g_RNO -= 10;
                            break;
                        case SB_PAGERIGHT:
                            g_RNO += 10;
                            break;
                        case SB_THUMBTRACK:
                            g_RNO =(int)(HIWORD(wp));
                            break;
                     }
                     Disp(hDlg);
                     break;
        
  5. DialogBox にテストデータが表示されたでしょうか?
    1. ScrollBar の右端をプレスしてみて下さい。
      表示されているデータが1レコードずつスクロールします。
    2. ScrollBar のボックス内をクリックすると一度に10レコードスクロールします。
    3. 「削除」ボタンをクリックして下さい。
      削除確認のメッセージボックスが表示されて「OK」を応答するとレコードが削除されます。
    4. 新しいデータをタイプして「追加」ボタンをクリックして下さい。
      現在表示中のレコードの直前に新しく追加されます。
    5. 修正したい項目を編集してから「修正」ボタンをクリックすると、該当する項目が修正されます。
    6. 「終了」をクリックするとプログラムが終了します。

【演習】

プログラムを完成させて下さい。
  1. 私が作成したプログラムの関数の Prototype 宣言です。
        LRESULT CALLBACK DlgProc(HWND, UINT, WPARAM, LPARAM);
        DWORD   ReadData(LPSTR fname, void *buf, DWORD len);
        void    initDlg(HWND hDlg);
        void    Disp(HWND hDlg);
        void    Select(HWND hDlg);
        void    Update(HWND hDlg);
        void    Delete(HWND hDlg);
        void    Append(HWND hDlg);
        
  2. ReadData() 関数
    Text File から成績データを入力してメモリバッファに格納します。
  3. initDlg() 関数
    成績データを入力して DATA[] に格納します。
    各アイテムの終わりに、文字列の終了を示す「¥0」を設定して下さい。
    スピンボタンの範囲(0~件数-1)を設定します。
    DialogBox に初期データを表示します。
  4. Disp() 関数
    DATA[] から g_RNO のデータを EditBox に表示して下さい。
  5. Select() 関数
    現在表示中のデータを work 構造体に格納します。
  6. Update() 関数
    work のデータを DATA[g_RNO] に格納します。
  7. Delete() 関数
    DATA[g_RNO] のデータを削除します。
    削除したデータから後部のデータを前に詰めて下さい。
  8. Append() 関数
    g_RNO の直前にデータを追加挿入します。
    g_RNO から後のデータを後ろにシフトして、挿入する場所を空けて下さい。

超初心者のプログラム入門(Win32API C++)