DialogBox で表示



成績データベースのレコードをスピンボタンで切り替えて DialogBox に表示します。

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

プログラムの説明

  1. あらかじめ成績データベースを作成して MySQL を起動して下さい。
    詳細は データベースにコネクト を参照して下さい。
    クライアントとサーバーが同じマシンの時は、事前に立ち上げなくても接続できるようです。
  2. ページ先頭の画像を参考にして DialogBox を作成して下さい。
    DialogBox のキャプションとIDです。
    Button は使わないので、無くても差し支えありません。
    BOXキャプションID
    DialogBox レコード番号 IDD_DIALOG1
    EditBox 学籍番号IDC_EDIT1
    EditBox 名前 IDC_EDIT2
    EditBox 数学 IDC_EDIT3
    EditBox 英語 IDC_EDIT4
    EditBox C言語 IDC_EDIT5
    SpinButton IDC_SPIN1
  3. MySQL のプログラムは、mysql.h をインクルードして libmysql.lib をリンクします。
    szDB はデータベースの名前で、szSQL は発行するクエリです。
    myData が MYSQL のオブジェクトのポインタです。
    res は SQL 文の実行結果のオブジェクトを格納する領域です。
    Count は抽出されたレコード件数です。
    row はレコードのアイテムを取得する領域です。
    g_hSpin は Spin Button の Handle です。
    g_Pos は現在 DialogBox に表示中のレコード番号です。
        /***************************************************************/
        /*★ MySQL で抽出したレコードを Spin で切り替える    前田 稔 ★*/
        /***************************************************************/
        #include    <windows.h>
        #include    <commctrl.h>
        #include    <mysql.h>
        #include    "resource.h"
        #pragma     comment(lib,"libmysql.lib")
    
        // 使用するデータベース
        #define     szDB    "mark"
        // 発行するクエリー
        #define     szSQL   "SELECT * FROM mark_table WHERE name LIKE '%子%'"
    
        // MYSQLの定義
        MYSQL       *myData;            // MySQL の Object
        MYSQL_RES   *res;               // クエリーの Object
        UINT        Count;              // Record 件数
        MYSQL_ROW   row;                // ITEM の領域
    
        // DialogBox の制御領域
        HWND        g_hSpin;            // Spin Handle
        UINT        g_Pos;              // 現在表示中のレコード
        
  4. MySQL を初期化してサーバーに接続します。
    失敗したときは、メッセージを表示してプログラムを終了します。
    mysql_query() でクエリーを発行します。
    今回は名前に「子」が付くレコードを抽出しました。
        //★ Windows MAIN 関数
        int APIENTRY WinMain(HINSTANCE hInst, HINSTANCE, LPSTR, int)
        {
            // MYSQLに接続
            if (!((myData=mysql_init((MYSQL*)0)) && 
                   mysql_real_connect(myData,NULL,NULL,NULL,NULL,MYSQL_PORT,NULL,0)))
            {   MessageBox(NULL,"Init and Connect Error","MySQL Error",MB_OK);
                mysql_close(myData);
                return FALSE;
            }
    
            // データベースを選択
            if (mysql_select_db(myData,szDB)<0)
            {   MessageBox(NULL,"Select Database(mark) Error","MySQL Error",MB_OK);
                mysql_close(myData);
                return FALSE;
            }
    
            // SQL文を発行
            if (mysql_query(myData,szSQL))
            {   MessageBox(NULL,"Query Execute Error","MySQL Error",MB_OK);
                mysql_close(myData);
                return FALSE;
            }
        
  5. 実行結果を res に、その件数を Count に取得します。
    データベースの準備が出来ると DialogBox を表示します。
    DialogBox が終了すると MySQL を閉じて終了します。
            // 結果の取得
            res= mysql_store_result(myData);
            // 件数の取得
            Count= (int)mysql_num_rows(res);
    
            // DialogBox を表示する
            DialogBox(hInst,MAKEINTRESOURCE(IDD_DIALOG1),NULL,(DLGPROC)DialogProc);
    
            // プログラムの終了
            mysql_free_result(res);
            mysql_close(myData);
            return TRUE;
        }
        
  6. CALLBACK 関数です。
    WM_INITDIALOG で DialogBox の初期化を行います。
    SpinButton を設定して、最初のレコードを表示します。
        //★ CALLBACK 関数
        LRESULT CALLBACK DialogProc(HWND hDlg,UINT msg,WPARAM wParam,LPARAM lParam)
        {
            switch (msg)
            {   case WM_INITDIALOG:
                    g_hSpin= GetDlgItem(hDlg,IDC_SPIN1);
                    SendMessage(g_hSpin,UDM_SETRANGE,0,MAKELPARAM(0L,Count-1));
                    g_Pos= 0;
                    View(hDlg,g_Pos);
                    break;
        
  7. SpinButton をクリックすると WM_VSCROLL がポストされて来ます。
    レコード番号を確認して View() 関数で表示します。
                case WM_VSCROLL:
                    if ((HWND)lParam==g_hSpin)
                    {   if (HIWORD(wParam)<Count)
                        {   g_Pos= HIWORD(wParam);
                            View(hDlg,g_Pos);
                        }
                    }
                    break;
                case WM_CLOSE:
                    EndDialog(hDlg,TRUE); 
                    return TRUE;
            }
            return FALSE;
        }
        
  8. レコードを表示する View() 関数です。
    mysql_data_seek() でシークして mysql_fetch_row() でレコードを取得します。
    DialogBox のキャプションにレコード番号を表示してみました。
        void  View(HWND hDlg,UINT no)
        {   char     buf[40];
    
            mysql_data_seek(res,no);
            row= mysql_fetch_row(res);
            SetDlgItemText(hDlg,IDC_EDIT1,row[0]);
            SetDlgItemText(hDlg,IDC_EDIT2,row[1]);
            SetDlgItemText(hDlg,IDC_EDIT3,row[2]);
            SetDlgItemText(hDlg,IDC_EDIT4,row[3]);
            SetDlgItemText(hDlg,IDC_EDIT5,row[4]);
            wsprintf(buf,"Record NO = %d",no);
            SetWindowText(hDlg,buf);
        }
        

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