抽出したレコードを List View に表示



成績データベースから抽出したレコードを List View に表示します。

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

プログラムの説明

  1. あらかじめ成績データベースを作成して MySQL を起動して下さい。
    詳細は データベースにコネクト を参照して下さい。
  2. ページ先頭の画像を参考にして DialogBox を作成して下さい。
    DialogBox 全体に List View を配置して下さい。
  3. MySQL のプログラムは、mysql.h をインクルードして libmysql.lib をリンクします。
    szDB はデータベースの名前で、szSQL は発行するクエリです。
    今回は、三科目が全て50点以上のデータを抽出しています。
    myData が MYSQL のオブジェクトのポインタです。
    res は SQL 文の実行結果のオブジェクトを格納する領域です。
    Count は抽出されたレコード件数です。
    row はレコードのアイテムを取得する領域です。
    HEAD[] は List View の Column の見出しで、CX[] はその幅です。
        /*******************************************************/
        /*★ List View で見出しとカラムを表示する    前田 稔 ★*/
        /*******************************************************/
        #include    <windows.h>
        #include    <commctrl.h>
        #include    <mysql.h>
        #include    "resource.h"
        #pragma     comment(lib,"comctl32.lib")
        #pragma     comment(lib,"libmysql.lib")
    
        // 使用するデータベース
        #define     szDB    "mark"
        // 発行するクエリ
        #define     szSQL   "SELECT * FROM mark_table WHERE v1>49 AND v2>49 AND v3>49"
    
        // MYSQLの定義
        MYSQL       *myData= NULL;      // MySQL の Object
        MYSQL_RES   *res= NULL;         // クエリの Object
        UINT        Count;              // Record 件数
        MYSQL_ROW   row;                // ITEM の領域
    
        //List View Test Data
        char    HEAD[][8]= {  "番号", "名前", "数学", "英語", "C言語"  };
        int     CX[]=      {  70, 120, 60, 60, 60  };
        
  4. WinMain() では MySQL を初期化してサーバーに接続します。
    詳細は DialogBox で表示 を参照して下さい。
  5. DialogBox の CALLBACK 関数です。
    WM_INITDIALOG: で List View を初期化します。
        //★ Dialog Box の CALLBACK 関数
        LRESULT CALLBACK DlgProc(HWND hDlg, UINT msg, WPARAM wp, LPARAM lp)
        {
            switch (msg)
            {   case WM_INITDIALOG:
                    InitCommonControls();
                    SetInitialData(GetDlgItem(hDlg,IDC_LIST1));
                    break;
                case WM_CLOSE:
                    EndDialog(hDlg, TRUE);
                    return TRUE;
                default:
                    return FALSE;
            }
            return TRUE;
        }
        
  6. ListView を初期化する SetInitialData() 関数です。
    ListView はデータを操作(表示)するのに独自のメモリ領域を使っています。
    従って、データベースから抽出した全てのレコードを ListView に登録します。
    ListView の初期化は List View にカラムと見出しを付ける を参照して下さい。
    mysql_fetch_row(res); がデータベースから次のレコードを取得するソースコードです。
        //★ 初期データを設定
        void    SetInitialData(HWND hList)
        {   LV_COLUMN   lvcol;
            LV_ITEM     item;
    
            // Column の項目設定
            lvcol.mask = LVCF_FMT | LVCF_WIDTH | LVCF_TEXT | LVCF_SUBITEM;
            lvcol.fmt = LVCFMT_LEFT;
            for(int i=0; i<5; i++)
            {   if (i==2)   lvcol.fmt= LVCFMT_RIGHT;
                lvcol.cx = CX[i];
                lvcol.pszText = HEAD[i];
                lvcol.iSubItem = i;
                ListView_InsertColumn(hList,i,&lvcol);
            }
    
            // ITEM の設定
            item.mask = LVIF_TEXT;
            for(UINT n=0; n<Count; n++)
            {   row= mysql_fetch_row(res);
                item.pszText = row[0];
                item.iItem = n;
                item.iSubItem = 0;
                ListView_InsertItem(hList,&item);
                item.pszText = row[1];
                item.iItem = n;
                item.iSubItem = 1;
                ListView_SetItem(hList,&item);
                for(int j=0; j<3;j++)
                {   item.pszText = row[j+2];
                    item.iItem = n;
                    item.iSubItem = j+2;
                    ListView_SetItem(hList,&item);
                }
            }
        }
        

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