象VFP8一樣,VFP9的許多改進(jìn)建議也是來自全球的各個(gè)VFP社區(qū)。(大大小小的建議,很難知道是誰提出了這些好建議)。不過盡管改進(jìn)很多,我們也必須承認(rèn),VFP的很多方面還沒被照顧到。
總的看來,VFP9帶給我們的是:修補(bǔ)了很多BUG;彌補(bǔ)了一些功能的缺陷或?qū)崿F(xiàn)了過去曾提出過的一些設(shè)想;某些功能被重寫發(fā)生了翻天覆地的變化……當(dāng)然,你所渴望的某些功能或許在或許不在這個(gè)版本里面,但可以確定你能從那個(gè)“What's New”文檔中發(fā)現(xiàn)一些有價(jià)值的東西。記住,嘗試測試版總要帶點(diǎn)探險(xiǎn)精神的。 我寫這篇文章的時(shí)候,是在VFP測試版發(fā)布前的幾個(gè)星期,VFP文檔有些地方跟不上VFP軟件的更新,這就意味著你拿到的測試版拷貝會(huì)和文檔有些出入,所以很自然,嘗試測試版軟件總要帶點(diǎn)探險(xiǎn)精神的,呵呵。
如何在BROWSE窗口顯示MEMO提示(移動(dòng)鼠標(biāo)到MEMO字段上面顯示4095個(gè)字符);如何禁止打開表對話框并返回一個(gè)錯(cuò)誤(SET TABLEPROMPT OFF);如何用 SET REFRESH 指定更快的刷新率;如何在 命令按鈕/選項(xiàng)按鈕/檢查框 中隱藏CAPTION后還能使用熱鍵/圖像(通過設(shè)置一個(gè)新的屬性PicturePosition=14-No Text)。嗯……或者我應(yīng)該介紹這個(gè)?:為CURSOR對象提供的新屬性 OrderDirection ,在數(shù)據(jù)環(huán)境中將它設(shè)為 升序 或 降序;工具欄縱橫向改變時(shí)動(dòng)態(tài)調(diào)整分隔對象;用 Listbox.AutoHideScrollBar 屬性來隱藏滾動(dòng)條。
VFP6.0 中文版下載:http://innovatechautomation.com/k/vfp/
我苦思冥想,因?yàn)槲乙獜倪@個(gè)萬眾矚目的VFP9.0中選出10個(gè)典型的特性來闡述。 注:因?yàn)檫@篇文章基于VFP9的一個(gè)早期測試版,所以有的特征可能和現(xiàn)在有點(diǎn)出入。
1、 文本框自動(dòng)完成
你是否曾夢想過給文本框添加一種看起來更流行的“輸入常用的單詞或短語就出現(xiàn)一個(gè)下拉列表”的外觀?通過使用 VFP 智能感知的核心引擎,VFP 開發(fā)組給了我們這樣一種很酷的新功能,并且不但令人驚訝的易于使用,而且完全可以擴(kuò)充。 讓我們來嘗試一下,將一個(gè)文本框拖放到表單上(或者打開一個(gè)有文本框的任何一個(gè)表單),將文本框新的 AutoComplete 屬性設(shè)置為一個(gè)非零值,這樣就搞定了!運(yùn)行幾次這個(gè)表單,在文本框里輸入一些內(nèi)容,然后就看魔術(shù)表演吧!你也可以用下面這樣的代碼來讓表格中的文本框支持 AutoComplete: THISFORM.Grid1.Column1.Text1.AutoComplete = 1 AutoComplete 屬性控制著自動(dòng)完成的行為表現(xiàn),可用的值如下:
※ 0 —— 不使用自動(dòng)完成;
※ 1 —— 按字母順序;
※ 2 —— 最常用的;
※ 3 —— 最近使用的;
※ 4 —— 用戶自定義的加權(quán)排序(Weighted Order);
這些選項(xiàng)中的最后一個(gè)需要特別注意一下。當(dāng) AutoComplete 的值在 1-3 之間的時(shí)候,自動(dòng)完成的功能是系統(tǒng)自維護(hù)的,而用戶自定義加權(quán)排序的值4則讓你可以通過給 AutoComp.DBF 表中的 Weight 字段賦以一個(gè)數(shù)值型值來指定各個(gè)數(shù)據(jù)項(xiàng)的顯示順序(最大的 Weight值顯示在下拉列表的頂部)。 默認(rèn)的 AutoComp.DBF 表位于 HOME(7) 目錄下(譯者注:使用參數(shù)7,該函數(shù)返回用戶應(yīng)用程序的數(shù)據(jù)目錄。),但你可以通過在全局的層次上設(shè)置 _SCREEN.AutoCompTable、或者在單個(gè)文本框的層次上設(shè)置 Text1.AutoCompTable來覆蓋默認(rèn)的設(shè)置。不管你在哪個(gè)屬性中指定一個(gè)表,如果這個(gè)表不存在,則系統(tǒng)會(huì)自動(dòng)為你新建一個(gè)。你可以同時(shí)擁有多個(gè)AutoComp表,而每個(gè)表也可以服務(wù)于一個(gè)或多個(gè)文本框,VFP會(huì)管理這些在一個(gè)隱藏的數(shù)據(jù)工作期內(nèi)的表的打開和關(guān)閉。 在 AutoComp 表中,除非你給文本框設(shè)置了 AutoCompSource 屬性,否則這個(gè)文本框的 Name 將作為決定顯示哪些數(shù)據(jù)項(xiàng)的查詢關(guān)鍵字,反之,則使用 AutoCompSource 屬性指定的值。要想讓多個(gè)文本框共享自動(dòng)完成提供的值的話,只要簡單的把這些文本框的 AutoCompSouce 屬性設(shè)置為相同的值就可以里,例如設(shè)置為 NameAutoComp或者Cities。 通過在運(yùn)行時(shí)將 AutoCompSource 動(dòng)態(tài)的設(shè)置為一個(gè)代表某個(gè)用戶的特定代碼的字符串、或者在屬性表中設(shè)置如下的代碼,你甚至可以為你所在組織中的每個(gè)人啟用獨(dú)特的自動(dòng)完成列表: = "Custs_" + LoginName 不過,如果采用了這種辦法,你需要注意的是在 AutoComp 表中作為搜索關(guān)鍵字的 Source 字段只有 20個(gè)字符大小。當(dāng)然,你可以自己建一個(gè)有著更大長度的 Source 字段的表作為 AutoComp 表,可是如果在為一個(gè)特定的文本框初次使用AutoComplete功能的時(shí)候你讓 VFP 自動(dòng)為你建立這個(gè)表,那么這個(gè)表中的 Source 字段的長度默認(rèn)就是 20個(gè)字符。 要在測試的時(shí)候看看 AutoComp 表中發(fā)生了什么事情,你可以從 VFP 的另一個(gè)數(shù)據(jù)工作期內(nèi)共享打開這個(gè)表來瀏覽它的內(nèi)容,或者也可以在命令窗口中執(zhí)行如下代碼:
USE HOME(7) + "autocomp.dbf" SHARED IN 0
SELECT autocomp
BROWSE
2、 使用新的報(bào)表引擎來建立 HTML 或者 XML
** 取得一個(gè)對 HTMLListener 類的引用
DO (_reportoutput) WITH 5, olistener ** 在執(zhí)行下面的命令后會(huì)關(guān)閉用戶界面的返回和提示
olistener.quietmode = .T. ** 指定自己的文件名和目錄
olistener.targetfilename = "c:\htmltest.htm" ** 運(yùn)行一個(gè)將會(huì)引用我們已經(jīng)設(shè)置好了的 listener 的報(bào)表
REPORT FROM (_samples + "solution\reports\ledger.frx") ;
OBJECT olistener ** 在瀏覽器中顯示結(jié)果
RUN /n Explorer.exe c:\htmltest.htm 你可以用類似的途徑來使用 XMLListener 以建立一個(gè)帶有所有數(shù)據(jù)的 XML 文件。 注意:由于 _reportoutput 也許并非總是指向默認(rèn)的 ReportOutput.app,所以,更安全的辦法是從FFC基礎(chǔ)類庫中新的 _reportlistener.vcx 類庫來建立 XMLListener 或者 HTMLListener 的實(shí)例,入下面的示例所示: ** 在我手里的 Beta 版需要 Set safety off
SET SAFETY OFF
LOCAL olistener
** 獲得對 FFC 基礎(chǔ)類庫中的 _Reportlistener.vcx
** 類庫中的 XMLListener 類的一個(gè)引用
olistener = NEWOBJECT("XMLListener", ;
HOME(0) + "ffc\_reportlistener.vcx")
** 在執(zhí)行下面的命令后會(huì)關(guān)閉用戶界面的返回和提示
olistener.quietmode = .T. ** 只包含數(shù)據(jù),不帶布局信息
olistener.xmlmode = 0 && 只包含數(shù)據(jù) ** 指定自己的文件名和路徑
olistener.targetfilename = "c:\xmltest.xml" ** 運(yùn)行一個(gè)將會(huì)引用已經(jīng)設(shè)置好了的 listener 的報(bào)表
REPORT FROM (_samples + "solution\reports\ledger.frx") ;
OBJECT olistener ** 在瀏覽器中顯示結(jié)果
RUN /n Explorer.exe c:\xmltest.xml 當(dāng) XML 數(shù)據(jù)彈出在瀏覽器中的時(shí)候,注意它的 段,其中包含著許多表示報(bào)表中原有的帶區(qū)的標(biāo)志,例如
3、 組合多個(gè) ReportListener 以提供多種輸出
從前面的例子上再走遠(yuǎn)一點(diǎn),讓我們來看看你可以怎樣通過組合多個(gè) ReportListener 來實(shí)現(xiàn)在同一個(gè)運(yùn)行中的報(bào)表上提供多種輸出方案。在默認(rèn)的 ReportOutput.app(以及在新的 _reportListerer.vcx FFC 基礎(chǔ)類庫中)提供的 ReportListener 的子類有一個(gè)屬性叫 Successor,可以用這個(gè)屬性記錄下對另一個(gè)個(gè) ReportListener 實(shí)例的引用,而個(gè)被引用的實(shí)例將被掛鉤到報(bào)表生成引擎上,因而是起著主導(dǎo)作用的“主控 Listener”。 在下面的示例中,我通過執(zhí)行 DO (_reportoutput) 兩次來建立兩個(gè) listener,每次執(zhí)行的時(shí)候都傳遞給它一個(gè)變量,以返回一個(gè)對帶有正確的輸出類型的Listener的對象引用,輸出類型是 (_reportoutput)程序決定的。在下面的代碼中,olistener 接收到一個(gè)對一個(gè)輸出類型為 0 (打印輸出)的 listener 的對象引用,而 olistener2 則接收到一個(gè)輸出類型為4的 XMLListener對象的引用。 現(xiàn)在,我們有一個(gè)全局的集合(_oReportOutput),該集合中擁有對緩存中的打印和XML兩個(gè)Listener的引用,而我們則將這兩個(gè) Listener 引用為 olistener 和 olistener2,F(xiàn)在,為了演示從 ReportOutput.app 來取得一個(gè) ReportListener 的引用的另一種辦法,我們象這樣給集合添加另一個(gè)將被放入緩存中的 HTMLListener 的實(shí)例:DO (_reportoutput) WITH 5 注意,現(xiàn)在我們可以通過集合引用的辦法來操作 HTMLListener 的屬性,象這樣: _ReportOutput("5").targetfilename = "c:\htmltest2.htm" 現(xiàn)在剩下的活是將這三個(gè) Listener 象鏈條一樣的串連起來,輸出類型為0的打印Listener放在鏈條的最前面。
這個(gè) Listener 將是我們在使用 REPORT FROM 命令的時(shí)候放在 OBJECT 子句里面去的那個(gè),這樣一來,它就變成了一個(gè)“驅(qū)動(dòng),或者主控”listener,而它會(huì)與另外兩個(gè)與它在一條鏈條上的 listener 進(jìn)行通訊。將它們鏈接起來的代碼是: olistener.successor = olistener2
olistener2.successor = _oReportOutput("5") 就是這樣,F(xiàn)在,運(yùn)行這個(gè)報(bào)表,從同一次運(yùn)行你就會(huì)獲得三種類型的輸出——在默認(rèn)打印機(jī)上的一個(gè)報(bào)表、一個(gè)只帶著數(shù)據(jù)的 XML 文件、以及一個(gè)顯示著報(bào)表的 HTML 頁面。 LOCAL olistener, olistener2 * 獲得一個(gè)對打印類的引用
DO (_reportoutput) WITH 0, olistener * 獲得一個(gè)對 XMLListener 類的引用
DO (_reportoutput) WITH 4, olistener2 * 關(guān)閉用戶界面的返回和提示
olistener2.quietmode=.T. * 只包含數(shù)據(jù),不帶布局信息
olistener2.xmlmode=0 * 指定文件名和路徑,并關(guān)閉文件名提示
olistener2.targetfilename = "c:\xmltest2.xml"
olistener2.quietmode=.T. * 現(xiàn)在為 HTML 輸出做準(zhǔn)備,但使用另一種辦法來從全局的
* _oreportoutput 集合中獲得一個(gè)對listener 的引用
DO (_reportoutput) WITH 5 * 通過集合引用來設(shè)置 HTMLListener 的屬性
_oReportOutput("5").targetfilename = "c:\htmltest2.htm"
_oReportOutput("5").quietmode=.T. * 把三個(gè) listeners 象鏈條一樣的鏈接在一起
* 其中,用打印 listener 作為驅(qū)動(dòng)
olistener.successor = olistener2
olistener2.successor = _oReportOutput("5") * 運(yùn)行一個(gè)雇員電話號碼列表,引用在列表中的第一個(gè) listener
REPORT FORM (_samples+"solution\reports\ledger.frx") ;
OBJECT olistener * 在瀏覽器中顯示 XML 和 HTML 結(jié)果
* 并在打印機(jī)上打印報(bào)表
RUN /n Explorer.exe c:\xmltest2.xml
RUN /n Explorer.exe c:\htmltest2.htm
VFP9.0 中文漢化版下載:http://innovatechautomation.com/k/vfp/
4、 將報(bào)表保存為圖形文件
ReportListener 的另一種很大的用途是通過在你專門的子類中覆蓋 OutputPage 方法來將一個(gè)報(bào)表保存為圖形文件?梢员4娴膱D形文件格式包括 EMF、JPEG、GIF、PNG、BMP、TIFF、以及多頁的 TIFF(這種格式對于用傳真發(fā)送報(bào)表來說特別有用)。 注意,在這個(gè)示例的代碼中,我將 ListenerType 屬性設(shè)置為了2,這意味著讓你自己來控制輸出,每次用參數(shù) nDeviceType = -1 調(diào)用 OutputPage 方法就打印一頁,但并不將輸出發(fā)送到一個(gè)打印設(shè)備。MyReportListener 有一個(gè)自定義的 OutputPage 方法,它先檢查 nDeviceType 的參數(shù)是否為 -1,然后再次調(diào)用 OutputPage 方法(給方法傳遞一個(gè)文件名和圖形文件類型),再執(zhí)行一個(gè) NODEFAULT。這個(gè)示例在生成第一頁的時(shí)候建立一個(gè) TIFF 文件,然后將其它的頁添加到同一個(gè)圖形文件中去。 LOCAL olistener * 建立一個(gè) ReportListener 的實(shí)例
olistener = CREATEOBJECT("MyTiffListener")
olistener.tifffilename = "c:\tifftest.tif" * 運(yùn)行一個(gè)將會(huì)引用我們設(shè)置好了的 Listener的 報(bào)表
REPORT FORM (_samples+"solution\reports\invoice.frx") ;
OBJECT olistener RANGE 1,2 * 在瀏覽器中顯示結(jié)果
RUN /n Explorer.exe c:\tifftest.tif DEFINE CLASS MyTiffListener AS ReportListener
tifffilename = []
listenertype = 2 && 一次一頁,不輸出 FUNCTION OutputPage(nPageNo, eDevice, nDeviceType)
* 由于 ListenerType 指定了 "不打印輸出"
* 在報(bào)表引擎調(diào)用這個(gè)方法的時(shí)候,nDeviceType 將會(huì)是 -1
* 而我們現(xiàn)在則捕捉這個(gè)條件,然后自己來調(diào)用
* OutputPage 方法,調(diào)用時(shí)帶上文件名和圖形類型參數(shù)
IF nDeviceType = -1 ;
AND NOT EMPTY(THIS.tifffilename)
IF nPageNo = 1
* 如果是第一頁,則建立TIFF文件
THIS.OutputPage(nPageNo, THIS.tifffilename, 101)
ELSE
* 否則,則向 TIFF 文件添加剩下的頁
* (這段代碼要運(yùn)行,首先 TIFF 文件必須已經(jīng)存在)
THIS.OutputPage(nPageNo, THIS.tifffilename, 201)
ENDIF
* 我們已經(jīng)用需要的設(shè)置調(diào)用過 OutputPage 方法了
NODEFAULT
ENDIF
ENDDEFINE
5、 使用新的超小型二進(jìn)制索引
VFP9引進(jìn)了一個(gè)新的索引類型---二進(jìn)制索引,它可以在任何邏輯表達(dá)式中被使用。據(jù)一些測試者講,這種新型索引的訪問速度和一般索引差不多,但是它的大小比一般索引要小90%,插入記錄時(shí)要快80%。
要建二進(jìn)制索引標(biāo)志,你要在表設(shè)計(jì)器中設(shè)置索引類型為二進(jìn)制,或者在Index命令中加入關(guān)鍵字BINARY:
INDEX ON MyNonNullableLogicalExpression TAG MyBinary BINARY
INDEX ON DELETED() TAG DELETED BINARY
要注意的是,你建二進(jìn)制索引或索引TAG的時(shí)候,不要 包含F(xiàn)OR子句 或 INDEX ON一個(gè)會(huì)得出NULL值的表達(dá)式。你也不能在SEEK或SET ORDER TO語句中使用二進(jìn)制索引。不過你可以在優(yōu)化的FILTER條件和SQL SELECT的WHERE子句中使用并得到好處。
為了配合新的二進(jìn)制索引,VFP9.0在SET DELETED ON環(huán)境中優(yōu)化了DELETED()。因?yàn)槎M(jìn)制索引已經(jīng)是“位”級了,VFP可以在內(nèi)存中更快地建立Rushmore,并且使用更少的局域網(wǎng)數(shù)據(jù)流量,從而大大提高了查詢的性能,F(xiàn)在你可以拿幾個(gè)變量和別人討論下在索引中使用DELETED()究竟會(huì)降低還是提高性能了。
6、 用新的ICASE()函數(shù)一行搞定
當(dāng)一個(gè)判斷點(diǎn)出現(xiàn)在你的程序中(特別是SQL SELECT命令),你以前只能用一連串的IIF()來解決。
新的ICASE()函數(shù)可以讓你建立更可靠更優(yōu)雅的代碼,它允許你使用包括OTHERWISE在內(nèi)的100個(gè)條件。比如,在你的SQL SELECT查詢中要用到一個(gè)字符串,這個(gè)字符串是根據(jù)銷售員的業(yè)績得出的一系列結(jié)果,代碼如下: CREATE TABLE lineitems (custcode I, purchases N)
FOR i = 1 TO 10
INSERT INTO lineitems valueS (i,800*(i-2))
E□□□OR
SELECT li.custcode, li.purchases, ;
PADR( ;
ICASE( li.purchases <= 0, "Drag on Profits", ;
li.purchases < 500, "Bread and Butter", ;
li.purchases < 2000, "Send Gift Box", ;
li.purchases < 5000, "Take to Ballgame", ;
"Trip to Hawaii" ;
), 20) AS CustStatus ;
FROM lineitems li 我指定了4個(gè)條件組,最后的那個(gè)"Trip to Hawaii"是OTHERWISE段。而且我把返回值用空格填充到固定的20個(gè)字符,因?yàn)樵赟QL SELECT中有時(shí)需要這么做。另外,不管你有偶數(shù)個(gè)參數(shù)還是奇數(shù)個(gè)參數(shù),每個(gè)CASE段的最后一個(gè)參數(shù)就是OTHERWISE的值。
7、 停靠你的表單
你現(xiàn)在可以用新的表單Dockable屬性把?啃袨榧尤氲侥愕某绦蛑。默認(rèn)的Dockable值是0,跟以前版本的行為一致。然而,如果你把Dockable設(shè)為1或2,表單的標(biāo)題欄高度就會(huì)變成原來的一半,這時(shí)表單就支持?苛耍ㄔO(shè)為1表示表單已?浚。
表單支持?浚―ockable設(shè)為1或2)后,你可以用WINDOWS菜單的Dockable項(xiàng)或在表單的標(biāo)題欄點(diǎn)擊鼠標(biāo)右鍵來切換這2種設(shè)置。當(dāng)Dockable=1時(shí),你可以將表單拖放到可?康奈恢茫阋部梢杂靡韵麓a實(shí)現(xiàn)?浚 * 1=top, 2=left, 3=right, 4=bottom
THISFORM.Dock(nPosition)
* tab-dock to another form
THISFORM.Dock(4, oFormTarget)
* tab-dock to a window
DOCK NAME oFormRef POSITION 4 WINDOW WindowName 一個(gè)已?康谋韱我部梢酝ㄟ^WINDOWS菜單的Dockable項(xiàng)或在表單的標(biāo)題欄點(diǎn)擊鼠標(biāo)右鍵來終止?,或用以下的代碼: * set form to "supports docking, but not docked"
THISFORM.Dockable = 2
* or call the form's dock method
THISFORM.Dock(-1) 你可以運(yùn)行下面的代碼看看?康倪^程。這些代碼建了3個(gè)表單,并設(shè)定了TOP/LEFT,然后把它們?康紺OMMAND窗口上。你可以用上面的Dock/Undock按鈕來實(shí)現(xiàn)表單的?/不?,點(diǎn)擊3個(gè)中任一一個(gè)表單的X按鈕會(huì)關(guān)閉演示。
選中一個(gè)表單后,你可以用菜單來切換它的Dockable屬性,當(dāng)表單處于可?繝顟B(tài)時(shí),你可以把它拖放到屏幕上的任一個(gè)可?康奈恢。圖2顯示了3個(gè)可互相切換的已停靠表單。
圖二:
LOCAL oform1 as Myform
oform1=CREATEOBJECT("Myform")
oform1.Caption="Customers"
oform1.lblName.Caption = "Customers"
oform1.top = 100
oform1.left = 0
LOCAL oform2 as Myform
oform2=CREATEOBJECT("Myform")
oform2.Caption="Employees"
oform2.lblName.Caption = "Employees"
oform2.top = 100
oform2.left = 325
LOCAL oform3 as Myform
oform3=CREATEOBJECT("Myform")
oform3.Caption="Invoices"
oform3.lblName.Caption = "Invoices"
oform3.top = 275
oform3.left = 0
DOCK NAME oform1 POSITION 4 WINDOW Command
DOCK NAME oform2 POSITION 4 WINDOW Command
DOCK NAME oform3 POSITION 4 WINDOW Command
oform1.show()
oform2.show()
oform3.Show()
READ EVENTS
DEFINE CLASS MyForm AS Form
Dockable = 1 && supports docking and is dockable
Height = 150
Width = 300
ADD OBJECT lblName AS MyLabel
ADD OBJECT btnUndock AS MyUndockButton
FUNCTION Destroy()
CLEAR EVENTS
ENDDEFINE DEFINE CLASS MyUndockButton AS CommandButton
Height = 25
Width = 100
Left = 180
Top = 100
Anchor = 12 && fixed distance bottom/right
Caption = "Dock/Undock"
FUNCTION Click()
IF THISFORM.Docked
THISFORM.Dock(-1)
ELSE
IF THISFORM.Dockable = 1
* error if not dockable
DOCK NAME THISFORM POSITION 4 WINDOW Command
ENDIF
ENDIF
ENDDEFINE
DEFINE CLASS MyLabel AS Label
FontSize= 18
Height = 50
Width = 150
Top = 50
Left = 75
Alignment = 2
Anchor = 240 && relative on all sides
Caption = []
FontSize = 14
FontBold = .T.
FontName = "Verdana"
ENDDEFINE
8、 使用新的數(shù)據(jù)瀏覽面板
VFP9增加了一個(gè)新的而且非常有用的數(shù)據(jù)瀏覽面板(如圖3),通過這個(gè)面板,你就可以來配置一些你常用的VFP數(shù)據(jù)庫、自由表以及SQL SEVER數(shù)據(jù)庫.你可以很容易的找到這一項(xiàng),點(diǎn)擊[TOOLS]菜單里的[Task Pane],然后選擇[Data Explorer](也許你必須通過點(diǎn)擊">>"按鈕才能看到)。點(diǎn)擊[Add Connection]按鈕,然后指定數(shù)據(jù)源,完后就可以瀏覽了。右鍵點(diǎn)擊每個(gè)數(shù)據(jù)庫或表,在彈出菜單中包含一個(gè)[RUN QUERY]項(xiàng),點(diǎn)擊這一項(xiàng)會(huì)出現(xiàn)查詢界面,這樣就可以進(jìn)行數(shù)據(jù)查詢及瀏覽了。 圖表3說明:
數(shù)據(jù)瀏覽面板顯示了VFP的[Tastrade]數(shù)據(jù)庫的細(xì)節(jié)信息,同時(shí)右邊的查詢界面部分(通過右鍵點(diǎn)擊Northwind數(shù)據(jù)庫可以調(diào)出)則顯示了SQL SERVER數(shù)據(jù)庫Northwind的查詢結(jié)果。
9、 在事務(wù)處理中可以包含自由表和cursors
現(xiàn)在通過使用心得MAKETRANSACTABLE()函數(shù),你可以在一個(gè)具有完善回滾能力的事務(wù)處理中包含自有表和CURSOR,運(yùn)行下列代碼,在每一個(gè)等待窗口后按回 鍵,注意事務(wù)處理在最后一步從cursor完全恢復(fù)期間的記錄插入。
如果已經(jīng)調(diào)用 MAKETRANSACTABLE()對表進(jìn)行事務(wù)處理,那么使得這個(gè)表不被處理的唯一方法就是在所有的數(shù)據(jù)工作器中關(guān)閉并重新打開這個(gè)表,當(dāng)在一個(gè)數(shù)據(jù)工作期中開始事務(wù)處理以后,這個(gè)表就會(huì)變得在所有的工作期中都可以進(jìn)行處理,直到關(guān)閉。 CREATE CURSOR MyCursor (id i, name c(20))
WAIT WINDOW "Table is "+ ;
IIF(ISTRANS (),[],[not ])+"transactable. " +;
TRANSFORM(RECCOUNT())+" records."
MAKETRANSACTABLE()
BEGIN TRANSACTION
INSERT INTO MyCursor valueS (1, "Fox")
WAIT WINDOW "Table is "+ ;
IIF(ISTRANS (),[],[not ])+"transactable. " +;
TRANSFORM(RECCOUNT())+" records."
ROLLBACK
WAIT WINDOW "Table is "+ ;
IIF(ISTRANS (),[],[not ])+"transactable. " +;
TRANSFORM(RECCOUNT())+" records."
10、 為了能使用戶更好的對數(shù)據(jù)類型進(jìn)行控制
VFP增加了CAST()函數(shù), 無論是作為單獨(dú)的函數(shù)使用還是內(nèi)嵌入SQL語句中他都可以對不同的數(shù)據(jù)類型進(jìn)行轉(zhuǎn)換,他很簡單,這似乎難以置信,不過在應(yīng)用情況下它卻是非常的強(qiáng)大。 SELECT unit_price, ;
CAST(unit_price AS Integer) AS IntPrice, ;
CAST(unit_price AS N(12,6)) AS NumPrice ;
FROM (_samples+"tastrade\data\products")
11、 超級SYS(1037,1)
USE report1.frx
SYS(1037,1) &&自動(dòng)讀取report1.frx里面的打印環(huán)境
確定一下看看,**!
SYS(1037,1)的設(shè)置自動(dòng)保存到report1.frx里面呢
哎,紅雨的打印設(shè)置表單又白做呢
12、 在WITH … ENDWITH 和FOR EACH … OR中支持智能感應(yīng)
為在WITH ... ENDWITH 和FOR EACH ... E□□□OR中支持IntelliSense,這兩個(gè)命令的語法格式增加了AS Type子句,如下所示:
WITH ObjectName [AS Type [OF ClassLibrary]]
Commands
ENDWITH
FOR EACH ObjectName [AS Type [OF ClassLibrary]] IN Group
Commands
[EXIT]
[LOOP]
OR
Type 可以引用任何有效類型,包括數(shù)據(jù)類型、類類型或ProgID,如果類名稱無法找到,Visual FoxPro將忽略該類名稱并不顯示IntelliSense。
注意:Type引用不影響運(yùn)行時(shí)應(yīng)用程序的實(shí)際功能,這種引用僅是為了使用IntelliSense。ObjectName 表達(dá)式可以引用一個(gè)內(nèi)存變量或數(shù)組。
ClassLibrary參數(shù)指定的類庫需要在可以被Visual FoxPro發(fā)現(xiàn)的路徑中,如果指定的類庫不能發(fā)現(xiàn),IntelliSense不顯示。
輸入特定的ProgIDs和類庫不需要引號圍住它們,除非在名稱中包含有空格。當(dāng)輸入了一個(gè)關(guān)鍵詞, IntelliSense將顯示一個(gè)在FoxCode (Type="T")中注冊的類型列表。如果指定了一個(gè)有效類型,在WITH ... ENDWITH 或FOR EACH ... E□□□OR中輸入一個(gè)圓點(diǎn),將顯示對于該對象的IntelliSens。
必須指定一個(gè)有效類庫,對已存在對象引用則無效,例如下面的語句不支持IntelliSense:
WITH THISFORM AS APPLICATION
ENDWITH
WITH THISFORM AT THIS
ENDWITH
有效的書寫方式如下:
WITH This AS Form &&在一個(gè)表單事件中書寫
.Caption="標(biāo)題"
ENDWITH
又如:
WITH This.Pageframe1.Page1 AS Page
.Caption="頁框1"
ENDWITH
Visual FoxPro支持嵌套WITH ... ENDWITH和FOR EACH ... E□□□OR命令,下面是在一個(gè)叫Program1.prg的.prg中定義類中的嵌套WITH ... ENDWITH命令。在做這個(gè)示例前,首先需要在磁盤中保存一下Program1.prg文件,然后重新打開,可以在WITH和ENDWITH之間輸入一個(gè)圓點(diǎn),然后就可以看見IntelliSense,如圖5所示。
DEFINE CLASS f1 AS form
MyVar1 = 123
ADD OBJECT t1 AS mytext
PROCEDURE Init
WITH THIS AS f1 OF program1.prg
WITH .t1 AS mytext OF program1.prg
ENDWITH
ENDWITH
ENDPROC
ENDDEFINE
DEFINE CLASS mytext as textbox
MyVar2 = 123
ENDDEFINE
13、 報(bào)表可以有多個(gè)細(xì)節(jié)區(qū)了
14、 控件的Anchor屬性
Anchor屬性的意思,它有0-9十種值,各自代表的意思如下:
以下是我做測試的結(jié)果:
DH:表單高度的增量
DW:表單寬度的增量
測試過程:用代碼把按鈕的left和top各加80,長和高各加10后,再調(diào)整表單大小,再觀察按鈕的位置和大小
old值
oldtop=50
oldleft=50
oldheight=27
oldwidth=84
new值
newtop=130
newleft=130
newheight=37
newwidth=94
0:NULL
1:height和top變回old值,left和width為130和94(而且在再度移動(dòng)按鈕位置和改變大小前,再調(diào)整表單,按鈕不再受影響)
2:和1相反,是left和width變回old值,height和top為37、130(而且在再度移動(dòng)按鈕位置和改變大小前,再調(diào)整表單,按鈕不再受影響)
3:left、top、height、width都變?yōu)樵瓉淼闹?br />4:height為oldheight,width、left為new值,top為oldtop+DH,即保持和表單底部的距離保持在設(shè)計(jì)階段的值
5:top為oldtop,left、width為new值,height為oldheight+DH,即表單的高度增加多少,控件的高度也增加多少
6:left、width、height均為old值,只是height為oldheight+DH,即表單的高度增加多少,控件的高度也增加多少
7:top、left、widht均為OLD值,只是height為oldheight+DH,即表單的高度增加多少,控件的高度也增加多少
8:top、height均為new值,width就為old值,left就是oldleft+DW,就是控件保持和表單右邊的距離不變
9:top、height、width均為old值,left就是oldleft+DW,就是控件保持和表單右邊的距離不變
注意:它的十個(gè)可用的值要加起來用的,比如,現(xiàn)在我有一個(gè)Listview,我要讓它在表單縮放時(shí),Top和left保持不變,右邊界和底部邊界跟隨表單一起縮放,那么就要用到Anchor中的四個(gè)值:
1——頂部絕對,即距表單頂部的距離保持不變;
2——左邊絕對,即距表單左邊的距離保持不變;
4——底部絕對,即距表單底部的距離保持不變;
8——右邊絕對,即距表單右邊的距離保持不變;
現(xiàn)在,把Listview的anchor設(shè)置為15(1+2+4+8),縮放表單時(shí)Listview就跟著自動(dòng)縮放了。
15、 自定義Memo編輯窗口
textbox.openwindow=.t.
textbox.memowidow="窗口名"
二個(gè)屬性的意思是:
如果這個(gè)textbox是關(guān)聯(lián)到一個(gè)memo字段時(shí),雙擊這個(gè)控件,會(huì)自動(dòng)跳到memowindow中指定的窗口中去。條件是該窗口必須事先打開。
用此功能我們可以自定義Memo編輯窗口,而不是使用默認(rèn)的那個(gè)土土的。
16、 畫多邊形
Shape和Line控件的PolyPoint屬性用來畫多邊形
定義一個(gè)二維數(shù)組,(x,y)代表每個(gè)頂點(diǎn)的x,y值,然后把數(shù)組名放進(jìn)PolyPoint屬性,這二個(gè)控件就會(huì)畫一個(gè)多邊形了,還可以使用Rotation進(jìn)行旋轉(zhuǎn)。但此時(shí)只能是Plain而不能是3D了。
比如:
DIMENSION poly[5,2]
poly[1,1]= 0
poly[1,2]= 50
poly[2,1]= 50
poly[2,2]= 100
poly[3,1]= 100
poly[3,2]= 50
poly[4,1]= 50
poly[4,2]= 0
poly[5,1]=0
poly[5,2]=50
這個(gè)數(shù)組就會(huì)畫一個(gè)菱形
17、
18、 q
19、 q
20、 q
21、