VFP信息的瀏覽之焦點(diǎn)行的動(dòng)態(tài)顯示

字號(hào):

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