今回は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)があるので、そのような文字列は「ダブルクォテーションでくくる("~")」という仕様になっています。