国产亚洲欧美一区二区,亚洲欧洲国产一区,成人在线视频网,中文精品视频一区二区在线观看

返回頂部
關閉軟件導航
位置:首頁 > 資訊 > 其他>VFP中使用Grid控件設計通用錄入界面

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

  一、基本原理思路

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

  二、前期準備工作

  1.創建表RowMsg.DBF,該表有2個字段,用于顯示Grid控件行信息:

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

  2. 創建表ColMsg.DBF,該表有6個字段,用于控制、顯示表格各列信息:

  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.創建表單In_Grid,將其屬性Name改為“FrmGrid”, Caption改為“數據錄入/修改窗口”;在表單上放置Grid控件,將其屬性Name改為“GridDat”;在表單上放置Command控件,將其屬性Name改為“CmdExit”, Caption改為“關閉退出”。

  三、初步設計工作

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

  Set Talk Off

  Set Safe Off

  CLOSE ALL

  With ThisForm

  .AutoCenter=.T. &&表單自動居中

  .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的水平及垂直滾動條,以美化界面

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

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

  .ColumnCount=Recc("ColMsg")+1

  .RecordSourceType=2

  .RecordSource="Dat"

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

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

  .Column1.Enabled=.F. &&該列不能編輯,焦點也不能移入

檔案錄入軟件   .Column1.Width=300

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

  .Column1.Header1.Caption="指標代碼及名稱"

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

  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事件中寫入代碼:ThisForm.Release

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

  2

  四、進一步完善

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

  1.輸入焦點不能自動下移,即在第一行最后一個字段上打回車鍵,焦點不能自動轉到下一行的第一個字段上,而是回到第一行的第一個字段上。

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

  下面我們就來詳細討論并解決這兩個難題。

  (一) 輸入焦點自動下移

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

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

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

  ThisForm.KeyPreview=.T.

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

  LPARAMETERS nKeyCode, nShiftAltCtrl &&這行代碼由系統自動產生,不必錄入

  **/判斷當前焦點是否在Grid控件上及按鍵是否是回車鍵或TAB鍵**/

  With ThisForm.ActiveControl

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

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

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

  Endif

  ENDIF

  EndWith

  至此, 輸入焦點自動下移的問題基本解決。

  (二) 固定信息提示列(最左一列)

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

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

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

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

  ThisForm.GridDat.Panel=1 &&指定右分區活動

  ThisForm.GridDat.PanelLink=.T. &&左右分區相關聯

  ThisForm.GridDat.Patition= ThisForm.GridDat.Column1.Width

  **/注:m.lnGridLen是該Grid控件信息提示列及各數據列的寬度之和**/

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

  This.GridDat.Left=(ThisForm.Width - This.GridDat.Width)/2 &&使Grid控件居中

  This.GridDat.Partition=IIF(m.lnGridLen>This.Width*0.95,This.GridDat.Column1.Width,0)

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

  (三)其他細節問題

  經過上述一系列改進后,報表通用錄入界面已基本實現,但仍存在著幾個細節問題:

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

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

  (3) 不設置水平及垂直滾動條的優點顯而易見,一是界面簡潔美觀,如附圖2示, 帶有水平及垂直滾動條的錄入界面顯得不簡潔,有些拖泥帶水,且右分區的左下端垂直滾動條上的那個細黑條是分區標志通用表單數據錄入系統 ,拉動它可以重新調整左右分區,以致破壞業已設計好的錄入界面;二是編程大大簡化,如單擊水平滾動條時左右分區的拆分會出現問題(當然可通過Grid控件的Scrolled事件編程解決)。但不可否認也帶來上下左右翻屏的不便,主要是上下翻屏的不便(左右滾屏可通過連續按TAB鍵、Shift+TAB組合鍵實現)。上下翻屏原可通過PgUp/PgDn鍵解決,但此時使用PgUp/PgDn會出現信息提示列與右分區的數據列不相對應的情況,因此我們重新定義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"))

  注:通過DoCmd函數、MessageBox函數實現以下功能:

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

  五、結束語

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

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

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

  本例在Windows9x/WindowsXP、Visual Foxpro 5.0/6.0下調試通過。本例所有事件的完整代碼附下。

  表單的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"))

如果您覺得 VFP中使用Grid控件設計通用錄入界面 這篇文章對您有用,請分享給您的好友,謝謝
文章地址:http://m.brucezhang.com/article/other/VFPzsyGridkjsjtylrjm.html
解放雙手無盡可能,有問題添加天線貓微信
国产亚洲欧美一区二区,亚洲欧洲国产一区,成人在线视频网,中文精品视频一区二区在线观看
99re亚洲国产精品| 国产精品中文字幕欧美| 国产一区二区在线免费观看| 欧美激情精品| 亚洲美女视频在线观看| 欧美视频精品在线| 免费不卡在线观看av| 999亚洲国产精| 国产精品久久国产愉拍| 欧美极品影院| 亚洲午夜在线| 国产一区二区三区久久 | 国产精品扒开腿做爽爽爽视频 | 1000精品久久久久久久久| 免费亚洲电影在线| 一区二区三区免费观看| 亚洲国产欧美一区二区三区同亚洲 | 亚洲狼人综合| 国产精品久久久久久影院8一贰佰| 欧美xart系列在线观看| 这里只有精品视频在线| 国产日韩欧美成人| 国产精品成人v| 久久久久久自在自线| 亚洲另类春色国产| 亚洲高清毛片| 国产精品嫩草99a| 国产精品对白刺激久久久| 久久国产日韩欧美| 99爱精品视频| 亚洲毛片在线观看.| 国产一区二区三区丝袜| 国产精品夜夜嗨| 男男成人高潮片免费网站| 久久久爽爽爽美女图片| 一本久久综合亚洲鲁鲁五月天| 国产亚洲精品v| 国产亚洲精品自拍| 欧美日韩卡一卡二| 欧美日本久久| 久久久久成人精品免费播放动漫| 99在线精品免费视频九九视| 亚洲精品在线二区| 国产手机视频精品| 国产亚洲精品aa午夜观看| 欧美日韩视频不卡| 欧美日韩视频在线第一区| 久久精品一本| 久久久91精品国产一区二区三区 | 麻豆精品一区二区av白丝在线| 亚洲一区二区三区免费视频| 一区二区亚洲精品| 伊人久久av导航| 国产欧美一区二区精品性色| 国产麻豆精品theporn| 欧美精品色一区二区三区| 欧美精品播放| 久久久久久91香蕉国产| 另类国产ts人妖高潮视频| 欧美一二三区精品| 久久久久九九视频| 午夜精品三级视频福利| av成人福利| 亚洲综合视频网| 9久re热视频在线精品| 亚洲女人av| 一区二区三区日韩精品视频| 亚洲欧美日韩综合aⅴ视频| 99精品视频一区二区三区| 午夜国产精品视频免费体验区| 久久久久se| 久久精品人人爽| 欧美电影在线观看| 久久综合网络一区二区| 欧美精品观看| 欧美成人国产一区二区| 欧美午夜精品一区二区三区| 欧美日韩亚洲另类| 国产日韩欧美制服另类| 国产精品欧美在线| 精品99一区二区| 好男人免费精品视频| 亚洲精品乱码久久久久久| 亚洲高清在线| 亚洲性xxxx| 久热精品视频在线| 久久永久免费| 欧美午夜三级| 国产精品第一页第二页第三页| 国产区日韩欧美| 国产欧美日韩伦理| 亚洲国产电影| 91久久精品一区| 午夜精品久久久久久久白皮肤| 久久久99免费视频| 久久久噜噜噜久久中文字幕色伊伊 | 久久综合久久综合久久综合| 久久久99免费视频| 欧美日韩国产一区二区| 欧美日韩 国产精品| 国产色综合天天综合网| 国产欧美日韩精品一区| 亚洲人成7777| 亚洲精品美女91| 欧美专区一区二区三区| 欧美日韩一区二区在线观看| 欧美涩涩视频| 在线观看国产日韩| 91久久国产精品91久久性色| 午夜伦理片一区| 欧美精品一区二区三区在线播放 | 日韩视频在线一区二区三区| 欧美一区午夜精品| 欧美日韩国产丝袜另类| 欧美午夜无遮挡| 亚洲国产精品123| 日韩视频国产视频| 久久婷婷成人综合色| 国产精品久久久久永久免费观看| 国产精品免费区二区三区观看| 亚洲高清av| 久久久精品视频成人| 欧美激情aaaa| 含羞草久久爱69一区| 在线看成人片| 久久aⅴ乱码一区二区三区| 国产精品激情电影| 国产一区高清视频| 亚洲欧美成人一区二区三区| 欧美日韩国产高清视频| 国产精品自在欧美一区| 中日韩美女免费视频网址在线观看| 久久综合久久综合这里只有精品 | 久久久久一区二区三区| 免费观看国产成人| 国产一区二区日韩| 亚洲精品久久久久久一区二区| 久久精品亚洲一区| 国产视频在线观看一区| 亚洲电影免费观看高清| 久久久久成人精品| 国产毛片久久| 最新国产の精品合集bt伙计| 久久久免费精品| 国产欧美日韩三区| 亚洲黄色大片| 免费黄网站欧美| 在线成人激情视频| 在线视频精品一区| 欧美日韩精品不卡| 亚洲蜜桃精久久久久久久| 欧美二区在线看| 国产日韩欧美综合| 欧美一区二区三区免费观看视频| 国产精品久久久久久超碰| 亚洲电影有码| 噜噜噜躁狠狠躁狠狠精品视频 | 亚洲国内高清视频| 毛片一区二区| 亚洲第一精品影视| 另类激情亚洲| 国产精自产拍久久久久久| 亚洲欧洲av一区二区三区久久| 国产精品任我爽爆在线播放| 在线观看一区视频| 美女成人午夜| 亚洲国产日韩欧美在线图片| 美女露胸一区二区三区| 国产精品乱码久久久久久| 亚洲一区二区毛片| 国产精品露脸自拍| 亚洲精品一区在线| 欧美日韩精品一区| 中文在线资源观看网站视频免费不卡 | 亚洲图片你懂的| 国产精品日本欧美一区二区三区| 最新热久久免费视频| 欧美日本一区二区三区| 亚洲一级一区| 国产欧美日韩亚州综合| 久久精品中文| 国产欧美丝祙| 久久这里有精品视频| 亚洲区国产区| 欧美亚州韩日在线看免费版国语版| 亚洲欧洲日韩综合二区| 欧美私人网站| 先锋亚洲精品| 一区二区三区在线免费视频 | 国产伦精品一区二区三区高清| 欧美一区二区三区在线看| 精品91久久久久| 欧美精品大片| 亚洲人成艺术| 国产精品网曝门| 久久久青草青青国产亚洲免观| 亚洲国产精品va在看黑人| 欧美日韩三级在线| 亚洲免费成人av| 国产精品视频最多的网站|