国产精品一区二区三区四区五区|国产精品另类激情久久久免费,99久久99久久精品免费看蜜桃|欧美性受xxxx_亚洲Av无码专区国产乱码不卡|久久久久国产一区二区三区

返回頂部
關(guān)閉軟件導(dǎo)航
位置:首頁(yè) > 資訊 > 其他>VFP中使用Grid控件設(shè)計(jì)通用錄入界面

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

  一重要作用、基本原理思路

  設(shè)計(jì)靈活性、通用性較強(qiáng)的錄入界面較為合適的方法是:采用數(shù)據(jù)表(DBF文件)控制Grid控件的行列顯示信息最為顯著、顯示方式切實把製度。因此,我們將Grid控件的數(shù)據(jù)源RecordSource設(shè)為數(shù)據(jù)表(DBF文件)自行開發,其數(shù)據(jù)格式進行部署、顯示方式及行列提示信息則分別由數(shù)據(jù)表RowMsg.DBF(控制表格的行即記錄方面信息)、ColMsg.DBF(數(shù)據(jù)格式并控制Grid控件的列方面信息)進(jìn)行控制應用情況。另外保護好,一般來(lái)說(shuō)指定Grid控件第一列顯示行提示信息,若有多個(gè)提示信息字段解決問題,可連接處理為一列系列。

  二、前期準(zhǔn)備工作

  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改為“數(shù)據(jù)錄入/修改窗口”;在表單上放置Grid控件,將其屬性Name改為“GridDat”智能化;在表單上放置Command控件,將其屬性Name改為“CmdExit”, Caption改為“關(guān)閉退出”科技實力。

  三、初步設(shè)計(jì)工作

  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生成輸入數(shù)據(jù)表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

數(shù)據(jù)錄入軟件

  Set Rela To AllTrim(Code) Into RowMsg

  With ThisForm.GridDat

  .FontName="宋體"

  .FontSize=10

  .DeleteMark=.F. &&去除Grid的刪除標(biāo)記列,以美化界面

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

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

  .AllowHeaderSizing=.F.&&設(shè)定Grid的標(biāo)題欄的高度不可改變

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

  .ColumnCount=Recc("ColMsg")+1

  .RecordSourceType=2

  .RecordSource="Dat"

  **/下面指定表格第一列顯示行提示信息建設,并設(shè)置該列有關(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="指標(biāo)代碼及名稱"

  **/下面指定表格其他列及其標(biāo)題,并設(shè)置有關(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

  **/下面設(shè)置表格寬度,并使其水平居中前來體驗。/**

  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

  至此, 該表單已可順利運(yùn)行自主研發。

  2

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

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

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

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

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

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

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

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

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

  ThisForm.KeyPreview=.T.

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

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

  **/判斷當(dāng)前焦點(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 &&判斷當(dāng)前焦點(diǎn)是否在Grid控件的最后一個(gè)字段上

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

  Endif

  ENDIF

  EndWith

  至此, 輸入焦點(diǎn)自動(dòng)下移的問(wèn)題基本解決新趨勢。

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

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

  在Grid控件中可通過(guò)設(shè)置其Panel、Partition及PanelLink屬性解決這個(gè)問(wèn)題應用優勢。這里我們要解決更難些的問(wèn)題: 當(dāng)Grid控件右面板的第一列可見(jiàn)時(shí),左面板第一列消失高質量發展,因?yàn)檫@時(shí)不需要顯示兩個(gè)第一列;而當(dāng)Grid控件右面板的第一列不可見(jiàn)時(shí)高效節能,左面板顯示第一列的內(nèi)容影響力範圍。也即所謂的固定信息提示列(最左一列)。

  解決此問(wèn)題的方法也很多新創新即將到來,為簡(jiǎn)化編程邁出了重要的一步,我們?nèi)圆捎帽韱蔚腎nit事件及KeyPress事件(當(dāng)然也可采用Grid控件的BeforeRowColChange事件或AfterRowColChange事件)。

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

  ThisForm.GridDat.Panel=1 &&指定右分區(qū)活動(dòng)

  ThisForm.GridDat.PanelLink=.T. &&左右分區(qū)相關(guān)聯(lián)

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

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

  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屬性指定一個(gè)表格是否拆分為兩個(gè)分區(qū)設施,并且指定相對(duì)于表格左分區(qū)的拆分位置需求。當(dāng)Partition設(shè)置為零時(shí),表示不拆分表格組合運用;為非零時(shí)表示拆分位置的值(實(shí)際上就是左分區(qū)的寬度)更讓我明白了。這里我們判斷一下該Grid控件的寬度是否超過(guò)表單寬度(實(shí)際上是表單寬度乘0.95,以使Grid左右留有一定空白,以美化界面)積極,是則Partition設(shè)置為信息提示列的寬度,以適應(yīng)前面提出的固定信息提示列的要求探索;否則Partition設(shè)置為零(因?yàn)榇藭r(shí)已不需要分區(qū))堅持先行。

  (三)其他細(xì)節(jié)問(wèn)題

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

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

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

 ⑴c水平。?) 不設(shè)置水平及垂直滾動(dòng)條的優(yōu)點(diǎn)顯而易見(jiàn),一是界面簡(jiǎn)潔美觀,如附圖2示, 帶有水平及垂直滾動(dòng)條的錄入界面顯得不簡(jiǎn)潔,有些拖泥帶水,且右分區(qū)的左下端垂直滾動(dòng)條上的那個(gè)細(xì)黑條是分區(qū)標(biāo)志通用表單數(shù)據(jù)錄入系統(tǒng) 服務效率,拉動(dòng)它可以重新調(diào)整左右分區(qū)明確相關要求,以致破壞業(yè)已設(shè)計(jì)好的錄入界面;二是編程大大簡(jiǎn)化統籌發展,如單擊水平滾動(dòng)條時(shí)左右分區(qū)的拆分會(huì)出現(xiàn)問(wèn)題(當(dāng)然可通過(guò)Grid控件的Scrolled事件編程解決)深化涉外。但不可否認(rèn)也帶來(lái)上下左右翻屏的不便,主要是上下翻屏的不便(左右滾屏可通過(guò)連續(xù)按TAB鍵生產製造、Shift+TAB組合鍵實(shí)現(xiàn))開展試點。上下翻屏原可通過(guò)PgUp/PgDn鍵解決,但此時(shí)使用PgUp/PgDn會(huì)出現(xiàn)信息提示列與右分區(qū)的數(shù)據(jù)列不相對(duì)應(yīng)的情況共同,因此我們重新定義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函數(shù)、MessageBox函數(shù)實(shí)現(xiàn)以下功能:

  按PgUp向上滾動(dòng)12行系統性,若已到首行則提示“已是第一條記錄勇探新路!”;按PgDn向下滾動(dòng)12行便利性,若已到末行則提示“已是最后一條記錄方法!”。

  五提供有力支撐、結(jié)束語(yǔ)

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

  1.信息提示列及各數(shù)據(jù)列的寬度設(shè)置自行開發∵M行部署?捎肦owMsg.DBF及ColMsg.DBF中的相應(yīng)字段長(zhǎng)度乘上某一系數(shù)得到,也可在RowMsg.DBF及ColMsg.DBF中設(shè)置相應(yīng)字段直接確定其寬度應用情況。我們采用了前法保護好。

  2.水平及垂直滾動(dòng)條的設(shè)置組建。當(dāng)數(shù)據(jù)列超過(guò)30列后,有水平滾動(dòng)條就顯得較為方便特點。遺憾的是,VFP本身未提供單獨(dú)的滾動(dòng)條控件(當(dāng)然損失一些界面的美觀簡(jiǎn)潔,使用Grid控件自身的滾動(dòng)條完全可以實(shí)現(xiàn))首次,因此,我們只能使用OLE控件,如MicroSoft Forms 2.0 ScrollBar部署安排,并通過(guò)設(shè)置其相應(yīng)的屬性及事件編程,解決這個(gè)問(wèn)題搖籃。本文限于篇幅,不再討論推廣開來。另外推動,不使用Grid控件而直接使用已較好解決這些問(wèn)題第三方OLE控件,如TrueDBGrid資源配置、FlexGrid信息、MicroSoft DataGrid Control等等,也是一種解決方法大力發展,但已不屬本文范圍豐富內涵,不再討論錄入系統(tǒng)工具。

  本例在Windows9x/WindowsXP產能提升、Visual Foxpro 5.0/6.0下調(diào)試通過(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"))

如果您覺(jué)得 VFP中使用Grid控件設(shè)計(jì)通用錄入界面 這篇文章對(duì)您有用,請(qǐng)分享給您的好友支撐作用,謝謝
文章地址:http://61py.com/article/other/VFPzsyGridkjsjtylrjm.html
解放雙手無(wú)盡可能,有問(wèn)題添加天線貓微信
老河口市| 滨海县| 呼伦贝尔市| 宁津县| 阳泉市| 肇东市| 辽宁省| 石河子市| 五家渠市| 略阳县| 密云县| 磴口县| 资阳市| 桂阳县| 和政县| 炉霍县| 和政县| 白玉县| 武平县| 大庆市| 盘锦市| 吉安县| 方正县| 天津市| 正阳县| 孟州市| 兴仁县| 郯城县| 兴业县| 本溪| 富阳市| 平果县| 韩城市| 汝南县| 丹江口市| 海城市| 阳朔县| 临沭县| 江川县| 紫金县| 赫章县|