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

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

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

開(kāi)通VIP
vfp含GRID通用表單的設置
Grid是VFP功能強大的表格(或者說(shuō)網(wǎng)格)控件,它提供了比Browse窗口強大得多的控制方式。Grid是包含列對象的容器對象,而列對象包含了列標題對象及列控件對象,均有各自相應的屬性集,因此我們可以完全控制表格中的任何一個(gè)元素,設計出通用的報表錄入界面。   
下面我們就詳細討論如何使用Grid控件設計通用錄入界面,并解決幾個(gè)設計過(guò)程中經(jīng)常碰到的問(wèn)題。  

  一、基本原理思路  

  設計靈活性、通用性較強的錄入界面較為合適的方法是:采用數據表(DBF文件)控制Grid控件的行列顯示信息、顯示方式。因此,我們將Grid控件的數據源RecordSource設為數據表(DBF文件),其數據格式、顯示方式及行列提示信息則分別由數據表RowMsg.DBF(控制表格的行即記錄方面信息)、ColMsg.DBF(數據格式并控制Grid控件的列方面信息)進(jìn)行控制。另外,一般來(lái)說(shuō)指定Grid控件第一列顯示行提示信息,若有多個(gè)提示信息字段,可連接處理為一列。  

  二、前期準備工作  

  1.創(chuàng )建表RowMsg.DBF,該表有2個(gè)字段,用于顯示Grid控件行信息:   

Create Table RowMsg(Code C(5),Name C(33))  

  2. 創(chuàng )建表ColMsg.DBF,該表有6個(gè)字段,用于控制、顯示表格各列信息:  

Create Table ColMsg(Code C(5),Name C(20),NeedIn L(1),Field_Name C(10),Field_Type C(1),Field_Len N(3),Field_Dec N(3))  

  3.創(chuàng )建表單In_Grid,將其屬性Name改為“FrmGrid”, Caption改為“數據錄入/修改窗口”;在表單上放置Grid控件,將其屬性Name改為“GridDat”;在表單上放置Command控件,將其屬性Name改為“CmdExit”, Caption改為“關(guān)閉退出”。  

  三、初步設計工作  

  1.先在表單的Init事件中寫(xiě)入如下代碼:  

Set Talk Off  

Set Safe Off  

CLOSE ALL  

With ThisForm  

.AutoCenter=.T. &&表單自動(dòng)居中  

.ControlBox=.F. &&去除表單的控制框  

.Width=_Screen.Width &&表單寬度同屏幕  

EndWith  

**/由ColMsg.DBF生成輸入數據表Dat.DBF **/  

Sele 0  

Use ColMsg  

Copy To TmpStru Field Field_Name,Field_Type,Field_Len,Field_Dec  

Copy To TmpColMsg For NeedIn  

Create Dat From TmpStru &&生成Dat.DBF  

Eras TmpStru.DBF  

Sele 0  

Use TmpColMsg Alias ColMsg  

Sele 0  

Use RowMsg  

Index On AllTrim(Code) To TmpRowMsg  

Scan  

Insert Into Dat(Code) Values (RowMsg.Code) &&由RowMsg.DBF生成Dat.DBF的所有記錄  

EndScan  

Sele Dat  

Go Top  

Set Rela To AllTrim(Code) Into RowMsg  

With ThisForm.GridDat  

.FontName="宋體"  

.FontSize=10  

.DeleteMark=.F. &&去除Grid的刪除標記列,以美化界面  

.RecordMark=.F. &&去除Grid的記錄選擇標記列,以美化界面  

.ScrollBars=0 &&去除Grid的水平及垂直滾動(dòng)條,以美化界面  

.AllowHeaderSizing=.F.&&設定Grid的標題欄的高度不可改變  

.AllowRowSizing=.F. &&設定Grid的各行高度不可改變  

.ColumnCount=Recc("ColMsg")+1  

.RecordSourceType=2  

.RecordSource="Dat" 

**/下面指定表格第一列顯示行提示信息,并設置該列有關(guān)屬性。/**  

.Column1.ControlSource="Code+RowMsg.Name" &&將2個(gè)提示信息字段連接處理為一列  

.Column1.Enabled=.F. &&該列不能編輯,焦點(diǎn)也不能移入  

.Column1.Width=300   

.Column1.BackColor=RGB(192,192,192)  

.Column1.Header1.Caption="指標代碼及名稱(chēng)"  

**/下面指定表格其他列及其標題,并設置有關(guān)屬性。/**  

Sele ColMsg  

Scan  

lcCol=AllTrim(Str(Recn()+1,5))  

With .Column&lcCol.  

.ControlSource="Dat."+Alltrim(Field_Name)  

.Header1.Caption=AllTrim(Name)  

.Width=90  

EndWith  

EndScan  

**/下面設置表格寬度,并使其水平居中。/**  

lnGridLen=.Column1.Width+Recc("ColMsg")*.Column2.Width+10  

.Width=IIF(m.lnGridLen>ThisForm.Width*0.95,ThisForm.Width*0.95,m.lnGridLen)  

.Left=(ThisForm.Width - .Width)/2  

ThisForm.CmdExit.Left= (ThisForm.Width - ThisForm.CmdExit.Width)/2 &&使命令按鈕水平居中  

EndWith  

  2.在命令按鈕CmdExit的Click事件中寫(xiě)入代碼:ThisForm.Release  

  至此, 該表單已可順利運行。 

四、進(jìn)一步完善 

  該表單雖已可順利運行,但卻存在著(zhù)如下兩個(gè)主要不足之處: 

  1.輸入焦點(diǎn)不能自動(dòng)下移,即在第一行最后一個(gè)字段上打回車(chē)鍵,焦點(diǎn)不能自動(dòng)轉到下一行的第一個(gè)字段上,而是回到第一行的第一個(gè)字段上。 


  2.信息提示列(最左一列)無(wú)法固定,即隨著(zhù)輸入焦點(diǎn)的右移,信息提示列將移出屏幕而不再可見(jiàn),失去其信息提示的作用。 

  下面我們就來(lái)詳細討論并解決這兩個(gè)難題。 

  (一) 輸入焦點(diǎn)自動(dòng)下移 

  解決此問(wèn)題可用的方法較多。經(jīng)過(guò)多方比較、測試,我們認為采用表單的KeyPress事件解決這個(gè)問(wèn)題較為合適(當然采用Grid控件的BeforeRowColChange事件或AfterRowColChange事件也完全可以)。KeyPress事件在用戶(hù)按下并釋放某鍵時(shí)發(fā)生,由具有焦點(diǎn)的對象接收。表單可在下列兩種情況下接收KeyPress事件: 

  (1)表單中不包含任何控件或所有控件都不可見(jiàn)或都未激活。(2)表單的KeyPreview 屬性設置為.T.。 

  顯然本例不適用情況(1),只適用情況(2)。為此,需在表單的Init事件代碼中增加如下代碼: 

   ThisForm.KeyPreview=.T. 

  然后在表單的KeyPress事件中寫(xiě)入如下代碼: 

LPARAMETERS nKeyCode, nShiftAltCtrl &&這行代碼由系統自動(dòng)產(chǎn)生,不必錄入 

**/判斷當前焦點(diǎn)是否在Grid控件上及按鍵是否是回車(chē)鍵或TAB鍵**/ 

With ThisForm.ActiveControl 

IF Upper(.Name)=’GRIDDAT’ And (m.nKeyCode=13 OR m.nKeyCode=9) 

if .ActiveColumn=Recc("ColMsg")+1 &&判斷當前焦點(diǎn)是否在Grid控件的最后一個(gè)字段上 

KeyBoard "{DnArrow}" Plain &&是則下移一行 

Endif 

ENDIF 

EndWith 
    
  至此, 輸入焦點(diǎn)自動(dòng)下移的問(wèn)題基本解決。
(二) 固定信息提示列(最左一列) 

  一般情況下,第一列往往是整條記錄的提示信息。Foxpro的Browse命令有Lock參數,可指定在瀏覽窗口左分區中可見(jiàn)字段數,這樣在數據瀏覽時(shí),可保證當發(fā)生水平滾動(dòng)而使最左幾列不可見(jiàn)時(shí),仍能在瀏覽窗口的左分區中看到這幾列的內容。這在輸入帶有較多字段的數據情況下非常有用。 

  在Grid控件中可通過(guò)設置其Panel、Partition及PanelLink屬性解決這個(gè)問(wèn)題。這里我們要解決更難些的問(wèn)題: 當Grid控件右面板的第一列可見(jiàn)時(shí),左面板第一列消失,因為這時(shí)不需要顯示兩個(gè)第一列;而當Grid控件右面板的第一列不可見(jiàn)時(shí),左面板顯示第一列的內容。也即所謂的固定信息提示列(最左一列)。 

  解決此問(wèn)題的方法也很多,為簡(jiǎn)化編程,我們仍采用表單的Init事件及KeyPress事件(當然也可采用Grid控件的BeforeRowColChange事件或AfterRowColChange事件)。 

  在表單的Init事件代碼中增加如下代碼: 

  注:Partition屬性指定一個(gè)表格是否拆分為兩個(gè)分區,并且指定相對于表格左分區的拆分位置。當Partition設置為零時(shí),表示不拆分表格;為非零時(shí)表示拆分位置的值(實(shí)際上就是左分區的寬度)。這里我們判斷一下該Grid控件的寬度是否超過(guò)表單寬度(實(shí)際上是表單寬度乘0.95,以使Grid左右留有一定空白,以美化界面),是則Partition設置為信息提示列的寬度,以適應前面提出的固定信息提示列的要求;否則Partition設置為零(因為此時(shí)已不需要分區)。 

  (三)其他細節問(wèn)題 

  經(jīng)過(guò)上述一系列改進(jìn)后,報表通用錄入界面已基本實(shí)現,但仍存在著(zhù)幾個(gè)細節問(wèn)題: 

 ?。?) 初始進(jìn)入該界面及錄完一行進(jìn)入下一行時(shí),信息提示列會(huì )出現重復顯示,如附圖1示,解決方法:分別在表單的Init事件及KeyPress事件代碼中適當位置增加如下代碼即可: KeyBoard "{TAB}{BACKTAB}" Plain 

 ?。?) 我們希望在最后一行的最后一列數據在打回車(chē)后,焦點(diǎn)能自動(dòng)移到命令按鈕上,以便我們選擇進(jìn)行下一步工作, 如”存盤(pán)退出”. “繼續錄入”. “放棄關(guān)閉”等等,實(shí)踐中發(fā)現在KeyPress事件代碼中適當位置增加ThisForm.CmdExit.SetFocus()不行,只能用KeyBoard "{Ctrl+Tab}" Plain實(shí)現。 

 ?。?) 不設置水平及垂直滾動(dòng)條的優(yōu)點(diǎn)顯而易見(jiàn),一是界面簡(jiǎn)潔美觀(guān),如附圖2示, 帶有水平及垂直滾動(dòng)條的錄入界面顯得不簡(jiǎn)潔,有些拖泥帶水,且右分區的左下端垂直滾動(dòng)條上的那個(gè)細黑條是分區標志,拉動(dòng)它可以重新調整左右分區,以致破壞業(yè)已設計好的錄入界面;二是編程大大簡(jiǎn)化,如單擊水平滾動(dòng)條時(shí)左右分區的拆分會(huì )出現問(wèn)題(當然可通過(guò)Grid控件的Scrolled事件編程解決)。但不可否認也帶來(lái)上下左右翻屏的不便,主要是上下翻屏的不便(左右滾屏可通過(guò)連續按TAB鍵、Shift+TAB組合鍵實(shí)現)。上下翻屏原可通過(guò)PgUp/PgDn鍵解決,但此時(shí)使用PgUp/PgDn會(huì )出現信息提示列與右分區的數據列不相對應的情況,因此我們重新定義PgUp/PgDn鍵,在表單的Init事件代碼中增加如下2行代碼: 

ON KEY LABEL PgUp IIF(Bof("Dat"),Application.DoCmd("=MessAgeBox(’已是第一條記錄!’,; 

’提示信息’)"),Application.DoCmd("SKIP -12")) 

ON KEY LABEL PgDn IIF(EoF("Dat"),Application.DoCmd("=MessAgeBox(‘已是最后一條記錄!’,; 

’提示信息’)"),Application.DoCmd("SKIP 12")) 

  注:通過(guò)DoCmd函數、MessageBox函數實(shí)現以下功能: 

  按PgUp向上滾動(dòng)12行,若已到首行則提示“已是第一條記錄!”;按PgDn向下滾動(dòng)12行,若已到末行則提示“已是最后一條記錄!”。 

  五、結束語(yǔ) 

  至此,我們已較為圓滿(mǎn)的實(shí)現了使用Grid控件設計通用錄入界面。應該指出的是,可以進(jìn)一步完善的地方仍很多: 

  1.信息提示列及各數據列的寬度設置??捎肦owMsg.DBF及ColMsg.DBF中的相應字段長(cháng)度乘上某一系數得到,也可在RowMsg.DBF及ColMsg.DBF中設置相應字段直接確定其寬度。我們采用了前法。 

  2.水平及垂直滾動(dòng)條的設置。當數據列超過(guò)30列后,有水平滾動(dòng)條就顯得較為方便。遺憾的是,VFP本身未提供單獨的滾動(dòng)條控件(當然損失一些界面的美觀(guān)簡(jiǎn)潔,使用Grid控件自身的滾動(dòng)條完全可以實(shí)現),因此,我們只能使用OLE控件,如MicroSoft Forms 2.0 ScrollBar,并通過(guò)設置其相應的屬性及事件編程,解決這個(gè)問(wèn)題。本文限于篇幅,不再討論。另外,不使用Grid控件而直接使用已較好解決這些問(wèn)題第三方OLE控件,如TrueDBGrid、FlexGrid、MicroSoft DataGrid Control等等,也是一種解決方法,但已不屬本文范圍,不再討論。 

  本例在Windows9x/WindowsXP、Visual Foxpro 5.0/6.0下調試通過(guò)。本例所有事件的完整代碼附下。
表單的Init事件完整代碼如下: 

Set Talk Off 

Set Safe Off 

CLOSE ALL 

ON KEY LABEL PgUp IIF(Bof("Dat"),Application.DoCmd("=MessAgeBox(’已是第一條記錄!’,’提示信息’)"),Application.DoCmd("SKIP -12")) 

ON KEY LABEL PgDn IIF(EoF("Dat"),Application.DoCmd("=MessAgeBox(‘已是最后一條記錄!’,’提示信息’)"),Application.DoCmd("SKIP 12")) 

With ThisForm 

.KeyPreview=.T. 

.AutoCenter=.T. 

.ControlBox=.F.  

.Width=_Screen.Width 

EndWith 

Sele 0 

Use ColMsg 

Copy To TmpStru Field Field_Name,Field_Type,Field_Len,Field_Dec 

Copy To TmpColMsg For NeedIn 

Create Dat From TmpStru 

Eras TmpStru.DBF 

Sele 0 

Use TmpColMsg Alias ColMsg 

Sele 0 

Use RowMsg 

Index On AllTrim(Code) To TmpRowMsg 

Scan 

Insert Into Dat(Code) Values (RowMsg.Code) 

EndScan 

Sele Dat 

Go Top 

Set Rela To AllTrim(Code) Into RowMsg 

With ThisForm.GridDat 

.FontName="宋體" 

.FontSize=10 

.DeleteMark=.F. 

.ScrollBars=0 

.ColumnCount=Recc("ColMsg")+1 

.RecordSourceType=2 

.RecordSource="Dat" 

.Column1.ControlSource="Code+RowMsg.Name" 

.Column1.Enabled=.F. 

.Column1.Width=Len(Code+RowMsg.Name)*8 

.Column1.BackColor=RGB(192,192,192) 

.Column1.Header1.Caption=" 指標代碼及名稱(chēng) " 

.Panel=1 

.PanelLink=.T. 

lnGridLen=.Column1.Width+10 

Sele ColMsg 

Scan 

lcCol=AllTrim(Str(Recn()+1,5)) 

With .Column&lcCol. 

.ControlSource="Dat."+Alltrim(Field_Name) 

.Header1.Caption=AllTrim(Name) 

.Width=Len(.Header1.Caption)*7 

lnGridLen=m.lnGridLen+.Width 

EndWith 

EndScan 

.Width=IIF(m.lnGridLen>ThisForm.Width,ThisForm.Width*0.95,m.lnGridLen) 

.Left=(ThisForm.Width - .Width)/2 

.Partition=IIF(m.lnGridLen>ThisForm.Width*.95,.Column1.Width,0) 

ThisForm.CmdExit.Left= (ThisForm.Width - ThisForm.CmdExit.Width)/2 
表單的KeyPress事件完整代碼如下: 

LPARAMETERS nKeyCode, nShiftAltCtrl 

With ThisForm.ActiveControl 

IF Upper(.Name)=’GRIDDAT’ And (m.nKeyCode=13 OR m.nKeyCode=9) 

IF .ActiveColumn=Recc("ColMsg")+1 

KeyBoard "{DnArrow}" Plain 

KeyBoard "{Tab}{BackTab}" Plain 

If .ActiveRow=Recc("RowMsg") 

KeyBoard "{Ctrl+Tab}" Plain 

Endif 

ENDIF 

ENDIF 

EndWith 

命令按鈕CmdExit的Click事件完整代碼如下: 

ON KEY LABEL PgUp 

ON KEY LABEL PgDn 

Close All 

Eras TmpColMsg.DBF 

Eras TmpRowMsg.IDX 

ThisForm.Release 

EndWith 

KeyBoard "{Tab}{BackTab}" Plain


本站僅提供存儲服務(wù),所有內容均由用戶(hù)發(fā)布,如發(fā)現有害或侵權內容,請點(diǎn)擊舉報。
打開(kāi)APP,閱讀全文并永久保存 查看更多類(lèi)似文章
猜你喜歡
類(lèi)似文章
看實(shí)例學(xué)VFP:commondialog控件
vfp6.0表格控件(grid)技巧篇
怎樣讓表格控件里每一列的text1的dblclick事件執行相同的代碼段???
編程入門(mén)網(wǎng)
編程入門(mén)網(wǎng)-解決VFP中表格控件Grid的數據源刷新問(wèn)題
巧用VFP的Grid表格控件
更多類(lèi)似文章 >>
生活服務(wù)
分享 收藏 導長(cháng)圖 關(guān)注 下載文章
綁定賬號成功
后續可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服

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