入力フォームライブラリ


入力フォームライブラリ本体

ソース名「form」で保存。

createcanvas(form)

func formdlg(tit,grp,but){setfont("S");for(mgn=0,i=0;i<FORM[grp];i++){mgn=max(mgn,stwide(FORM[grp][i][0])+20)}title(tit,form)soft1(but?but:"決定";,form)trgt(form)lock();for(i=0;i<16;i++){drawform(grp,i,i==FORM[grp][-1],mgn)}unlock()canvas(form)while((in=input())!=keysoft1){fc=FORM[grp][-1];lock()switch(in){case keydown:FORM[grp][-1]=(fc+1)%FORM[grp];drawform(grp,fc,0,mgn);break;case keyup:FORM[grp][-1]=(fc+FORM[grp]-1)%FORM[grp];drawform(grp,fc,0,mgn);break;case keyselect:switch(FORM[grp][fc]){case 1:FORM[grp][fc][1]=!FORM[grp][fc][1];break;case 2:split(csv,FORM[grp][fc][4],",");sel=selectdlg(FORM[grp][fc][0]."を選択",csv);if(sel>-1){FORM[grp][fc][0]=sel}break;disarray(csv);default:disvar(st);st=inputdlg(FORM[grp][fc][0]."の入力",FORM[grp][fc][1],FORM[grp][fc][2],FORM[grp][fc][3])if(strlen(st)){FORM[grp][fc][0]=st}break;}break;}drawform(grp,FORM[grp][-1],1,mgn);unlock()}}

func fget(grp,id){
return FORM[grp][id][1];
}

func drawform(group,id,f,mgn){switch(id%2+f*2){case 0:col(white);break;case 1:col(0xEEEEEE);break;default:col(0xAACCFF);}frect(0,id*15+5,240,14)if(id<FORM[group]){switch(FORM[group][id]){case 0:txtbox(group,id,mgn);break;case 1:chkbox(group,id,mgn);break;case 2:choice(group,id,mgn);break;}}}

func chkbox(grp,id,mgn){lbl=FORM[grp][id][0];val=FORM[grp][id][1];setfont("S")col(white)frect(mgn,id*15+5,13,13)col(0)text(lbl,10,id*15+6,0)text(val?"?":"";,mgn,id*15+6,0)rect(mgn,id*15+5,13,13)}

func choice(grp,id,mgn){split(csv,FORM[grp][id][4],",")lbl=FORM[grp][id][0];val=csv[FORM[grp][id][1]];setfont("S")col(0xDDDDDD)frect(mgn,id*15+5,230-mgn,13)col(0)text(lbl,10,id*15+6,0)text(val,mgn+5,id*15+6,0)rect(mgn,id*15+5,230-mgn,13)col(gray)text("▼",229,id*15+6,TOP|RIGHT)col(0xDDDDDD)frect(216,id*15+6,13,6)}

func txtbox(grp,id,mgn){lbl=FORM[grp][id][0]val=FORM[grp][id][1];typ=FORM[grp][id][3];@(t,"あ","Aa","12")setfont("S")col(white)frect(mgn,id*15+5,230-mgn,13)col(0)text(lbl,10,id*15+6,0)text(val,mgn+5,id*15+6,0)rect(mgn,id*15+5,230-mgn,13)col(gray)text(t[typ],229,id*15+6,TOP|RIGHT)}

サンプル

#form#
FORM[0]=5'0番のフォームの項目数'
FORM[0][-1]=2'フォーカス位置'
FORM[0][0]=0'0番のフォームの項目0の種類'
FORM[0][0][0]="テキスト(かな)"'0番のフォームの項目0のラベル'
FORM[0][0][1]="あいうえおABCDE12345"'0番のフォームの項目0の値'
FORM[0][0][2]=30'0番のフォームの項目0の最大長'
FORM[0][0][3]=0'0番のフォームの項目0の文字種別'
FORM[0][1]=0
FORM[0][1][0]="テキスト(英数)"
FORM[0][1][1]="abcdeABCDE"
FORM[0][1][2]=15
FORM[0][1][3]=1
FORM[0][2]=0
FORM[0][2][0]="テキスト(数字)"
FORM[0][2][1]=100
FORM[0][2][2]=3
FORM[0][2][3]=2
FORM[0][3]=1
FORM[0][3][0]="チェック"
FORM[0][3][1]=1
FORM[0][4]=2
FORM[0][4][0]="リスト選択"
FORM[0][4][1]=2
FORM[0][4][4]="選択項目1,選択項目2,選択項目3,選択項目4,選択項目5"
formdlg("入力フォームサンプル",0,"押す");
canvas(default)'formdlgの後は必ずcanvas関数を呼んでください'

解説

グローバルな多次元配列FORMを使って入力フォームを表示/操作するライブラリです。
このFORM配列部分をGUIで生成できるツールもできてはいるのですが、それはまた後日。