当方の環境でmsinfo32.txtを出力し、試してみました。
区切り文字は半角スペースではなくタブコードのようなので、それで分割します。
取り急ぎ突貫工事で作ったものなので穴があるかもしれませんが、とりあえず。
(モジュールの使い方については前回のスレを参照してください)
#module
#define global listview(%1=300,%2=200,%3=0x50000001,%4=0) winobj "SysListView32","",%4,%3,%1,%2
#define global lv_addcol(%1,%2="",%3=0,%4=-1,%5=100,%6=0) _lv_addcol %1,%2,%3,%4,%5,%6
#deffunc _lv_addcol int c_h,str _c_s,int c_p,int _c_i,int c_w,int c_f
c_s=_c_s : dim lvc,8
if _c_i<0 : c_i=c_p : else : c_i=_c_i
lvc=0xF,c_f,c_w,varptr(c_s),0,c_i
sendmsg c_h,0x101B,c_p,varptr(lvc) //LVM_INSERTCOLUMN=0x101B
return
#define global lv_additem(%1,%2="",%3=0,%4=0) _lv_additem %1,%2,%3,%4,1
#define global lv_setitem(%1,%2="",%3=0,%4=0) _lv_additem %1,%2,%3,%4,0
#deffunc _lv_additem int i_h,str _i_s,int i_p,int i_c,int i_flg
i_s=_i_s : dim lvi,13
lvi=1,i_p,i_c,0,0,varptr(i_s)
sendmsg i_h,0x1006+(i_flg!=0),0,varptr(lvi) //LVM_SETITEM=0x1006 LVM_INSERTITEM=0x1007
return
#global
//以下、msinfo32.txtはすでに出力されているものとする。
exist "d:\\msinfo32.txt" //当方の環境ではCドライブに出力できなかったのでDドライブで。適宜置き換えてください。
x=strsize : if x=-1 : dialog "ファイルが存在しません" : end
//出力されたファイルはUTF-16なのでShift_JISに変換する
sdim dum,x+2 : bload "d:\\msinfo32.txt",dum,x
buf=cnvwtos(dum) : notesel buf
dim dum //ロードに使用したバッファを解放
//行頭が"["になっている行の数を数える(カテゴリの数)
cats=0
repeat notemax
noteget buf2,cnt
if peek(buf2,0)='[' : cats++
loop
//カテゴリ情報を取得
sdim cat_n,64,cats : dim cat_l,cats+1
x=0
repeat notemax
noteget buf2,cnt
if peek(buf2,0)='[' {
cat_l(x)=cnt //カテゴリがどの行から始まるか
strrep buf2,"[","" : strrep buf2,"]","" : cat_n(x)=buf2 //カテゴリ名
x++
}
loop
cat_l(cats)=notemax //最後のカテゴリを選択した時用
com_str="" //コンボボックス用にカテゴリ名をまとめたもの
repeat cats
if cnt>0 : com_str+="\n"
com_str+=cat_n(cnt)
loop
pos 0,0 : objsize 300,16 : combox dum,,com_str : com_h=objinfo(stat,2)
cat_sel=0 //選択したカテゴリ
gosub *view_data
//コンボボックスを変更した時の割り込み
oncmd gosub *com_chan,0x111 //WM_COMMAND
stop
*com_chan
debug=1
if lparam=com_h {
if ((wparam>>16)&0xFFFF)=1 { //CBN_SELCHANGE
sendmsg com_h,0x147,0,0 //CB_GETCURSEL
if stat>=0 {
//表示切り替え
cat_sel=stat : clrobj lv_id,lv_id
gosub *view_data
}
}
}
return
*view_data
//カテゴリの内容をリストビューに表示
pos 10,20 : listview 620,450 : lv_id=stat : lv_h=objinfo(lv_id,2)
//カテゴリ内のテキストを抜き出す
l=cat_l(cat_sel)+1 //抜き出す行番号
first_f=0 //最初の行は項目名なので、それを取得したかどうかフラグ
cols=0 //リストビューの項目数
lines=0 //リストビューの行数
repeat
if l=cat_l(cat_sel+1) : break //次のカテゴリの行まで来たら脱出
noteget buf2,l
notext_f=0 //空っぽの行フラグ
repeat
//行末からタブコードを取り除く。
//その結果空っぽの行になったらnotext_fを1に。
x=strlen(buf2)
if x=0 : notext_f=1 : break
if peek(buf2,x-1)=9 : poke buf2,x-1,0 : else : break //タブコードのASCIIコードは9
loop
if notext_f=0 {
split buf2,"\t",res : items=stat //タブコードで分割する
if first_f=0 {
//最初の行の場合は項目を追加
cols=items
repeat cols
lv_addcol lv_h,res(cnt),cnt,,580/cols
loop
first_f=1
} else {
//最初の行以外の場合はアイテムを追加
repeat items
if cnt>=cols {
//分割数が現在の項目数を超えた場合は空っぽの項目を追加
lv_addcol lv_h,"",cnt : cols++
}
if cnt=0 : lv_additem lv_h,res(cnt),lines,cnt : else : lv_setitem lv_h,res(cnt),lines,cnt
loop
lines++
}
}
l++
loop
return