欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費電子書(shū)等14項超值服

開(kāi)通VIP
Visual Foxpro表格的使用方法與技巧
一、 概述
  網(wǎng)格(Grid),是Visual Foxpro 3.0下一個(gè)功能極為強大的容器控件。從外觀(guān)上看,它非常類(lèi)似于我們熟悉的Browse窗口,但實(shí)際上它提供了比Browse窗口更為豐富的控制方式。如作為一個(gè)容器,它的每一列均可容納不同的控件,這樣就提供了比Browse更方便的輸入方式;又如它能設置列對象的動(dòng)態(tài)字體和顏色,這樣就使得每一行、每一列甚至每一單元格都可定制自己的顯示風(fēng)格,從而提供了比Browse更豐富的顯示效果。筆者在對網(wǎng)格控件的使用過(guò)程中覺(jué)得,如果恰當地運用網(wǎng)格的屬性以及網(wǎng)格控件提供的事件與方法,可以完成一些看起來(lái)非常難以實(shí)現的編輯功能。下面從一個(gè)具體例子出發(fā),討論VFP下網(wǎng)格的使用方法與技巧。
  二、輸入焦點(diǎn)的自動(dòng)轉移
  為敘述方便起見(jiàn),首先利用VFP的項目管理器建立一個(gè)測試項目,然后以該項目為原型分析本文中關(guān)于網(wǎng)格使用技巧方面的例子。我們將項目命名為T(mén)est,然后在該項目下新建一個(gè)數據庫,也命名為T(mén)est,再在數據庫Test建立一個(gè)表Test1,該表有兩個(gè)字段,1)Name:字符型,寬度為10; 2)Value:數值型,寬度為10,小數位數為1。
  下面先建立Test1表的輸入表單Test11,并在表單的"數據環(huán)境"中將表Test1添加進(jìn)去。然后在表單上放置一網(wǎng)格,并將網(wǎng)格的數據源(RecordSource屬性)設為T(mén)est1,同時(shí)設置網(wǎng)格為兩列,分別綁定Test1表的Name和Value字段。這樣我們就可以開(kāi)始討論具體問(wèn)題及其解決方案了。
  1. 問(wèn)題的提出
假定Test1表的Name字段的內容為在一般情況下固定不變的一些數據(這種情況還是比較常見(jiàn)的,如Name字段表示項目指標,Value字段表示對應該指標的數值,Name字段的數據一旦一次輸入后,一般情況下是不用改變的),而需要改變的是對應Name的Value值,為使在網(wǎng)格輸入時(shí)Name字段的值不被用戶(hù)修改,可將網(wǎng)格的第一列Column1的Enabled屬性設為.F.,但這樣做以后,問(wèn)題就出現了。
我們希望用戶(hù)在Value字段列中的某一行輸完數據(即到達字符最大寬度或輸入一位小數)后,或輸入數據并按下回車(chē)鍵或TAB鍵后,焦點(diǎn)能自動(dòng)轉到下一行,以便輸入下一個(gè)數據。而事實(shí)上很遺憾,焦點(diǎn)根本不動(dòng),仍停留在原輸入數據上,用戶(hù)必須按下箭頭鍵才能輸入下一行數據。顯然,出現該問(wèn)題的原因與Column1的Enabled屬性為.F.有關(guān),但即使Enabled=.T.(這時(shí)需要設定Column1的ReadOnly屬性為.T.),焦點(diǎn)也將移到同一行的第一列,而不會(huì )移到下一行的同一列。事實(shí)上,在Foxpro的Browse窗口中,也存在同樣的問(wèn)題。
  2. 解決方法
  解決此問(wèn)題的關(guān)鍵在于利用網(wǎng)格提供的BeforeRow ColChange或AfterRowColChange事件。 其中BeforeRow ColChange事件當用戶(hù)更改活動(dòng)的行或列,而新單元還未獲得焦點(diǎn)時(shí)發(fā)生,也可以在表格列中當前對象和數據庫中任何規則的 Valid 事件之前發(fā)生;AfterRowColChange事件當用戶(hù)移到表格的另一行或列時(shí),新單元獲得焦點(diǎn)以及新行或列中對象的 When 事件發(fā)生后發(fā)生。而在上述問(wèn)題中,用戶(hù)輸完數據后正好發(fā)生這兩個(gè)事件,因此解決上述焦點(diǎn)移動(dòng)問(wèn)題的關(guān)鍵就在于編寫(xiě)其事件代碼,當然選用BeforeRowColChange事件或AfterRowColChange事件均可,在本例中我們采用了BeforeRowColChange事件。
  在BeforeRowColChange事件代碼中,首先判斷目前活動(dòng)列是否為第二列,如果是而且輸入或修改了數據,就使用Keyboard命令模擬按下箭頭鍵,這樣焦點(diǎn)就自動(dòng)轉到了下一行。下面是BeforeRowColChange事件代碼:
  LPARAMETERS nColIndex
  IF This.ActiveColumn =2
  IF ThisForm.ModifyData.and.!MDown()
  ThisForm.ModifyData=.F.
  KEYBOARD '{dnarrow}'
  ENDIF
  ENDIF
  這里ModifyData變量是在Form中新增的屬性,如果ModifyData屬性為.T.,表明輸入或修改了數據,為.F.則相反??梢钥闯?通過(guò)上述代碼,我們實(shí)現了希望達到的效果,但仍存在一些問(wèn)題,下面進(jìn)一步討論。
 
3. 問(wèn)題討論
  (1) ModifyData屬性的設置
  怎樣設置ModifyData屬性呢?我們只要在網(wǎng)格Column2列Text1對象(即輸入Value字段值的文本框)的InteractiveChange事件中編寫(xiě)如下代碼即可:
  ThisForm.ModifyData=.T.
  (2) 使用箭頭鍵的問(wèn)題
  從表面上看,似乎實(shí)現了上述代碼后,就解決了我們提到的問(wèn)題,事實(shí)上也確實(shí)解決了,但卻帶來(lái)了新的問(wèn)題。在測試中,我們發(fā)現,當輸入了數據但不按回車(chē)或TAB鍵,而是按上箭頭鍵(UpArrow)時(shí),焦點(diǎn)不動(dòng),按下箭頭鍵(DownArrow)時(shí),焦點(diǎn)向下移動(dòng)了兩行。原因很簡(jiǎn)單,正是"KEYBOARD '{dnarrow}'"命令帶來(lái)的問(wèn)題,在這兩種情況下,是不應該再按DownArrow鍵的。要解決此問(wèn)題,可以在Column2列Text1對象的KeyPress事件中編寫(xiě)如下代碼:
  LPARAMETERS nKeyCode, nShiftAltCtrl
  IF nKeyCode=24 OR nKeyCode=5 && Down Arrow Or Up Arrow
  thisform.ModifyData=.F.
  ENDIF
  這里判斷如果在數據輸入時(shí)按了箭頭鍵,則置ModifyData屬性為.F.,從而在BeforeRowColChange事件中不再按DownArrow鍵,也就解決了上述問(wèn)題。
  (3) 鼠標移動(dòng)焦點(diǎn)的問(wèn)題
  同使用箭頭鍵的問(wèn)題一樣,如果輸入了數據但不按回車(chē)或TAB鍵,而是用鼠標將焦點(diǎn)轉到另一行的話(huà),這時(shí)焦點(diǎn)會(huì )自動(dòng)多移一行,從而使輸入很不方便。解決此問(wèn)題的第一個(gè)想法是仿上述方法編寫(xiě)Column2列Text1對象的MouseDown事件代碼,經(jīng)過(guò)實(shí)驗發(fā)現這種方法是不行的,因為文本框的MouseDown事件是在網(wǎng)格BeforeRowColChange事件后發(fā)生的。但編寫(xiě)網(wǎng)格的MouseDown事件代碼是否可行呢?同樣不行,因為此時(shí)根本不發(fā)生此事件(焦點(diǎn)在文本框上,容器內的控制響應了此事件而容器本身則不會(huì )獲得此事件)。經(jīng)過(guò)反復的分析和實(shí)驗,我們發(fā)現,解決此問(wèn)題的方法卻異乎尋常的簡(jiǎn)單,正如我們在前面網(wǎng)格BeforeRowColChange事件代碼中所寫(xiě)的一樣,使用了MDOWN()函數。如果調用 MDOWN( )時(shí)有鼠標鍵按下,則該函數返回"真"(.T.)。調用 MDOWN( )時(shí)若沒(méi)有鼠標鍵按下,則返回"假"(.F.)。由于用戶(hù)用鼠標改變輸入焦點(diǎn)時(shí)正好鼠標鍵按下,所以MDOWN函數返回.T.,這時(shí)將不執行"KEYBOARD '{dnarrow}'"命令,從而不會(huì )出現焦點(diǎn)自動(dòng)多移一行的問(wèn)題。
  解決了上述三個(gè)問(wèn)題后,可以說(shuō)比較完滿(mǎn)地達到了我們的要求。但解決該問(wèn)題,還有其他一些方案,這些方案是否可行,存在什么問(wèn)題,我們在下面進(jìn)一步加以討論。
  4. 其他問(wèn)題討論
  (1) 使用ActivateCell方法
  從原理上講,不用Keyboard命令,而是用網(wǎng)格的ActivateCell方法也能達到同樣的效果。ActivateCell方法用于激活表格控制中的一個(gè)單元。在上述網(wǎng)格的BeforeRowColChange事件代碼中,將"KEYBOARD '{dnarrow}'"改為如下代碼:
  =This.ActivateCell(This.ActiveRow+1,This. ActiveColumn)
  也能實(shí)現同樣的功能,而且更為靈活。我們發(fā)現,這樣做后,確實(shí)能夠實(shí)現與KEYBOARD命令同樣的效果。但存在一個(gè)令人費解的問(wèn)題,即在網(wǎng)格沒(méi)有進(jìn)行垂直卷滾時(shí),沒(méi)有任何問(wèn)題;而在網(wǎng)格垂直卷滾后,這時(shí)第一行不再可見(jiàn),則輸完后焦點(diǎn)不動(dòng),無(wú)法移到下一行。由于VFP聯(lián)機文檔中沒(méi)有關(guān)于這方面的詳細敘述,解決此問(wèn)題也頗費周折,最后我們發(fā)現,應該使用網(wǎng)格的RelativeRow屬性代替ActiveRow屬性,即將上述代碼改為如下代碼: =This.ActivateCell(This.RelativeRow+1,This. ActiveColumn)即可。 RelativeRow屬性指出表格控制可見(jiàn)部分中的活動(dòng)行,如果在表格中滾動(dòng),使第一行不再可見(jiàn),而活動(dòng)行是表格中第一個(gè)可見(jiàn)行,這時(shí)RelativeRow 就為1?,F在的問(wèn)題正是滾動(dòng)時(shí)出現的,用RelativeRow正好解決。這也說(shuō)明,使用 ActivateCell方法激活的是相對的行或列。
  (2) 使用文本框的LostFocus事件
  與使用網(wǎng)格的BeforeRowColChange事件相比,還有一種更為簡(jiǎn)單的方法,即使用文本框的LostFocus事件。去掉網(wǎng)格的BeforeRowColChange事件代碼,然后在文本框的LostFocus事件里編寫(xiě)如下代碼:
  LPARAMETERS nColIndex
  IF ThisForm.ModifyData.and.!MDown()
  ThisForm.ModifyData=.F.
  KEYBOARD '{dnarrow}'
  ENDIF
  也能達到同樣的效果,而代碼更為簡(jiǎn)潔。
  (3) 關(guān)于TAB鍵與回車(chē)鍵
  在上述例子中,僅當用戶(hù)修改了數據才自動(dòng)移動(dòng)焦點(diǎn),但有時(shí)也需要在按了TAB鍵或回車(chē)鍵后就開(kāi)始移動(dòng)焦點(diǎn),而不用等到對數據進(jìn)行輸入或修改。這時(shí)可在文本框的KeyPress事件中加入如下代碼:
  IF nKeyCode=9 OR nKeyCode=13 && Tab Or Enter Key
  ThisForm.ModifyData=.T.
  ENDIF
  當然KeyPress的其他代碼仍然是必要的。這時(shí)ModifyData屬性已失去了其本身的含義,只是作為一個(gè)允許焦點(diǎn)轉換的標志而已。
  另外,如果不考慮數據輸完后(即到達字符最大寬度或輸入一位小數)即進(jìn)行焦點(diǎn)轉移,而只是在按了TAB鍵或回車(chē)鍵才移動(dòng)焦點(diǎn),代碼就變得更簡(jiǎn)單了,這時(shí)只需要編寫(xiě)文本框的KeyPress事件代碼即可,其他代碼可全部省略。
  IF nKeyCode=9 OR nKeyCode=13 && Tab Or Enter Key
  KEYBOARD '{dnarrow}'
  ENDIF
三、 網(wǎng)格的自動(dòng)拆分
  在上面實(shí)現焦點(diǎn)自動(dòng)轉移的例子中,主要使用的網(wǎng)格事件為BeforeRowColChange(或AfterRowColChange),另外還提到網(wǎng)格的ActiveRow,ActiveColumn,RelativeRow,RelativeColumn等屬性,這些都是網(wǎng)格編程中常用的事件與屬性,在下面的例子中,我們將看到,這些屬性和事件將會(huì )得到進(jìn)一步的應用。
  在本例中,我們仍然利用上面提到Test項目,并在數據庫Test再建立一個(gè)新表Test2,該表有六個(gè)字段,1)Name:字符型,寬度為10;2)Value1:數值型,寬度為10,小數位數為1;3)Value2:數值型,寬度為10,小數位數為1;4)Value3:數值型,寬度為10,小數位數為1;5)Value4:數值型,寬度為10,小數位數為1;6)Value5:數值型,寬度為10,小數位數為1。
  同上例一樣我們先建立一個(gè)上述Test2表的輸入表單Test2,并在表單的"數據環(huán)境"中將表Test2添加進(jìn)去。然后在表單上放置一網(wǎng)格,并將網(wǎng)格的數據源(RecordSource屬性)設為T(mén)est2,同時(shí)設置網(wǎng)格為六列,分別綁定Test2表的各個(gè)字段。這樣我們就可以開(kāi)始討論具體問(wèn)題及其解決方案了。
  1. 問(wèn)題的提出
  我們知道,Foxpro的Browse命令有一個(gè)參數,即lock。使用lock參數可指定不需滾動(dòng)就能在瀏覽窗口左分區中看見(jiàn)字段數,這樣在進(jìn)行數據瀏覽時(shí),如果使用browse lock 1命令就可以保證當發(fā)生水平滾動(dòng)而使第一列不可見(jiàn)時(shí),仍能在瀏覽窗口的左分區中看到第一列的內容。事實(shí)上,在很多情況下,第一列往往是整條記錄的標識或提示信息,用戶(hù)在通過(guò)網(wǎng)格輸入帶有很多字段的數據時(shí),總希望即使發(fā)生水平滾動(dòng)后也能看到第一列的提示,這時(shí)lock提供的方式就非常有用。
  我們也希望能在網(wǎng)格中實(shí)現這一點(diǎn),事實(shí)上由于網(wǎng)格提供面板屬性(Panel),因此實(shí)現該功能是非常容易的,只要在表單設計時(shí)就將網(wǎng)格分為兩個(gè)面板即可。但這里我們想提出一個(gè)更難一些的問(wèn)題,即希望當網(wǎng)格的右面板的第一列可見(jiàn)時(shí),左面板消失,因為這時(shí)并不需要顯示兩個(gè)第一列;而當網(wǎng)格的右面板的第一列不可見(jiàn)時(shí),左面板出現并顯示第一列的內容。也就是說(shuō),實(shí)現網(wǎng)格兩個(gè)面板的自動(dòng)拆分。
  2. 解決方法
  解決此問(wèn)題的關(guān)鍵仍然在于利用網(wǎng)格提供的BeforeRowColChange或AfterRowColChange事件。下面是網(wǎng)格的AfterRowColChange事件代碼:
  LPARAMETERS nColIndex
  IF This.RelativeColumn#This.ActiveColumn
  This.Partition=100
  ELSE
  This.Partition=0
  ENDIF
  我們對上述代碼的有關(guān)問(wèn)題做一簡(jiǎn)單分析。
  (1)Partition屬性
  網(wǎng)格的Partition屬性指定一個(gè)表格是否拆分為兩個(gè)面板,并且指定相對于表格左邊的拆分位置。 當設置Partition屬性值為零時(shí),表示不拆分表格;為非零時(shí)表示拆分位置的值(實(shí)際上就是左面板的寬度)。在上述代碼中,當網(wǎng)格的RelativeColumn屬性不等于A(yíng)ctiveColumn屬性時(shí),表示網(wǎng)格進(jìn)行了水平滾動(dòng)使第一列不再可見(jiàn),從而需要進(jìn)行窗口拆分;否則就不進(jìn)行拆分。
  (2)使用BeforeRowColChange還是使用AfterRowColChange事件?
  本例與上例不一樣,使用BeforeRowColChange和AfterRowColChange事件的效果是不同的。因為進(jìn)行拆分必須當列變化以后再加以判斷,因此應該使用AfterRowColChange事件。如果使用BeforeRowColChange事件,也能進(jìn)行拆分,但總是漏掉一列,即當網(wǎng)格的第一列第一次不可見(jiàn)時(shí),不能進(jìn)行拆分,按右箭頭鍵再向后移動(dòng)就可以了。
  3. 問(wèn)題討論
  實(shí)現了AfterRowColChange事件代碼后,當移動(dòng)箭頭鍵時(shí)可以進(jìn)行網(wǎng)格拆分,但仍存在一個(gè)問(wèn)題,即當用鼠標拖動(dòng)水平卷滾條時(shí)網(wǎng)格仍不能進(jìn)行拆分。解決此問(wèn)題的關(guān)鍵在于網(wǎng)格的Scrolled事件,此事件當單擊水平或垂直滾動(dòng)條,或移動(dòng)滾動(dòng)條中的滾動(dòng)塊時(shí)發(fā)生。下面是該事件的代碼:
  LPARAMETERS nDirection
  IF nDirection>=4
  IF This.RelativeColumn#This.ActiveColumn
  This.Partition=100
  ELSE
  This.Partition=0
  ENDIF
  ENDIF
  這里nDirection>=4表示進(jìn)行的卷滾是水平方向的(詳細情況可見(jiàn)VFP的幫助),下面幾行代碼所做的工作與AfterRowColChange事件代碼一樣。實(shí)現了上述代碼后,網(wǎng)格在用鼠標拖動(dòng)水平卷滾條或單擊滾動(dòng)塊時(shí)均可以自動(dòng)拆分。
 
 
本站僅提供存儲服務(wù),所有內容均由用戶(hù)發(fā)布,如發(fā)現有害或侵權內容,請點(diǎn)擊舉報。
打開(kāi)APP,閱讀全文并永久保存 查看更多類(lèi)似文章
猜你喜歡
類(lèi)似文章
grid 當前記錄行 反色顯示 總弄不成?解決方法
編程入門(mén)網(wǎng)-VFP經(jīng)典問(wèn)題集(全)
理解GridView控件
第八章 表單設計
VFP的表格透析 [IT行內話(huà)]
在查詢(xún)和報表中使用參數 - Access - Microsoft Office
更多類(lèi)似文章 >>
生活服務(wù)
分享 收藏 導長(cháng)圖 關(guān)注 下載文章
綁定賬號成功
后續可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服

欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久