對于經(jīng)常用VFP編程和操作數(shù)據(jù)表的用戶來說,做一個對任意VFP支持的數(shù)據(jù)表都能進行瀏覽和編輯的表單是非常必要的,在這個表單里,首先要有一個用來顯示數(shù)據(jù)表的表格Grid控件,其次要有許多的命令按鈕、組合框、文本框等控件,來執(zhí)行對數(shù)據(jù)表進行篩選、定位、統(tǒng)計、修改等各種日常的操作。經(jīng)過長期摸索與實踐,本人已經(jīng)初步完成了這樣一個表單,而且給日常管理工作帶來了很大的便利。本文就其查找定位功能一項,寫出來與同行們交流。
二、基本思路
有很多VFP應(yīng)用系統(tǒng)的查找定位功能,大多都只局限于對具體某個數(shù)據(jù)表的某一個或某幾個字段進行操作,不能滿足實際工作的各種需要。如果要對任何一個數(shù)據(jù)表的任何一個字段進行查找定位,就需要有一個能動態(tài)綁定源數(shù)據(jù)的組合框來實現(xiàn)。這個組合框的數(shù)據(jù)源必須隨光標在表格Grid1控件中的不同列的變化而動態(tài)綁定。方法是當(dāng)鼠標點擊表格中不同列時,表格控件必須返回當(dāng)前列的字段名和當(dāng)前數(shù)據(jù)表名稱給兩個公共變量,組合框在得到焦點時首先根據(jù)表格通過公共變量反饋的數(shù)據(jù)表名和字段名,用Select語句生成臨時數(shù)據(jù)表,且該表名稱按照上述的表名和字段名動態(tài)構(gòu)造。該臨時數(shù)據(jù)表只有一個字段,就是表格中對應(yīng)的那個字段,但要去掉重復(fù)值。這一點在Select語句中用關(guān)鍵字Distinct實現(xiàn)。另外它需要進行排序以便用戶快速查找,該臨時表生成后與組合框動態(tài)綁定,當(dāng)點擊組合框時就會在下拉列表框中列出相應(yīng)字段值供用戶選擇。若被操作的數(shù)據(jù)表中該字段值相等或相近的記錄有多條時,還可以在表單中另設(shè)一個命令按鈕來查找定位其下一條記錄。查找定位后應(yīng)能及時顯示在表格中,這需要在點擊組合框后把焦點交給表格控件,以便表格控件能及時將所定位的記錄高亮度顯示給用戶。
三、界面的設(shè)計與實現(xiàn)
設(shè)表單Form1中有一個組合框Combo1和一個表格Grid1,現(xiàn)在要通過點擊Combo1來定位Grid1中的記錄(另設(shè)一個命令按鈕作為Combo1的輔助來定位相同字段值的下一條記錄),并且要求被定位的記錄被選中為Grid1中的當(dāng)前記錄。具體代碼如下:
屬性設(shè)置:
Thisform.Combo1.RowSourceType = 6 (字段)
其余屬性設(shè)為默認值。
方法設(shè)置:
Combo1.Init:
public fvalue &&為字段值變量
fvalue=''
Combo1.refresh:
this.enabled=iif(empt(fieldname).or.type(fieldname)='M',.f.,.t.) &&對備注型字段不可用
Combo1.gotfocus:
cursor_table = tabname+'_'+fieldname+'_cmb1'
&&cursor_table 是為組合框提供數(shù)據(jù)源的臨時表名稱,tabname為當(dāng)前數(shù)據(jù)表名稱,fieldname為當(dāng)前字段名,這一語句的功能是按當(dāng)前操作的數(shù)據(jù)表名稱和當(dāng)前選中的數(shù)據(jù)列名稱為組合框動態(tài)構(gòu)造數(shù)據(jù)源表名稱,tabname和fieldname兩變量的值由Grid1提供。