在用VFP設計一個應用系統(tǒng)時,信息的瀏覽是其中一個相當重要的功能。人們一般用Grid對象來顯示數(shù)據(jù)信息,但該對象在使用功能上卻存在一些不足。
提出問題
當使用者在記錄之間移動焦點時,只有獲得焦點的記錄的某一個字段以不同于Grid背景的顏色顯示。為使整條記錄均用同一種顏色突出顯示(本文示例為藍色背景),即當數(shù)據(jù)記錄移動時,用顏色動態(tài)變化顯示相對光標所在記錄的位置,可以在Grid對象的afterRowColChange事件過程中加入如下內(nèi)容:
this.setall(“dynamicbackcolor”,“iif(this.activerow=recno(),rgb(0,0,255),rgb(255,255,255))”,“column”)。
在使用中發(fā)現(xiàn):如果設置了Set delete on環(huán)境參數(shù),則當邏輯刪除記錄后,動態(tài)背景的顏色顯示就會出現(xiàn)混亂。
分析問題
這種情況一般有兩種解決方法:
●執(zhí)行pack命令,再重新創(chuàng)建和設置Grid的各項屬性;
●先將沒有刪除標志的記錄復制到一個臨時表中,用zap命令刪除源表中所有記錄,再將沒有刪除標志的記錄從臨時表追加到源表中。
這兩種方法實質上都是把已邏輯刪除的記錄從數(shù)據(jù)表中真正刪除,缺點是兩種方式都要求該表必須以獨占方式打開。
如果表是以共享方式使用,那么又該如何處理呢?其實,動態(tài)背景顏色不能正確顯示的原因是由于邏輯刪除記錄,該操作造成光標所在的行activerow()不等于數(shù)據(jù)的記錄號recno(),從而導致了動態(tài)背景顏色的顯示出現(xiàn)混亂。筆者通過兩個表的關聯(lián)成功地解決了這一難題。
解決問題
我們以一個實際的例子來說明如何解決這一問題。設有一個表cenji.dbf,表的字段分別為:學號、姓名、姓別、成績。新建一個表單,并創(chuàng)建一個Grid對象,設置Grid對象的recordsource屬性為cenji,在Grid對象的afterRowColChange事件過程中添加如下代碼:
LPARAMETERS nColIndex
if this.activerow = recno()
this.setall(“dynamicbackcolor”, “iif
(this.activerow=recno(), rgb(0,0,255),rgb(255,255,255))”,“column”)
else
select 學號from cenji where .not. deleted() into cursor temp_table
select temp_table
index on 學號 tag xh
set relation to 學號 into temp_table in cenji
sele cenji
this.setall(“dynamicbackcolor”,“iif(this.
activerow=recno(‘temp_table’), rgb(0,0,255),rgb(255,255,255))”,“column”)
endif
thisform.refresh
在上述代碼中,當邏輯刪除記錄造成光標所在的行activerow()不等于數(shù)據(jù)的記錄號recno()時,只需對數(shù)據(jù)建立一個關聯(lián)子表,當記錄指針在父表cenji中移動時,子表temp_table的記錄指針移到學號相同的記錄上。子表的記錄號是不包括邏輯刪除記錄的,保證了光標所在行的子表記錄號recno(‘temp_table’)等于光標所在的行activerow(),從而使該行動態(tài)背景顏色能正確顯示。本文為了說明方便, 在afterRowColChange事件過程中建立子表,實際上在Delete等命令之后建立。
另外,當activerow屬性與recno()函數(shù)配合使用動態(tài)顯示背景顏色時,一般會提示用戶“請不要在所顯示的記錄中設定主索引”,否則不能正確動態(tài)顯示。實際上,按照如上方法,同樣可以解決這一問題。
設表cenji.dbf中,按成績字段建立一個主索引,在Grid對象的afterRowColChange事件過程中寫下如下代碼:
LPARAMETERS nColIndex
select 學號 from cenji into cursor temp_table order by 成績 desc
select temp_table
index on 學號 tag xh
set relation to 學號 into temp_table in cenji
this.setall(“dynamicbackcolor”,“iif
(this.activerow=recno(‘temp_table’), rgb(0,0,255),rgb(255,255,255))”,“column”)
thisform.refresh
同樣,不一定要在Grid對象的afterRowColChange事件過程中建立關聯(lián)子表temp_table。
本文代碼在中文版Windows 98和Visual Foxpro 6.0中運行通過。
提出問題
當使用者在記錄之間移動焦點時,只有獲得焦點的記錄的某一個字段以不同于Grid背景的顏色顯示。為使整條記錄均用同一種顏色突出顯示(本文示例為藍色背景),即當數(shù)據(jù)記錄移動時,用顏色動態(tài)變化顯示相對光標所在記錄的位置,可以在Grid對象的afterRowColChange事件過程中加入如下內(nèi)容:
this.setall(“dynamicbackcolor”,“iif(this.activerow=recno(),rgb(0,0,255),rgb(255,255,255))”,“column”)。
在使用中發(fā)現(xiàn):如果設置了Set delete on環(huán)境參數(shù),則當邏輯刪除記錄后,動態(tài)背景的顏色顯示就會出現(xiàn)混亂。
分析問題
這種情況一般有兩種解決方法:
●執(zhí)行pack命令,再重新創(chuàng)建和設置Grid的各項屬性;
●先將沒有刪除標志的記錄復制到一個臨時表中,用zap命令刪除源表中所有記錄,再將沒有刪除標志的記錄從臨時表追加到源表中。
這兩種方法實質上都是把已邏輯刪除的記錄從數(shù)據(jù)表中真正刪除,缺點是兩種方式都要求該表必須以獨占方式打開。
如果表是以共享方式使用,那么又該如何處理呢?其實,動態(tài)背景顏色不能正確顯示的原因是由于邏輯刪除記錄,該操作造成光標所在的行activerow()不等于數(shù)據(jù)的記錄號recno(),從而導致了動態(tài)背景顏色的顯示出現(xiàn)混亂。筆者通過兩個表的關聯(lián)成功地解決了這一難題。
解決問題
我們以一個實際的例子來說明如何解決這一問題。設有一個表cenji.dbf,表的字段分別為:學號、姓名、姓別、成績。新建一個表單,并創(chuàng)建一個Grid對象,設置Grid對象的recordsource屬性為cenji,在Grid對象的afterRowColChange事件過程中添加如下代碼:
LPARAMETERS nColIndex
if this.activerow = recno()
this.setall(“dynamicbackcolor”, “iif
(this.activerow=recno(), rgb(0,0,255),rgb(255,255,255))”,“column”)
else
select 學號from cenji where .not. deleted() into cursor temp_table
select temp_table
index on 學號 tag xh
set relation to 學號 into temp_table in cenji
sele cenji
this.setall(“dynamicbackcolor”,“iif(this.
activerow=recno(‘temp_table’), rgb(0,0,255),rgb(255,255,255))”,“column”)
endif
thisform.refresh
在上述代碼中,當邏輯刪除記錄造成光標所在的行activerow()不等于數(shù)據(jù)的記錄號recno()時,只需對數(shù)據(jù)建立一個關聯(lián)子表,當記錄指針在父表cenji中移動時,子表temp_table的記錄指針移到學號相同的記錄上。子表的記錄號是不包括邏輯刪除記錄的,保證了光標所在行的子表記錄號recno(‘temp_table’)等于光標所在的行activerow(),從而使該行動態(tài)背景顏色能正確顯示。本文為了說明方便, 在afterRowColChange事件過程中建立子表,實際上在Delete等命令之后建立。
另外,當activerow屬性與recno()函數(shù)配合使用動態(tài)顯示背景顏色時,一般會提示用戶“請不要在所顯示的記錄中設定主索引”,否則不能正確動態(tài)顯示。實際上,按照如上方法,同樣可以解決這一問題。
設表cenji.dbf中,按成績字段建立一個主索引,在Grid對象的afterRowColChange事件過程中寫下如下代碼:
LPARAMETERS nColIndex
select 學號 from cenji into cursor temp_table order by 成績 desc
select temp_table
index on 學號 tag xh
set relation to 學號 into temp_table in cenji
this.setall(“dynamicbackcolor”,“iif
(this.activerow=recno(‘temp_table’), rgb(0,0,255),rgb(255,255,255))”,“column”)
thisform.refresh
同樣,不一定要在Grid對象的afterRowColChange事件過程中建立關聯(lián)子表temp_table。
本文代碼在中文版Windows 98和Visual Foxpro 6.0中運行通過。