今回はUser.hで定義する外部変数や関数を紹介しますが、その詳しい意味はProc.hの解説の際に書きますので、今日は

(1)IDList.hやIDListProc.hでカバーされないことをUser.hに書く

(2)IDLいstのUser.hの外部変数や関数「大体こんなこと」

位の理解で結構です。

なお、今回も(解説:)と色付けでやりますね。

 

//////////////////////////////////////////
// User.h
// Copyright (c) 09/29/2021 by Ysama
//////////////////////////////////////////
//定数の定義
#define    IDC_LISTVIEW 1000
//(解説:これはメインウィンドウに張り付けるリストビューのコントロールIDです)

#define UP 0
#define DOWN 1
//(解説:これはリストビューの列枠をクリックして昇順、降順にソートする際の定数です)

#define NO_OF_SUBITEM 4
//(解説:これも昇順、降順にソートする際の列数の定数です)

 

////////////////////////
//リストビューの作成
////////////////////////
CLISTVIEW g_ListView;
//(解説:リストビューコントロールをカプセル化するCLISTVIEWクラスの変数定義です)
//////////////////////////
//データファイル用CSTR変数
//////////////////////////
CSTR g_Data;
//(解説:IDListのデータの受け渡しに利用する、BCCFormandBCCSkeltonの文字列クラス変数です)
//////////////////////////
//ヘルプファイル用CSTR変数
//////////////////////////
CSTR g_HelpFile;
//(解説:IDList.chmというヘルプファイルを作る想定ですが、そのヘルプファイルのパス、名の文字列変数です)
////////////////////////////////
//ポップアップメニュ-のハンドル
////////////////////////////////
HMENU g_hPopup;
//(解説:リストビューを右クリックするとポップアップメニューを出す予定なので、そのハンドル変数を確保します)
//////////////////////////
//サブアイテムのソート関連

//(解説:サブアイテム=リストビューの列です)
//////////////////////////
//列とソート方法の配列
int sortsubno[NO_OF_SUBITEM];
//(解説:この配列が4つの列に対応し、それぞれUP(0)またはDOWN(1)のフラグを収容します)
//ソートコールバック関数
//(解説:リストビューの列枠をクリックして昇順、降順にソートする際に必要なコールバック関数です)
int CALLBACK CompProc(LPARAM lp1, LPARAM lp2, LPARAM lpSort) {

    static int nItem1, nItem2;
    static char buf1[MAX_PATH], buf2[MAX_PATH];
//(解説:ソートに必要な整数、文字列の変数宣言です)
    //アイテムの検索
    nItem1 = g_ListView.FindItem(-1, NULL, lp1);
    nItem2 = g_ListView.FindItem(-1, NULL, lp2);
//(解説:直接g_ListViewという外部変数にアクセスするのでクラス内に置けず、外部関数としました) 

   //アイテム情報の取得
    g_ListView.GetItemText(nItem1, (int)lpSort, buf1, MAX_PATH);
    g_ListView.GetItemText(nItem2, (int)lpSort, buf2, MAX_PATH);
    if(sortsubno[(int)lpSort] == UP)
        return(strcmp(buf1, buf2));
    else
        return(strcmp(buf1, buf2) * -1);
//(解説:これがソートに必要な文字列比較の部分です。真であればstrcmpの1、0、-1を、偽なら-1、0、1を返します)

}

////////////////////////////
//カンマ区切り文字切り出し
//★str 文字列は切り出した文
//字列だけ短縮されるので注意
//(解説:表データのコンマ区切り文字列を切り出す関数です。詳細は以下にあります。)

////////////////////////////
char* GetDelimtStr(char* str) {

    static char buff[MAX_PATH * 4];    //取り敢えず1K bytes確保
    char *cp = str;
    int len = 0;
    switch(*cp) {
    case 0:
            return 0;            //NULL終端を指していれば単に帰る(FALSE)
    case '\"':                    //「""」処理
        cp++;                    //'\"'の次に進める
        while(*cp != '\"') {
            buff[len] = *cp;     //buffへのコピー
            cp++;
            len++;
        }
        cp++;                    //cpは'\"'の次の','へ進める
        buff[len] = '\0';        //buffのNULL終端処理
        break;
    default:                    //「""」以外
        //','でも'\n'でもNullでもなければ
        while(*cp != ',' && *cp != '\n' && *cp) {
            buff[len] = *cp;    //strデータをbuffにコピーしてゆく
            cp++;
            len++;
        }
        buff[len] = '\0';        //buffのNULL終端処理
        break;
    }
    if(*cp){                    //cpがNULL終端を指していなければ
        cp++;                    //','や'\n'を指しているので一つ進め
    }
    lstrcpy(str, cp);            //残余の文字列を文字列先頭に移動
    return buff;                //切り取った文字列を返す(TRUE)
}

//(解説:IDListでは、「メンバーシップ」「ログインID」「パスワード」「備考」という4列の文字列データを、

//  (フィル名IDList.dat)

//  data1,data2,data3,data4(cr("\n"))

//  data5,data6,data7,data8(cr("\n"))

//  data9,data10,data11,data12(cr("\n"))

//のようにコンマ区切り文字列データとして扱い、IDList.datとして読み書きします。(最終的にはこのファイルを暗号化して隠しファイルとしますが、それはもっと先のお話。)

//その為、読み込んだ文字列データを切り出してゆくことが必要ですが、この関数はヌル終端が来るまでstrが指す文字列データの','または'\n'あるいは'\0'で区切られた文字列をヌル終端させてbuffに切り出し、それ以降の文字列を冒頭から上書きさせて行く関数です。

//従って戻り値は切り出された文字列(buff)のポインター(TRUE)、またはヌル(FALSE)になります。

//なお、IDやパスワード等通常の語であれば空白文字が入らないのですが、「備考」にはスペースやCR(\n)があるので、そのような文字列は「ダブルクォテーションでくくる("~")」という仕様になっています。