免费视频淫片aa毛片_日韩高清在线亚洲专区vr_日韩大片免费观看视频播放_亚洲欧美国产精品完整版

打開APP
userphoto
未登錄

開通VIP,暢享免費電子書等14項超值服

開通VIP
VFP 高級教程:VFP 開發(fā)技巧
本章說明
本章共分十一節(jié)。闡述了與VFP工作環(huán)境有關的細節(jié)問題,其中一至七節(jié)為一般描述適用于一般使用者,第八、九兩節(jié)適用于中、高級開發(fā)者,第十節(jié)是四個具體的實例,可用于任何應用程序,第十一節(jié)是"選項"對話框的說明性表格,是手冊性質的資料。
第一節(jié) 概述
工作環(huán)境規(guī)定了 VFP 工作時的某些行為。配置工作環(huán)境意味著您可以通過某些方法使 VFP 的行為滿足自己的需要 - 必須的或者是某些個人偏好的。
與任何完善的開發(fā)工具一樣,VFP 也是一個復雜的系統(tǒng),復雜的一個方面就表現在它具有極大的靈活性 - 同一種工作,由于"環(huán)境"的不同,可能會產生不同的效果。
工作環(huán)境是個整體的概念,我們使用"環(huán)境參數"一詞來描述構成工作環(huán)境的個體。那么就可以說,工作環(huán)境就是由一組環(huán)境參數來決定的,配置工作環(huán)境就是設置這組環(huán)境參數,以滿足不同的需求。這顯然有兩方面的任務,第一、您要知道有那些環(huán)境參數,第二、明確怎樣配置這些參數。
工作環(huán)境涉及到很多方面,例如輸入輸出、數據處理、開發(fā)、調試等等。可以通過分類對所有環(huán)境參數進行描述。所有的環(huán)境參數都有一個原始的默認值,一般的環(huán)境配置工作,事實上只需要修改少量的環(huán)境參數即可。
有一個問題需要明確,"VFP 的工作環(huán)境"是指 Visual FoxPro 工具的開發(fā)環(huán)境。另外一種情況,使用 VFP 開發(fā)的應用程序,在編譯成執(zhí)行文件后,工作在 VFP 運行時的工作環(huán)境下。這兩者是有區(qū)別的,顯而易見的區(qū)別是,運行時環(huán)境涉及的問題比開發(fā)環(huán)境少得多,例如開發(fā)、調試方面的問題。一般來講,運行時的環(huán)境是開發(fā)環(huán)境的一個子集,但嚴格說來這是不對的,二者仍存在一些差別,不僅在環(huán)境參數的類別與數量方面,也存在于配置方法上。本文的敘述主要針對開發(fā)環(huán)境而進行,對二者存在的差別也將被提及。
[dvnews_page=VFP 高級教程:VFP 開發(fā)技巧]
第二節(jié) 默認的工作環(huán)境
VFP 安裝完成后,其"內部"保存著對所有環(huán)境參數的設置,這些參數可以稱做是原始設置。您永遠也不能夠去修改這些原始設置。但 VFP 提供一種機制允許您每次啟動時用自己的設置去覆蓋這組原始設置。方法是是使用 Windows注冊表及配置文件。
啟動時,VFP 首先會檢查 Windows注冊表中的有關設置,然后據此修改環(huán)境參數。然后還會查找一個配置文件,該文件默認的名字為 config.fpw,其中也存放著一些環(huán)境配置信息。VFP 將讀取這些信息,并再次修改環(huán)境參數。如果 VFP 在Windows 注冊表中沒有找到配置信息或者沒有找到配置文件,這沒有關系,VFP 將以原始配置進行工作。您甚至可以主動讓 VFP 在啟動時放棄讀取注冊表及配置文件。
VFP 不會主動把環(huán)境參數寫進 Windows注冊表中,但它提供了一種方法使您方面地將環(huán)境參數寫進注冊表,寫入不僅針對修改過的參數,而是所有參數,您沒有去修改的參數值將以原始值寫入。配置文件則不同,它只保存您寫入的參數,某種意義上,它相當是一份注冊表中的環(huán)境參數表的勘誤。
保存在 Windows
第三節(jié) 配置文件
先讀取
注冊表再查找配置文件的方法似乎有點復雜,但有些時候需要這樣做,例如工作在運行時環(huán)境的應用程序,啟動時不去讀取注冊表,這使得配置文件成為必須。另外,配置文件創(chuàng)建于 FoxPro 的早期版本,兼容性使它必須被保留。VFP6 以前的版本在安裝時將自動建立一個這樣的文件(在安裝目錄下),而到了 VFP6,系統(tǒng)不再自動建立該文件,需要時由用戶自行建立。該文件是一個文本文件,可以使用任何文本編輯器來建立它。
VFP 啟動時將按照下列路徑查找該文件: 當前工作目錄 安裝 Visual FoxPro 的目錄 DOS 路徑中列出的目錄 配置文件有默認的名字(config.fpw),"默認"意味著你可以去改變它。這有利于您同時擁有多個配置文件,以便滿足不同的需要。指定另外不同于config.fpw名字的配置文件的方法是在啟動 VFP 時增加命令行開關項,例如 VFP6.EXE -Cc:\myprg\myconfig.fpw
配置文件中不僅僅存放環(huán)境配置信息,例如可以在配置文件中設置 VFP 啟動后立即去執(zhí)行一個程序文件。這使得您可以在配置環(huán)境方面使用一種技巧,即將環(huán)境設置命令保存在一個程序文件中,然后讓 VFP 啟動時去執(zhí)行它。
啟動過程也可以通過使用命令行參數來定制,通過定制啟動過程,可以得到不同的環(huán)境默認設置,以下是對環(huán)境配置有影響的一些情況:
 
開關 描述
-A 忽略默認配置文件以及 Windows注冊表設置。
-C 放棄使用配置文件。
-c<文件> 指定默認配置文件 (Config.fpw) 之外的配置文件(必要時包含路徑)。
[dvnews_page=VFP 高級教程:VFP 開發(fā)技巧]
 
第四節(jié) 更改默認設置
VFP 啟動完成后,工作環(huán)境被設置成默認狀態(tài)。您可以即時地更改環(huán)境參數,這有幾種方法,各種方法可能適合于不同的情況。
交互式修改
在命令窗口輸入環(huán)境設置命令,執(zhí)行后該修改會立即生效。絕大部分的環(huán)境參數是通過 SET 命令設置的,另外還有一些通過系統(tǒng)變量存儲以及極少數的函數設置。在早期的XBASE 工具中,例如dBASEII中,僅有 20 幾條 SET 命令,而今天,VFP 中已經有 120 多個 SET 命令了。交互式的修改方法是枯燥的,因此只用于臨時性的修改,例如調試等。
程序化執(zhí)行修改
可以將一組環(huán)境設置命令組織成一個程序文件,運行該程序,就相當于在命令窗口一一輸入執(zhí)行了這組命令,有些情況下是需要這樣做的,例如在開發(fā)環(huán)境下同時調試多于一個項目的時候。可以將該環(huán)境設置程序存為一個過程或直接寫在項目的主文件中。事實上,對于應用程序,因為最終要脫離開發(fā)環(huán)境運行,所以大部分都是這樣做的。
用命令方式讀取Windows注冊表中的設置
讓 Visual FoxPro 再次讀取自己的注冊表設置,并且使用當前的注冊表設置更新自己。 語法為: SYS(3056 [,1]) 說明:包含1選項可以只根據注冊表設置進行更新,不包括 SET 命令和文件位置。Visual FoxPro 在 Windows 注冊表的選項對話框中保存設置。當Visual FoxPro 啟動時,讀取這些設置,并利用這些設置進行配置。SYS(3056)可更新包含有文件名和路徑的系統(tǒng)變量,而系統(tǒng)變量由SET命令和注冊表設置。當您選擇設置為默認值時,選項對話框指定的設置寫入注冊表。其中一些影響Visual FoxPro環(huán)境的設置含有SET 命令,例如SET BELL,SET LOCK等。注意 SYS(3056)不更新來自Config.fpw(即 Visual FoxPro 配置文件)的設置。
有關環(huán)境設置的命令
有很多環(huán)境設置的命令,在本文的附表中,以"選項"對話框中的分類列出了相應的環(huán)境設置命令,還有一些命令沒有包含在"選項"對話框中,但它們也是關于環(huán)境的設置命令,本文僅將它們列出來,具體的意義及語法可參見隨機文檔。
 
SET ALTERNATE SET ASSERTS SET AUTOSAVE
SET COLOR OF SCHEME ET COLORS SET SET CONSOLE
SET COVERAGE SET CPCOMPILE SET CURSOR
SET DEBUG SET DEBUGOUT SET DEVICE
SET DISPLAY SET EVENTLIST SET EVENTTRACKING
SET FIXED SET FULLPATH SET FUNCTION
SET MACKEY SET MEMOWIDTH SET NULL
SET NULLDISPLAY SET OLEOBJECT SET PRINTER
SET READBORDER SET SPACE SET STATUS
SET SYSMENU SET TEXTMERGE SET TEXTMERGE DELIMITERS
SET TYPEAHEAD
 
無論是交互式還是程序化執(zhí)行命令,其修改都是臨時的,只對當前工作有效,VFP 系統(tǒng)關閉后,這種修改不能被保存,下一次運行,如果需要同樣的設置,您不得不再一次輸入該命令或執(zhí)行該程序。要想使修改成為永久,必須將修改保存在 Windows注冊表中或構建配置文件。
修改注冊表
有兩種方法:直接修改 Windows注冊表或使用 VFP 開發(fā)環(huán)境提供的"選項卡"對話框。對于直接修改 Windwos 注冊表的方法,沒有人會建議您這樣做,除非您首先對 Windwos 注冊表的結構非常熟悉,其次對 VFP 在 Windows 注冊表中的各種參數的意義比較了解,第三有某些特殊需要以至于不能使用常規(guī)的方法完成。常規(guī)的方法,是使用 VFP 的"選項卡"對話框來完成環(huán)境配置。
直接修改注冊表
VFP 環(huán)境設置信息在 Windows注冊表的目錄如下: HKEY_CURRENT_USER\Software\Microsoft\VisualFoxPro\6.0\Options 主鍵名稱在本文附表中有詳細介紹。
使用"選項"對話框
使用"選項卡"對話框來進行系統(tǒng)的配置比直接修改 Windows
在開發(fā)環(huán)境下,執(zhí)行"工具"菜單中的"選項"菜單項,會出現"選項"對話框。對話框上有12個卡頁,分12個方面對環(huán)境進行配置。本文附表中詳細描述了其中的每一項設置。事實上,真正需要修改的并不多,很多項設置,原始值應該能滿足要求?,F在的問題是,當你修改完成后,可有兩種選擇,按"確定"按鈕退出對話框,您的修改只會保存在當前環(huán)境中,隨著系統(tǒng)的關閉而失效;按"設置為默認值"按鈕退出對話框,當前的設置將會被寫進 Windows注冊表從而成為新的默認值。
[dvnews_page=VFP 高級教程:VFP 開發(fā)技巧]
第六節(jié) ON命令
ON ERROR 命令
設計得再好的程序,在運行時也不可避免地會發(fā)生錯誤,這些錯誤可能是程序自身的錯誤,也可能是系統(tǒng)環(huán)境引起的或是用戶錯誤地操作(如錯誤地移動/刪除文件等)引起的等。
因此,程序員有責任編寫出可以捕捉錯誤的程序并盡可能地處理這些錯誤。要捕捉程序中發(fā)生的錯誤使用 ON ERROR 命令。你可以在 ON ERROR 命令后跟隨一個錯誤處理程序的名字:ON ERROR DO ERRORHANDLER,或者在 ON ERROR 命令后跟隨一條賦值語句:ON ERROR glError = .T.。
注意,在程序中全程使用類似于ON ERROR glError = .T.的命令是極不負責任的和令人憎惡的,這有可能會使用程序陷入死循環(huán)而使用用戶不得不強行退出系統(tǒng)(強行關斷電源等),這樣做極有可能破壞用戶的數據文件。
ON ESCAPE 命令
指定在程序或命令運行過程中,按下 ESC 鍵時所執(zhí)行的命令。
語法為:ON ESCAPE [Command]
ON SHUTDOWN 命令
指定當試圖退出 Visual FoxPro 時所要執(zhí)行的命令。
語法為:ON SHUTDOWN [Command]
第七節(jié) 一些重要的設置
以下是幾乎每一個應用程序都要進行的設置:
_VFP 系統(tǒng)變量
指向當前運行的Visual FoxPro應用程序對象。
語法
_VFP.PropertyName[=eValue]
-或-
_VFP.Method
參數描述
PropertyName 指定應用程序對象的屬性。
eValue 指定屬性的值。Method指定應用程序對象的方法。
說明
通過_VFP,您可以訪問對象集合(Objects collection)。
可設置的屬性有:
 
ActiveForm Application AutoYield
Caption DefaultFilePath Forms
Full NameHeight Left
Name OLERequestPendingTimeout OLEServerBusyRaiseError
OLEServerBusyTimeout Parent StartMode
StatusBar Top Version
Visible Width
 
SET SAFETY
決定改寫已有文件之前是否顯示對話框,或者決定當用表設計器或用 ALTER TABLE 命令對表結構進行修改后,是否重新計算表或字段規(guī)則、默認值以及錯誤信息。 語法為:SET SAFETY ON | OFF
SET PROCEDURE TO
設置運行時的命令文件
SET CLASSLIB TO
設置運行時的類庫文件
SET MEMOWIDTH TO
指定備注字段和字符表達式的顯示寬度。
語法為:SET MEMOWIDTH TO nColumns
SET MULTILOCKS ON
決定能否使用 LOCK ()或 RLOCK () 鎖定多個記錄。
語法為:SET MULTILOCKS ON | OFF
若要在程序中使用表緩存必須設置SET MULTILOCKS 為 ON。
SET HELP TO
激活或廢止 Visual FoxPro 聯機幫助或指定的幫助文件。
語法為
SET HELP ON | OFF
- 或者 -
SET HELP TO [FileName]
SET DELETED
指定 Visual FoxPro 是否處理標有刪除標記的記錄,以及其他命令是否可以操作它們。
語法為:SET DELETED ON | OFF
SET EXCLUSIVE
指定 Visual FoxPro 在網絡上以獨占方式還是共享方式打開表文件。
語法為:SET EXCLUSIVE ON | OFF
SET NOTIFY
確定是否顯示某種系統(tǒng)信息。
語法為:SET NOTIFY ON | OFF
SET BELL
關掉或打開計算機鈴聲,并設置鈴聲屬性。
語法為:
SET BELL ON | OFF
- 或者 -
SET BELL TO [nFrequency, nDuration | cWAVFileName, nDuration]
SET NEAR
FIND 或 SEEK 查找記錄不成功時,確定記錄指針停留的位置。
語法為:SET NEAR ON | OFF
SET EXACT
指定比較不同長度兩個字符串時,Visual FoxPro 使用的規(guī)則。
語法為:SET EXACT ON | OFF
SET CONFIRM
指定是否可以用在文本框中鍵入最后一個字符的方法退出文本框。
SET ESCAPE
決定是否可以通過按 ESC 鍵中斷程序和命令的運行。
語法為:SET ESCAPE ON | OFF
SET DATE
設置日期格式
語法為:SET DATE [TO] AMERICAN | ANSI | BRITISH | FRENCH | GERMAN | ITALIAN | JAPAN | USA | MDY | DMY | YMD
SET CENTURY
設置是否在日期的年中顯示世紀值
語法為:SET CENTURY ON | OFF
ON SHUTDOWN DO
指定當試圖退出 Visual FoxPro 時所要執(zhí)行的命令。
語法為:ON SHUTDOWN [Command]
[dvnews_page=VFP 高級教程:VFP 開發(fā)技巧]
第八節(jié) 進一步訂制VFP的向導和生成器
作為最好的數據庫管理系統(tǒng),VFP 給我們提供了高度的可自定義的交互式的開發(fā)環(huán)境(interactive development environment IDE)。你可以修改菜單,安裝新的生成器和向導,實現開發(fā)工具條,修改項目管理器的行為,以及很多其它事來使你的IDE 更高效。這些定制甚至比我們所知道的和喜歡的VFP語言更好,連相對不熟煉的VFP 開發(fā)者都可以按他們自己的方法定制開發(fā)環(huán)境。
本節(jié)將配合實際程序示例,向你展示如何建立簡單的工具增加你和你的開發(fā)組的效率。我們將著眼于修改VFP 的向導和生成器來提供額外的或自定義功能,并使用VFP 6中的BuilderD 技術創(chuàng)建你自己的生成器。
修改VFP 的向導和生成器
如果你象我一樣,你可能不常用VFP 的生成器和向導,因為它們不完全能滿足你的需要??赡芩鼈儾痪邆渥銐虻撵`活性或可能你只是不喜歡他們的工作方式。直到VFP 6以前,沒有辦法改變生成器和向導的行為,因為Microsoft 沒有提供源代碼。但是,現在我們不但獲得了生成器和向導的源代碼,也獲得了類瀏覽器,組件管理器的源代碼。
生成器和向導的源代碼可以在VFP主目錄下的TOOLS\XSOURCE目錄中的XSOURCE.ZIP 文件中找到。當你解壓該文件時,它建立一個VFPSOURCE 目錄,其中包含了所有的源代碼。向導的源代碼 可以在WIZARDS 目錄下找到,生成器的在BUILDERS目錄下 (雖然一些WIZARDS目錄中的公共文件也被生成器使用)。
因此,現在我們有了源代碼,我們可個按我們的需要來修改生成器和向導,對嗎? 好了,一個較好的辦法是建立新的生成器和向導時,使用源代碼中的大多數類和程序,但以派生子類并復制和修改PRGs 或建立封裝PRGs的方法來忽略他們原有的行為。本文將詳細說明如何對各生成器和向導這樣做。
一但你建立了你自己的生成器和向導,怎樣告訴VFP 使用你的而不是原來的嗎? 生成器是注冊在BUILDER.DBF 且向導是在WIZARD.DBF中,兩個表都在VFP主目錄下的WIZARDS 子目錄中。這些表具有相同的結構,如下表所示。
 
字段 描述
NAME 生成器或向導描述名。
DESCRIPT 生成器或向導的說明。
BITMAP 未使用。
TYPE 生成器或向導是對哪一對象類型的。在BUILDER.DBF情況下,它一般是一個對象的基類(雖然已有以MULTISELECT,AUTOFORMAT和RI 字段)。對于WIZARDS.DBF,它可能是FORM,REPORT,和 QUERY。
PROGRAM 包含生成器和向導的APP 文件名。
CLASSLIB APP文件中要實例的類。
CLASSNAME APP文件中的主要類的類庫。
PARMS 傳遞到生成器或向導的參數。
 
表 1. BUILDER.DBF 和 WIZARD.DBF的結構
當你調用一個生成器時,VFP 調用_BUILDER 系統(tǒng)變量中指定的程序 (默認是BUILDER.APP)。BUILDER.APP 查看它所在的環(huán)境 (例如,生成器是被那一個對象調用),在BUILDER.DBF 表中查找與環(huán)境匹配的記錄 (例如,在TYPE 字段中查找對象的基類),并調用注冊后的生成器。除系統(tǒng)變量_WIZARD外,向導也是以相同的方法處理,_WIZARD是用于指向可在WIZARD.DBF找到的WIZARD.APP。
要告訴VFP 使用一個不同的生成器或向導,插入一條說明如何運行你的生成器或向導的新記錄到BUILDER.DBF或 WIZARD.DBF表中。如果你想在運行新的向導或生成器的同時也可以選擇運行原有的生成器或向導,在WIZARD.DBF表中保留原有的生成器或向導記錄。如果你想替換原有的,簡單的修改它的TYPE值為另外的值(我使用一個"X"前綴,如 "XGRID"),而不是刪除該記錄;
使用該方法,你可以簡單的以恢復TYPE 的值來恢復使用原來的生成器或向導。 我們將考查創(chuàng)建一個Grid 生成器的替代物,參照完整性生成器,Upsizing 向導,和WWW 搜索頁向導。
創(chuàng)建更有用的Grid 生成器
VFP Grid 生成器提供了一種快速方法來整合grid 的列并建立你所希望的視覺外觀。但是,關于該生成器,有我所不喜歡的一些東西: 它不會自動調整列的寬度。必須自己調整列的寬度以適應數據寬度的需要。 在生成器的外觀頁面中的控件類型組合框只列出了已存在于列中的VFP 基類和類; 沒有辦法添加你自己的類到該列表中。 它創(chuàng)建的列和列頭是VFP 的基類。你也許想用你自己的類替代它(必須是以編程的方式定義的),例如,單擊一個列頭而按該列排序。
要建立一個VFP Grid 生成器的替代物,首先建立了SFGRIDBLDR 項目(它在你解壓該文檔所附的示例程序時建立的GRID 子目錄中) 并添加以下文件: BUILDER.VCX (在VFP 向導源目錄中的BUILDERS\BUILDERS 子目錄中),GRIDBLDR.VCX (在 BUILDERS\GRIDBLDR 目錄中),THERM.VCX,WIZCTRL.VCX,WIZMOVER.VCX (所有都在WIZARDS\WZCOMMON目錄中),DUMMY.PRG,和 WBGRID.PRG (在BUILDERS目錄中)。我如何知道要添加那些文件到項目中呢? 這很簡單:只需要查看GRIDBLDR 項目的內容。
其次,派生GridBuilder 類到SFGridBuilder (在 SFGRIDBLDR.VCX類庫中) 并復蓋ResetColumns 方法,該方法用于調整選定列的寬度到適當的大小 (我只實現了該想法,未實現上述列表中的其它兩個)。該方法的代碼在下面列出。這里要注意兩個有趣的東西。首先,我希望寫很多復雜的代碼,根據字段寬度、字體和字號來計算出列的寬度,等等。有趣的是,它放棄了生成器中已存在的任務的方法 (SetColWidth),而只是傳遞字段寬度到該方法中,生成器傳給它一個不同的值。其它事情是分配到loColumn。Width 的計算寬度被注釋了。理由是我還沒有調試好,改變列寬后,當生成器關閉時,會造成問題,所以我把列寬設置為,列寬是保存在wbaCols中。(如果你需要,wbaCols 是一個公共數組。我沒有創(chuàng)建生成器,因此不要責怪我采用這種方式)
因此,效果是當一個字段添加網格中時,它沒有立即獲得適當的列寬,但是一但你執(zhí)行了一些其它操作 (添加另一個字段,轉到生成器的另一個頁面中,關閉生成器等等。)它就會取得適當的列寬。
 
local lnRows, ;
lnI, ;
lcField, ;
loColumn, ;
lcHeader, ;
loHeader
dodefault()
lnRows = alen(wbaCols, 1)
for lnI = 1 to lnRows
lcField = wbaCols[lnI, 2]
if not empty(lcField)
loColumn = evaluate('wbaControl[1].' + ;
wbaCols[lnI, 7])
wbaCols[lnI, 1] = This.SetColWidth(fsize(lcField), ;
loColumn)
* loColumn.Width = wbaCols[lnI, 1]
endif not empty(lcField)
next lnI
 
最后我為我的生成器建立了GRIDMAIN.PRG (使用了BUILDERS\GRIDBLDR 中的GRIDMAIN.PRG 的辦法) 并使它成為項目的主文件。該程序用SET CLASSLIB命令添加SFGRIDBLDR.VCX 到打開的類庫中,這樣它可以找到我們的SFGridBuilder 類。GRIDMAIN 也自動注冊它自己到VFP BUILDER 表中(如果是直接運行該APP 文件)。
要查看該生成器的行為,建立并運行SFGRIDBLDR.APP 來作為grids生成器注冊它。如果你在運行該APP后,觀察觀查BUILDER.DBF,你會發(fā)現它是"未注冊的" ,原始的grid 生成器的 TYPE 字段由"GRID" 改成了"XGRID" 并在它后面為它自己添加了一條TYPE 字段為"GRID"的新記錄。下一步,新建一個表單,拖動grid 到表單中,并調用生成器。新的生成器看起來與原來的沒有任何區(qū)別,但是當你添加字段到表格時,你會發(fā)現字段寬度自動調整到了適當大小。
創(chuàng)建一個更好的參照完整性生成器
我有一小點關于VFP自身的參照完整性(RI)生成器的問題: 當你單擊確認按鈕來保存修改后的RI 時,它兩次(而不是一次)讓你確認。不是我太自信,但是我相信取消按鈕的用途是允許我們返回; 我單擊確認按鈕因為它是確認,因此我不需要一條 "你真的,真的確認你要這樣做嗎" 的確認對話框。 在你壓縮數據庫前,你不能運行RI 生成器。 我確實砂需要它備份我的當前的儲存過程為一個叫做RISP.OLD的我總是要自己刪除它的文件。 生成的代碼中至少有一處BUG ,應該用正確的功能來防止它。關于該BUG的細節(jié),參見"VFP中的錯誤處理一文"。 它生成的代碼既多又缺少注釋。要試著理解這些代碼是做什么的是一個艱苦的過程,而且如果是在一個復雜的數據庫中,RI 代碼可能超過VFP 編譯后的代碼的64K 限制。如果你看過Jim Booth 和 Steve Sawyer寫的 "Visual FoxPro 6.0應用程序開發(fā)的有效技術" 一書,你會有一個較好的快速,簡潔的子程序來維護RI。Steve的 NEWRI 子程序是數據驅動的,因此它是在運行時而不是在生成時檢查哪些規(guī)則需要強制執(zhí)行。結果是清楚的,緊密而不是VFP RI生成器生成的大實用的代碼。 它所支持的規(guī)則僅是忽略、級聯和限制。你所需要的其它選項又怎樣呢,例如無效(設置子表的外部關鍵字為.NULL.) 或指定一個新值 (設置外部關鍵字為的默認值)?
修正這些項相對容易些,因為我們有RI 生成器的源代碼。我建立了SFRIBUILDR.APP,一個 VFP RIBUILDR.APP的替換物。我沒有實現附加的規(guī)則 (上面提及的最后一項) 但是我處理了其它的所有項。我首先建立了SFRIBUILDR 項目(它在解壓后的程序的主目錄下的RI 目錄中) 并添加了VFP的RIBUILDR.VCX(在VFP向導源程序所在目錄下的BUILDERS\RIBUILDR 目錄中)。
接著,我派生VFP RI生成器類到 SFRIBUILDR.VCX 類庫中的SFRIBuildr。我忽視(overrode)了Load 方法以便在數據庫中有被刪除的記錄時不會發(fā)生錯誤 (你可以參見我注釋的已存在的代碼)。我忽視了確認按鈕的Click 方法,以便不出現確認對話框和不復制當前的儲存過程到RISP.OLD中,并修復了生成的代碼中的錯誤。同時,如果它檢查到NEWRI.PRG 存在于你的系統(tǒng)中 (與SFRIBUILR.APP在同一目錄),它會把該代碼放入數據庫的儲存代碼中而不會生成其它代碼。這個修改需要一個新的方法 RIMakeNewTr用一個不同的名字建立觸發(fā)器(__RI_Handler) 而不是原來的RI 生成器的生成的(__RI_<action>_<table>,如__RI_Delete_Customer)。因為這些方法中有大量的代碼,在這里就不寫出來了; 但是,如果你查看提供的源代碼,你會看見我確實只注釋了很少的代碼行,并添加了很少的代碼。
最后,我從BUILDERS\RIBUILDR目錄中復制RIMAIN.PRG 到我的生成器所在的目錄,添加它到項目中,并使它面為主程序。我修改了該程序所指向的類庫,使它能找到我的VFP RI 生成器類的子類所在的類庫 (SFRIBUILDR.VCX) 并自動注冊該生成器到VFP BUILDER 表中(如果是直接運行該APP)。
生成并運行SFRIBUILDR.APP 導致該文件作為RI生成器注冊取代了通常的RIBUILDR.APP。要看這一點,按以下步驟進行: 移動本文附帶的示例文件到WIZARDS\RI 目錄。 如果你有Steve的 NEWRI.PRG,將其復制到該目錄。 運行COPYDEMO.PRG。該程序將復制VFP TESTDATA數據庫到DATA 目錄中,這樣我們不會改動原始的數據庫。 運行 DELETETEST.PRG。這會演示一個VFP RI 生成器生成代碼的流程。第一次瀏覽顯示ALFKI 客戶的幾個訂貨,然后試著刪除該客戶。因為CUSTOMER 到 ORDERS 表間存在著級聯刪除,且ORDERS 到 ORDITEMS表間的規(guī)則為限制,該客戶將不能被刪除。但是,請注意錯誤對話框出現了六次(而不是你所希望的一次) ,然后另一個瀏覽顯示該客戶已被刪除(CUST_ID 是 .NULL.)。 因為我們已經把數據弄亂了,再一次運行COPYDEMO.PRG重新復制TESTDATA數據庫到DATA 目錄中。 以獨占方式打開DATA\TESTDATA數據庫。 生成并運行SFRIBUILDR.APP 來注冊它為RI 生成器。 打開數據庫設計器,選擇修改參照完整性,然后在RI 生成器對話框中,單擊確認按鈕。注意沒有出現確認對話框。選擇修改儲存過程并注意代碼的不同(如果你有NEWRI.PRG,該代碼會放入儲存過程中; 否則,生成的RIDelete 和 RIUpdate 方法代碼中的bug 已修正)。如果你有Steve 的 NEWRI.PRG,修改CUSTOMER 表,并注意各觸發(fā)器方法的名字。同時,你不會看到RISP.OLD 文件了。 再次運行DELETETEST.PRG。這一次,你只會看到一次錯誤信息且ALFKI 客戶沒有被刪除。
創(chuàng)建一個更好的升遷(Upsizing) 向導
Jim Falino 在使用升遷向導時失敗了,因此他創(chuàng)建了一個具有他所希望的行為的版本。 向導在每一個具有至少一個數值,浮點,通用 或備注字段的表中,建立一個timestamp 字段。Jim 不希望向導自動建立任何timestamp 字段,因此他移去了該功能。 向導為具有主關鍵字段的表自動建立一組索引。這在有時是令人滿意的,Jim 決定在默認情況下不建立組索引,因此在建立主關鍵字時,他加入了NONCLUSTERED 子句。 由于數據庫對象名字在SQL Server 中必須唯一,對于具有非唯一名的東西不能升遷。例如,如果你為多個表的主關鍵字段建立了相同索引名的索引則你不能升遷關鍵字索引 (如使用"ID" 為每一個表的主關鍵字段)。Jim 的方案是重命名主關鍵字索引為UQ_<table name>,因為名字在在 SQL Server中是不重要的。 可用的表的列表框滑有排序; 表出現的順序是它們在DBC中的順序。在一個擁有上百個表的DBC中,要找到一個特定的表是件痛苦的事。Jim 設置了SuperMover 對象的SortLeft 屬性(用于指明左邊的列表框是否需要排序) 為 .T. 向導可以為DBC中的每一個表,用相同和定義建立一個遠程視圖。但是,但是它命名視圖與原表同名,并重命名表為一個唯一名。由于有些人喜歡對視圖使用命名約定(例如,在原表名前加上一個"V"),Jim 修改了向導中的這一點。 Jim 修復了一個問題:向導有時會重新排列字段復合索引的順序。 VFP 數值型字段類型升遷為浮點型,即使 SQL Server 中有數值型數據類型也一樣。這致使VFP中多于兩位小數的數值型字段被截短,并且 VFP 數值字段沒有小數點的會升遷為兩位小數。
Jim 的修改是讓用戶指定他們的要求; 你可以使用它們如果你的需要與之相同,或將他們作為模板使用以便你自己修改。
創(chuàng)建一個更好用的WWW 搜索頁向導
在 "Visual FoxPro 6 企業(yè)開發(fā)" (Prima Tech,ISBN 0-7615-1381-7)一書中,Rod Paddock 和 John Petersen 描述了如何修改WWW 搜索頁向導來取消只能輸出5個字段到一個網頁的局限。勝于修改向導,你會希望派生它們。要這樣做,用我派生生成器類的相似的方法。WWW 搜索頁向導的代碼在VFP 向導源目錄下的WIZARDS\WZINTNET 目錄中。
[dvnews_page=VFP 高級教程:VFP 開發(fā)技巧]
第九節(jié) 創(chuàng)建你自己的向導
Rod Paddock 和John Petersen 也在他們的書中也提供了一些使用VFP 向導類來建立你自己的向導的細節(jié)。這樣做的優(yōu)點是,有人已經建立了所有的"引擎"來管理向導處理,且你的向導將與其它的VFP向導具有相同的感觀。
用BuilderD 創(chuàng)建生成器
在查看VFP6中的FoxPro基本類時(FFC),我注意到一件事是它們都具有叫做Builder和BuilderX的自定義屬性,并且各個類的BuilderX 是設置為= HOME() + "Wizards\BuilderD,BuilderDForm"。我知道這些屬性的作用(他們告訴VFP,這個類的生成器名),但為什么每一個類都要指定相同的生成器呢?更有趣的是,各個類以不同的選項調用類似的生成器表單(圖1顯示_HyperLinkLabel 類的生成器)。當使用相同的類時將會發(fā)生什么情況呢?
圖 1. _HyperLinkLabel 類的生成器
首先介紹一點背境??赡苷竽憧赡芤庾R到的,VFP 生成器可能以多種方式調用,但最常見的是可能是在對象上右擊鼠標并從出現的菜單上選擇生成器。這會使BUILDER.APP 被執(zhí)行。BUILDER.APP 檢查是否選定的對象(我們稱為"目標對象") 具有 BuilderX 屬性,如果有,運行該屬性指定的程序或實例化該該屬性指定的類(如果生成器是一個類,將指定一個類庫,逗號及類名)。如果它沒有 BuilderX 屬性但有一個 Builder 屬性,生成器運行該屬性指定的程序或實例化該該屬性指定的類(我們將看到為什么會同時用兩個屬性指定生成器)。如果兩個屬性都不存在,將使用該對象基類的默認生成器。 你可以在你的類中建立自定義的 Builder 和 BuilderX 屬性(甚至在你的基類中) 然后為每一個類填寫適當的生成器名字。要使用兩個屬性的理由是 BuilderX 為該類指定一個自定義生成器 而Builder為一組公共的類(如comboboxe 或 grid)指定一個所需的生成器。正如我們稍后會看到的一樣,我們可以在 BuilderX 屬性中指定的生成器中,單擊一個按鈕來調出在 Builder 屬性中指定的生成器。 因此,我們可以很容易地在 Builder 和 BuilderX 屬性中指定生成器。而不是花很多時間來建立你自己的生成器,特別對于不常使用的類。
BuilderD
你可能意識到了 BuilderB 技術 用來建立生成器是容易的和快速的。BuilderB 是一組你可以派生來建立你自己的生成器的類。你可以為你想用生成器維護的目標對象的各屬性添加一個控件到生成器子類。雖然BuilderB 使得建立生成器更容易,但你必須為每一個你想用生成器管理的類建立一個新的生成器子類。對于我們這樣的懶人來說,幸運的是,Ken 以數據驅動的方式增強了BuilderB。這種新技術叫做BuilderD ,"D" 的意思是"動態(tài)" (Dynamic),可以在Ken 的網站(www.classx.com)找到,也包含在VFP 6 中(在VFP 主目錄下的WIZARDS 目錄中的BUILDERD.VCX)。 BuilderD 由一系列的類組成,但主要的一個是BuilderDForm; 這是一個數據驅動生成器表單 (注意這是VFP6.0的基本類中指定的BuilderX類)。正如你在圖2中看到,該表單中的文本框用于輸入目標類的名字和類名,按鈕提供的功能可以調出類瀏覽器和顯示幫助,一個頁框、兩個頁面,但沒有用于管理屬性值的控件。
圖 2. BuilderDForm
以下是該表單在實例化時,如何組合適當的控件:
Init 方法調用SetObject 方法,它調用AddObjects 方法(該代碼事實上是在BuilderDForm 的父類BuilderBaseForm中)。
AddObjects 方法調用來自BuilderDB類的表單上的oBuilderDB 對象的AddObjects 方法。
BuilderDB.AddObjects 是一個復雜的方法,但其基本操作是打開生成器定義表(默認情況下是在VFP 主目錄下的WIZARDS 目錄中的BUILDERD.DBF,但可以修改cBuilderTable 屬性來指定另一個表),查找目標對象類的記錄,查找所有相似的記錄,并使用該記錄中的信息在頁框中的一個或多個頁上建立控件。這些控件是基于BUILDERD.VCX中的類的,諸如BuilderCheckBox 和 BuilderTextBox,它們知道如何綁定屬性到目標對象。
這些步驟的結果是,一個生成器可以管理目標對象的一個或更多的屬性。一個指定的生成器可以事實上做得比這些還要多,例如放置代碼到目標對象的方法或對象的容器中,介是目前我們只使用最簡單的方法。
BuilderD 表
讓我們進一步了解生成器定義表BUILDERD.DBF,因為理解它的結構是建立你自己的生成器的關鍵。表2 顯示了BUILDERD.DBF表的結構; 在該表中,"property control" 意思是生成器中的、維護一個目標對象的指定屬性的控件。
 
字段 用途
TYPE 定義記錄類型。它包含了兩個內容:如果這是一個類記錄它是“CLASS”,如果這是一個屬性記錄則它是“PROPERTY”。
ID 記錄識別符,通常是類的名字。
LINKS 連接到該記錄的其它記錄的ID 值列表(以回車符分隔)。該字段的更多細節(jié)在下面描述。
TEXT 如果這是一個“CLASS”記錄,則為生成器表單的標題提示。
如果這是一個“PROPERTY”記錄,則為屬性控件的標題提示。
DESC 屬性控件的狀態(tài)條文本。
CLASSNAME 對于“CLASS” 記錄,是類的名字。BuilderDB 搜索該字段中指定的、一個包含目標對象類的記錄。
對于“PROPERTY” 記錄,是要為屬性控件實例的類的名字。若該字段為空,將使用BUILDERD.VCX 中的默認的類 (邏輯屬性是BuilderCheckBox其它屬性是 BuilderTextBox)。你指定的任何其它類都必須是BuilderD 類的子類,因為這些類具有被BuilderDForm使用的特殊的屬性和方法。
CLASSLIB 包含有CLASSNAME 中指定的類的類庫。該屬性可以包含一個表達式 (例如HOME() + “WIZARDS\BUILDERD.VCX”)或一個常量; 在這種情況下,在表達式事放上方括號。對于“PROPERTY” 記錄,如果該字段為空且指定了CLASSNAME,則假定為BUILDERD.VCX。對于“CLASS” 記錄,BuilderDB 搜索一個包含有與該字段內容值相同的記錄(如果必要的話,在求值后) 作為目標對象的ClassLibrary 屬性,保留該值為空可建立一個類的生成器而不必擔心它是在哪一類庫中。
MEMBER 對于“CLASS” 記錄,其值為空。對于“PROPERTY” 記錄。如果為空,ID 必須包含屬性名。
HELPFILE 包括有該類的幫助內容的CHM 文件名。如果為空,就使用當前幫助文件。
HELPID 幫助主題ID。
TOP 屬性控件的Top 設置。如果為0,BuilderDForm 將該控件放在先前一個控件的下面(頁面上的第一個控件放置在BuilderDB.nTop 屬性中指定的位置)。
LEFT 屬性控件的Left 設置。如果為0,BuilderDForm 將該控件放在先前一個控件的左邊(在BuilderDB.nLeft中指定)。
HEIGHT 屬性控件的Height 設置。如果為0,就使用該控件的默認Height值。
WIDTH 屬性控件的Width 設置。如果為0,就使用該控件的默認Width 值。
ROWSRCTYPE 如果類使用的屬性控件(在CLASSNAME中指定) 是一個combobox,該combobox 的 RowSourceType 設置。
ROWSOURCE 如果屬性控件是一個combobox,該combobox的RowSource 設置。例如,如果 ROWSRCTYPE 是 1 (值),ROWSOURCE 將包含一個用于combobox的、以逗號分隔的值的列表。
STYLE 如果屬性控件是一個 combobox,該 combobox 的Style 設置。
VALIDEXPR 一個用于驗證屬性值的表達式。
READONLY 如果屬性控件中只讀的則為.T.。
UPDONCHNG 如果屬性控件的值寫到目標對象的屬性后被修改,則為.T. (就是說,交互式方式)。
UPDATED 決定記錄最后修改 (未被 BuilderD使用,僅是一個信息)。
COMMENT 關于記錄的注釋(未被 BuilderD使用)。
USER 用戶信息記錄(未被 BuilderD使用)。
 
表 1. BUILDERD.DBF的結構
表2 和 3 顯示了兩個生成器的記錄,VFP6.0的基本類_HyperLinkBase 和_HyperLinkLabel 類。我沒有顯示BUILDERD.DBF 表中的所有字段,出于空間的考慮; 僅列出與討論有關的字段。
 
TYPE ID LINKS CLASSNAME CLASSLIB
CLASS _HyperLinkBase Ctarget
cFrame
lNewWindow _HyperLinkBase (HOME()+"FFC\_Hyperlink.vcx")
CLASS _HyperLinkLabel Caption
_HyperLinkBase _HyperLinkLabel (HOME()+"FFC\_Hyperlink.vcx")
 
表 2. _HyperLinkBase 和 _HyperLinkLabel 類的生成器記錄
 
TYPE ID TEXT CLASSNAME ROWSRCTYPE ROWSOURCE
PROPERTY cTarget Target URL: BuilderComboBox 1 www.microsoft.com/vfoxpro
PROPERTY cFrame Frame:
PROPERTY lNewWindow Open new browser window
PROPERTY Caption Caption
 
表 3. _HyperLinkBase 和 _HyperLinkLabel 生成器管理的屬性定義記錄
在表2 中的 _HyperLinkBase記錄中,我們看見CLASSNAME 和 CLASSLIB 指定了該生成器使用的類(注意CLASSLIB 包含了一個在運行時求值的表達式而不是一個硬編碼值),在LINKS 中列了出該生成器可管理的類的屬性。顯示在表3中的cTarget PROPERTY 記錄指明該屬性將被BuilderComboBox 控件管理,且該BuilderComboBox的RowSource 包含一個 Microsoft VFP 網站的URL (目前是msdn.microsoft.com/vfoxpro)。cFrame 將被 BuilderTextBox 對象管理(因為它是一個字符串屬性且該類沒有定義),lNewWindow 將有一個BuilderCheckBox 對象(因為它是一個邏輯屬性)。
看起來是如此簡單,對吧? 好了,LINKS 字段事實上可以更加復雜。首先,假如在LINKS字段中指定的類記錄的ID 沒有匹配記錄,該ID 就被假設為屬性名。
這樣,你可以簡單的在CLASS記錄的LINKS字段中指定它管理的屬性來實際建立一個生成器。當然,你必須保持屬性的 captions 和屬性的名字相同,沒有狀態(tài)條文本、默認的類和屬性大小,但這些對于一個快速的和dirty 生成器來說都不算太壞。
第二個復雜之處是,CLASS記錄的LINKS字段中指定的ID 可以指向另一個CLASS 記錄而不是一個PROPERTY 記錄。在這種情況下,該類 "繼承"所有指定類的連接。你可以在表2中的_HyperLinkLabel 記錄中看到這一點; 它的一個連接是_HyperLinkBase,因此它不僅用該類的生成器來管理Caption 屬性(specifically 在它的 LINKS 字段中列出),同時也管理cTarget、cFrame和lNewWindow 屬性,因為這些在_HyperLinkBase 的LINKS 字段中指定。
第三,PROPERTY 記錄可以連接到另一個PROPERTY 記錄。在這種情況下,記錄"繼承"連接記錄的所有非空字段。最后,如果你用@<caption> 格式指定它,LINKS 可以包含生成器中的頁框的標題 (例如,@Properties 使用"Properties" 作為頁的標題)。
創(chuàng)建一個生成器
讓我們在TEST.VCX類庫中創(chuàng)建一個名為TestCheck的 VFP CheckBox 的子類作為開始。在該類中添加一個叫做BuilderX 的自定義屬性并設置它的值為= HOME() + "Wizards\BuilderD,BuilderDForm"。然后在該類上右擊鼠標并從快捷菜單中選擇生成器。我們得到一條"沒有注冊該類型的生成器"的錯誤。這也說得通,因為我們還沒有定義它 (盡管這令人不愉快,在稍后它將自動為我們建立一個)。按以下步驟做: 在命令窗口中打入USE HOME() + "WIZARDS\BUILDERD",然后打入BROWSE。 從表菜單中選擇"添加新記錄"。 在TYPE字段中輸入"CLASS",ID 字段中輸入"TestCheck",LINKS 字段中輸入"Enabled","AutoSize"和"Caption" (在輸入各字段后按回車鍵),TEXT 字段中輸入"My Test Builder",CLASSNAME 字段中輸入"TestCheck",CLASSLIB 字段中輸入 "TEST.VCX"。 關閉瀏覽窗口并在命令窗口中打入USE 來關閉該表。 在TestCheck 上右擊鼠標并選擇生成器。
酷不酷,嗯? 完全是你自己的生成器,僅在一分鐘左右就建立了! 去掉Enabled 的選擇并輸入一個不同的Caption,并可看到這些屬性已被修改。
注意不要被為屬性建立記錄所迷惑; Enabled 和 Caption 記錄已存在于 BUILDERD.DBF表中,因此我們只需重用它們,而且由于不存在 AutoSize 記錄,BuilderD 只假設我們想管理那個屬性。
讓我們再建立一個并看看以多小的輸入可以得到一個可工作的生成器。在TEST.VCX類庫中創(chuàng)建一個名為TestText的 VFP TextBox 的子類,向它添加一個屬性 BuilderX 并設置它的值為 = HOME() + "Wizards\BuilderD,BuilderDForm"。在BUILDERD.DBF 中添加一條記錄并只指定 TYPE ("CLASS"),ID ("TestText"),LINKS ("ReadOnly")和 CLASSNAME ("TestText";我們可以跳過 CLASSLIB 但 CLASSNAME 是必須的)。關閉該表,然后調出該類的生成器。
這也是一個可以工作的生成器。單擊生成器中的生成器按鈕; 它調出另一個生成器(如果Builder屬性存在并非空,在Builder屬性中指定的生成器,否則就是該類的基類的默認生成器,在此例中是 VFP TextBox 生成器)。這樣,即使我們可以為一個類指定生成器,只要愿意,我們仍然可以訪問更多的普通生成器。
預置-內建的生成器
我最近用BuilderD 建立了兩個生成器,一個為我的SFGrid 類另一個為SFPageFrame。SFGrid 生成器維護DeleteMark 和RecordMark 屬性(你可以很容易地添加其它你可能經常修改的屬性) 但由于它們容易在屬性窗口中修改,所以這不是我要建立該生成器的真正的理由。真正的理由是因為我喜歡使用grid 的columns 中的SFGridTextBox 對象(SFTextBox 的一個子類,具有一小部分不同的屬性設置,以提供它們在 grid中出現的外觀),并盡量用SFGridTextBox對象替換一般的TextBox 對象。
因此我建立了一個按鈕(SFBUILDERS.VCX類庫中的SFGridTextBoxButton類) 來自動進行該工作。以下是該按鈕的 Click 方法代碼:
 
local loColumn, ; loControl, ; lcName for each loColumn in Thisform.oObject.Columns for each loControl in loColumn.Controls if upper(loControl.Class) = 'TEXTBOX' lcName = loControl.Name loColumn.RemoveObject(lcName) loColumn.NewObject(lcName, 'SFGridTextBox', ; 'SFCtrls.vcx') endif upper(loControl.Class) = 'TEXTBOX' next loControl next loColumn wait window 'SFGridTextBox added to each column' ; timeout 2
 
BuilderDForm 有一個引用到目標對象保存在它的 oObject 屬性,因此生成器表單上的許多控件可以引用或修改目標對象的東西。在這些代碼中,Thisform.oObject.Columns 引用grid 的Columns 集合被生成器影響。
這里有一個副作用:我怎樣才能在我的生成器表單中得到該按鈕? 我可以為我的生成器在BUILDERD表中建立一個記錄,但那會添加按鈕到頁框中的一個頁上,而我確希望該按鈕象其它的生成器按鈕一樣出現。
因此我建立了一個 "button loader" 類 (SFBUILDERS.VCX類庫中的SFBuilderButtonLoader類),該類添加一個按鈕到生成器表單然后返回 .F. 這樣,它實際上沒有實例化。SFBuilderButtonLoader 在BUILDERD表的當前記錄的備注字段 USER 中查找(使用類實例化的記錄) 要添加到表單的按鈕的類名和類庫(注意下面代碼中的 BUILDERD 是以 "BUILDER"別名打開的)。對于SFGridTextBoxButton,例如,我在BUILDERD表中建立一條記錄,以 "SFGridTextBoxButton" 作為它的 ID 但 "SFBuilderButtonLoader" 是一個類,并在USER字段中輸入 "SFBuilders, SFGridTextBoxButton"。這告訴 SFBuilderButtonLoader 添加一個 SFGridTextBoxButton 到表單中。以下是SFBuilderButtonLoader的 Init 方法代碼:
 
local lcClass, ;
lnPos, ;
lcLibrary, ;
lnTop, ;
lnLeft, ;
loControl
* 如果 BUILDERD 表已經打開且定位在要載入的按鈕記錄上
* 我們將從USER字段中讀取類和類庫名并添加該按鈕
* 到表單。
if used('BUILDER') and ; lower(BUILDER.CLASSNAME) = lower(This.Class) with Thisform lcClass = BUILDER.USER lnPos = at(',', lcClass) if lnPos > 0 lcLibrary = left(lcClass, lnPos - 1) lcClass = substr(lcClass, lnPos + 1) else lcLibrary = '' endif * 添加按鈕。如果我們成功了,在表單的按鈕區(qū)找第一個打開"裂縫" .NewObject(lcClass, lcClass, lcLibrary) if type('.' + lcClass + '.Name') = 'C' lnTop = .cmdClassBrowser.Top + ; .cmdClassBrowser.Height + 5 lnLeft = .cmdClassBrowser.Left for each loControl in .Controls if loControl.Left = lnLeft and ; loControl.Top = lnTop lnLeft = lnLeft + ; .cmdClassBrowser.Width + 6 if lnLeft + .cmdClassBrowser.Width > .Width lnLeft = .cmdClassBrowser.Left lnTop = lnTop + .cmdClassBrowser.Height + 5 endif lnLeft + .cmdClassBrowser.Width > .Width endif loControl.Left = lnLeft ... next loControl * 設置按鈕位置到"裂縫"位置,并使其可訪問。 with .&lcClass .Top = lnTop .Left = lnLeft .Visible = .T. endwith endif type('.' + lcClass + '.Name') = 'C' endwith endif used('BUILDER') ... return .F.
 
在BUILDERD表中 SFGrid 記錄的LINKS字段中有 DeleteMark、RecordMark 和 SFGridTextBox,因此該生成器獲得這些控件。
現在我可以為我的SFGrid對象調出我的BuilderD 生成器,使用 VFP Grid 生成器(單擊BuilderD表單上的生成器按鈕) 來快速建立 grid中的列,然后單擊我的添加SFGridTextBox按鈕來讓這些列使用 SFGridTextBox 對象。
對于 SFPageFrame,我也希望相似的功能:一個添加代碼到頁框中各頁的RightClick方法的按鈕; 這允許在頁面上右擊鼠標明時為頁框或整個表單提供快捷菜單。象SFGrid 生成器一樣,我在BuilderD表中建立了一個記錄來實例化一個 SFBuilderButtonLoader 對象,然后添加一個 SFCodePageButton 對象到生成器表單。以下是添加代碼到各頁的SFCodePageButton的Click方法:
 
local lcCode, ; loPage, ; lcCurrentCode lcCode = 'This.Parent.ShowMenu()' + chr(13) for each loPage in Thisform.oObject.Pages lcCurrentCode = loPage.ReadMethod('RightClick') if not lcCode $ lcCurrentCode loPage.WriteMethod('RightClick', lcCurrentCode + ; iif(empty(lcCurrentCode), '', chr(13)) + lcCode) endif not lcCode $ lcCurrentCode next loPage wait window 'Code added to each page' timeout 2
 
要添加這些新的生成器到你的系統(tǒng)中,復制 SFBUILDERS.VCX 和 VCT (在本文檔的源代碼文件中可以找到) 到一個目錄,然后打開示例文件提供的NEWBUILDERS 表,并修改 CLASSLIB 字段到包含路徑的 SFBUILDERS.VCX文件名。打開 BUILDERD 表,然后 APPEND FROM NEWBUILDERS 表,添加Builder 和BuilderX 屬性到你的類中,并在BuilderX中輸入 = HOME() + "Wizards\BuilderD,BuilderDForm"。
其它生成器類
我早些時候注意到,SFBUILDERS.VCX 中的BuilderCheckBox 和 BuilderTextBox 類都是派生自同一個BuilderD 類。在附加的右擊鼠標行為中,這兩個類具有nTop 和 nLeft 屬性,當這些屬性改變時,用assign 方法設置它們的自定義的lMoved 屬性為.T.。這允許我們查覺到什么時候一個屬性控件被移動了(在屬性控件生成器中的Left 和Top 是綁定至 nLeft 和 nTop 而不是直接綁定到 Left 和 Top)。只有當一個屬性控件移動時,我們保存它的its Left 和 Top 值到 BUILDERD 表。 SFBUILDERS.VCX 中的加一個類是 SFPropertyCaption。該控件用于管理屬性控件的 caption。
為什么用一個特別的類來做這件事? 為什么不用一個普通的BuilderTextBox 對象?
理由是如果屬性控件是一個BuilderCheckBox,它有一個 Caption 屬性,因此控件管理該屬性。但是,如果屬性控件是一個 BuilderTextBox,它沒有 Caption 屬性但確有一個組合的 label 對象,因此控件必須管理對象的對象的 Caption 屬性。由于 BuilderD 類只管理單個對象的屬性,SFPropertyCaption 不得不超越(override)少量方法來允許它處理這種情況。
SFBuilderPropertyComboBox 類是BuilderComboBox的一個子類。它提供一個目標對象的所有可寫屬性的一個列表(用 AMEMBERS() 得到所有屬性的列表然后檢查各自的PEMSTATUS()來排除只讀的)。雖然它的主要目的是修改屬性控件的 cProperty 屬性(用于檢查要管理的屬性),它有兩個有趣的行為。
首先,如果屬性控件是一個BuilderTextBox 但你只修改了它管理的邏輯屬性(如 Enabled),它移去BuilderTextBox 及組合的label 對象,并放一個 BuilderCheckBox 在這個地方。如果你改變了一個邏輯屬性為另一個類型它會做相反的事。
第二,如果你輸入了一個不存在的屬性名,你會被提示建立該屬性。如果你同意,生成器使用AddProperty 來添加新屬性到目標對象。我的確不推薦在一個拖放到表單中的對象上這樣做,因為這等于實例化編程; 如果你真的需要一個新屬性,你可以考慮用子類來代替。
總之,這是一個經一個步驟在類中建立新屬性并用生成器管理它的快速方法。 SFBuilderAddButton 是一個為了屬性控件使用 SFBuilderButtonLoader 類而添加到生成器表單的按鈕類 (派生自BuilderCommandButton)。SFBuilderAddButton 的Click方簡單地調用屬性控件所在的生成器表單的 AddPropertyControl 方法來建立一個新的屬性控件,然后轉換當前生成器表單來管理新屬性控件。
這意味著你可以單擊添加屬性按鈕添加一個新屬性到生成器,并在生成器中管理它。這是一種添加多個屬性控件的快速方法。
試一試
讓我們看一看SFBuilderBuilderForm; 它實際上比對它的描述更易于使用。在TEST.VCX中建立一個叫做 MyTestText 的VFP TextBox 類的子類。添加一個 BuilderX 屬性并設置它的值為 "SFBuilders,SFBuilderBuilderForm",然后調出該類的生成器。
注意盡管我們沒有在BUILDERD 表中建立任何記錄,我們仍然得到了一個生成器表單(當然,表單上沒有控件,但我們馬上會改變這一切)。
這是因為 SFBuilderBuilderForm 在不能找到該類的記錄時,自動地為該類在BUILDERD表中建立了一個 CLASS 記錄。
單擊添加屬性控件按鈕。你會注意到一個文本框和標簽出現在生成器表單上,但隨后另一個生成器表單出現在該生成器表單的面上。這個新的表單是我們剛添加的屬性控件的生成器。在屬性 combobox中,選擇 "Tooltiptext" 并修改 Caption 為 "Tool Tip Text" 和 Width 到250。移動該生成器表單在一旁并注意原表單上的屬性控件也同樣修改了。
單擊第二個生成器表單上的添加另一屬性按鈕并注意另一個屬性控件已添加到原生成器表單中,并且該生成器表單現在可以管理它了。為屬性選擇"Statusbartext" 并修改Caption 為"Status Bar Text" 和Width 到250。添加另一個屬性控件,并為該屬性選擇 "Readonly" 并修改Caption 到"Read-Only"; 這時,注意原生成器屬性控制改變了checkbox。關閉新的生成器表單。圖3 顯示了我們建立的生成器,圖4 顯示了屬性控件生成器。
圖 3. 我們?yōu)镸yTestText 對象建立的BuilderD 生成器
圖 4. 屬性控件生成器
要修改控件的屬性,在控件上右擊鼠標并從快捷菜單中選擇修改屬性修改控件; 你以前看到過的相同的屬性控件生成器會出現。要移去屬性控件,從菜單中選擇移去屬性控件。要重置目標對象的該屬性的值為默認值,選擇重置為默認值。
讓我們修改生成器表單的標題為更為合適的東西。單擊修改生成器標題按鈕并在隨后出現的SFBuilderBuilder生成器表單中輸入 "我的測試文本框類生成器" 。關閉第二個生成器。
如果你在關閉生成器時沒有保存,下一次你再調用 MyTestText 對象的生成器時,你的設置不會起作用。若要保存生成器的定義到 BUILDERD 表中,單擊保存生成器按鈕。如果你想導出生成器定義到另一個表中,單擊導出生成器按鈕并在出現的對話框中輸入文件名。然后你可以發(fā)送該表給一些人,他們可以將其導入他們的 BUILDERD 表并訪問你建立的生成器。
說明
因為VFP的開放式IDE,任何人都可以很容易地定制它們的開發(fā)環(huán)境,因此他們和他們的開發(fā)組可以極大地提高編程效率。
[dvnews_page=VFP 高級教程:VFP 開發(fā)技巧]
第十節(jié) 示例
例1:在程序開始時設置系統(tǒng)環(huán)境
*-- 設置工作目錄cCurrentProcedure = SYS(16,1)nPathStart = AT(":",cCurrentProcedure) - 1nLenOfPath = RAT("\", cCurrentProcedure,2) - (nPathStart)SET DEFAULT TO (SUBSTR(cCurrentProcedure, nPathStart, nLenOfPath))SET PATH TO PROGS,LIBS,MENUS,HELP,INCLUDE,FORMS,BITMAPS*-- 修改程序標題并將屏幕放到最大,在編譯成.EXE的文件運行時,這是必須的MODIFY WINDOW SCREEN TITLE "測試" NOCLOSEZOOM WINDOW SCREEN MAX*-- 屏蔽系統(tǒng)菜單SET SYSMENU OFF*--定義用于保存系統(tǒng)設置的全局變量PUBLIC ;GcOldTalk,;gcOldPath,;gcOldDir,;gcOldClassLib,;gcOldEscape,;gcOldSafety,;gcOldProc,;gcOldStatus,;gnOldMemo,;gcOldMultiLocks,;gcOldHelp,;gcOldDeleted,;gcOldExclusive,;gcOldNotify,;gcOldBell,;gcOldNear,;gcOldExact,;gcOldIntensity,;gcOldConfirm,;gcOldOnShutDown,;gcOldCompatible*--保存原始的系統(tǒng)狀態(tài),以便在退出時恢復GcOldTalk = SET("TALK")gcOldPath = SET("PATH")gcOldDir = FULLPATH(CURDIR())gcOldClassLib = SET("CLASSLIB")gcOldEscape = SET("ESCAPE")gcOldSafety = SET('SAFETY')gcOldProc = SET('PROCEDURE')gcOldStatus = SET('STATUS BAR')gnOldMemo = SET('MEMOWIDTH')gcOldMultiLocks = SET('MULTILOCKS')gcOldHelp = SET('HELP', 1)gcOldDeleted = SET('DELETED')gcOldExclusive = SET('EXCLUSIVE')gcOldNotify = SET('NOTIFY')gcOldBell = SET('BELL')gcOldNear = SET('NEAR')gcOldExact = SET('EXACT')gcOldIntensity = SET('INTENSITY')gcOldConfirm = SET('CONFIRM')gcOldOnShutDown = ON('SHUTDOWN')gcOldCompatible = SET("COMPATIBLE")gcOldDate = SET("DATE")gcOldCentury = SET("CENTURY")*-- 設置SET 和ON 命令SET SAFETY OFFSET PROCEDURE TO UTILITY.PRGSET CLASSLIB TO MAINSET MEMOWIDTH TO 120SET MULTILOCKS ONSET HELP TO HELP\MAIN.CHMSET DELETED ONSET EXCLUSIVE OFFSET NOTIFY OFFSET BELL OFFSET NEAR OFFSET EXACT OFFSET INTENSITY OFFSET CONFIRM ONSET COMPATIBLE OFFSET DATE ANSISET CENTURY ONSET ESCAPE OFFON SHUTDOWN DO OnShutDown注意:運行上述代碼時程序文件UTILITY.PRG,OnShutDown,類庫文件MAIN及幫助文件MAIN.CHM必須存在。
例2:在程序結束時恢復系統(tǒng)環(huán)境
LOCAL luTempSET PATH TO (gcOldPath)luTemp = gcOldClassLibSET CLASSLIB TO &luTempluTemp = gcOldProcSET PROCEDURE TO &luTempSET MEMOWIDTH TO gnOldMemoluTemp = gcOldMultiLocksSET MULTILOCKS &luTempluTemp = gcOldSafetySET SAFETY &luTempluTemp = gcOldStatusSET STATUS BAR &luTempCD (gcOldDir)luTemp = gcOldDeletedSET DELETED &luTempluTemp = gcOldExclusiveSET EXCLUSIVE &luTempIF FILE(gcOldHelp)SET HELP TO (gcOldHelp)ENDIFluTemp = gcOldNotifySET NOTIFY &luTempluTemp = gcOldBellSET BELL &luTempluTemp = gcOldNearSET NEAR &luTempluTemp = gcOldExactSET EXACT &luTempluTemp = gcOldIntensitySET INTENSITY &luTempluTemp = gcOldConfirmSET CONFIRM &luTempluTemp = gcOldOnShutdownON SHUTDOWN &luTempluTemp = gcOldEscapeSET ESCAPE &luTempluTemp = gcOldCompatibleSET COMPATIBLE &luTempluTemp = gcOldTalkSET TALK &luTempluTemp = gcOldDateSET DATE &luTempluTemp = gcOldCenturySET CENTURY &luTempCLOSE ALLCLEAR DLLSRELEASE ALL EXTENDEDCLEAR ALL
例3:程序崩潰時恢復系統(tǒng)環(huán)境
在程序設計期間,有時會因程序錯誤而使系統(tǒng)崩潰。當系統(tǒng)崩潰時,可能會有打開的表沒有關閉,數據工作期不能釋放,表單在屏幕上不能清除,菜單沒有釋放等一系列令人心煩的事。當你要手工地恢復系統(tǒng)到初使狀態(tài)真還要費不少事,但是你可以自己編寫一個過程文件來自動完成這些工作。這樣,當系統(tǒng)崩潰時,你只需在命令窗口打入 DO XXX 即可。
*:*******************************************************************************:*: 過程文件C:\HIGHMIS\HF.PRG*:*:******************************************************************************ON ERRORSET PROCEDURE TOPOP KEY ALLSET COLOR TOSET SYSMENU TO DEFACLOSE ALLRELEAS ALL EXTECLEAR DLLSCLEAR EVENTSCLEAR FIELDSCLEAR GETSCLEAR MACROSCLEAR MEMORYCLEAR MENUSCLEAR POPUPSCLEAR PROGRAMCLEAR PROMPTCLEAR READ ALLCLEAR TYPEAHEADCLEAR WINDOWSSET DEVICE TO SCREENCLEARSET EXCL ONSET TALK ONSET MESSAGE ONRELEASE WINDOW 常用SET HELP TOSET HELP ONCANCEL例4:查看系統(tǒng)設置*:*******************************************************************************:*: 過程文件C:\HIGHMIS\PROGS\SYSTEST.PRG*:* 用途:查看當前系統(tǒng)信息**************************************************************************PROCEDURE SYSTESTPARAMETERS T__Method, T__FileRELEASE ALL EXCEPT T__*PRIVATE ALL LIKE T__*CREATE VIEW itSET TALK OFFCLOSE ALLSET SAFETY OFFSET ALTERNATE TO (IIF(EMPTY(T__File), "SysTest.TXT", T__File))SET ALTERNATE ONSET SAFETY ONSET EXACT OFFT__IsVisual = .T.T__OutputFile = SET("ALTERNATE", 1)DEFINE WINDOW T__win FROM 0,0 TO SROWS(),SCOLS() TITLE T__OutputFile CLOSE SYSTEM ZOOMACTIVATE WINDOW T__win??"*** SysTest Version 2.00","日期",DATE(),"時間",TIME(),"***"T__IsError = .F.IF (EMPTY(m.T__Method) OR UPPER(m.T__Method)="SET")WAIT WINDOW NOWAIT "*** SET() ***"?? "*** SET() ***"?PADR("SET(ALTERNATE)",30) + " == ", SET("ALTERNATE")?PADR("SET(ANSI)",30) + " == ", SET("ANSI")?PADR("SET(AUTOSAVE)",30) + " == ", SET("AUTOSAVE")?PADR("SET(BELL)",30) + " == ", SET("BELL")?PADR("SET(BLINK)",30) + " == ", SET("BLINK")?PADR("SET(BLOCKSIZE)",30) + " == ", SET("BLOCKSIZE")?PADR("SET(BRSTATUS)",30) + " == ", SET("BRSTATUS")?PADR("SET(CARRY)",30) + " == ", SET("CARRY")?PADR("SET(CENTURY)",30) + " == ", SET("CENTURY")?PADR("SET(CLASSLIB)",30) + " == ", SET("CLASSLIB")?PADR("SET(CLEAR)",30) + " == ", SET("CLEAR")?PADR("SET(CLOCK)",30) + " == ", SET("CLOCK")?PADR("SET(COLOR)",30) + " == ", SET("COLOR")?PADR("SET(COMPATIBLE)",30) + " == ", SET("COMPATIBLE")?PADR("SET(CONFIRM)",30) + " == ", SET("CONFIRM")?PADR("SET(CONSOLE)",30) + " == ", SET("CONSOLE")?PADR("SET(CURRENCY)",30) + " == ", SET("CURRENCY")?PADR("SET(CURSOR)",30) + " == ", SET("CURSOR")?PADR("SET(DATE)",30) + " == ", SET("DATE")?PADR("SET(DEBUG)",30) + " == ", SET("DEBUG")?PADR("SET(DECIMALS)",30) + " == ", SET("DECIMALS")?PADR("SET(DEFAULT)",30) + " == ", SET("DEFAULT")?PADR("SET(DELETED)",30) + " == ", SET("DELETED")?PADR("SET(DELIMITERS)",30) + " == ", SET("DELIMITERS")?PADR("SET(DEVELOPMENT)",30) + " == ", SET("DEVELOPMENT")?PADR("SET(DEVICE)",30) + " == ", SET("DEVICE")?PADR("SET(DISPLAY)",30) + " == ", SET("DISPLAY")?PADR("SET(DOHISTORY)",30) + " == ", SET("DOHISTORY")?PADR("SET(ECHO)",30) + " == ", SET("ECHO")?PADR("SET(ESCAPE)",30) + " == ", SET("ESCAPE")?PADR("SET(EXACT)",30) + " == ", SET("EXACT")?PADR("SET(EXCLUSIVE)",30) + " == ", SET("EXCLUSIVE")?PADR("SET(FIELDS)",30) + " == ", SET("FIELDS")?PADR("SET(FILTER)",30) + " == ", SET("FILTER")?PADR("SET(FIXED)",30) + " == ", SET("FIXED")?PADR("SET(FULLPATH)",30) + " == ", SET("FULLPATH")?PADR("SET(HEADING)",30) + " == ", SET("HEADING")?PADR("SET(HELP)",30) + " == ", SET("HELP")?PADR("SET(HISTORY)",30) + " == ", SET("HISTORY")?PADR("SET(HOURS)",30) + " == ", SET("HOURS")?PADR("SET(INTENSITY)",30) + " == ", SET("INTENSITY")?PADR("SET(KEYCOMP)",30) + " == ", SET("KEYCOMP")?PADR("SET(LIBRARY)",30) + " == ", SET("LIBRARY")?PADR("SET(LOCK)",30) + " == ", SET("LOCK")?PADR("SET(LOGERRORS)",30) + " == ", SET("LOGERRORS")?PADR("SET(MACKEY)",30) + " == ", SET("MACKEY")?PADR("SET(MARGIN)",30) + " == ", SET("MARGIN")?PADR("SET(MARK)",30) + " == ", SET("MARK")?PADR("SET(MEMOWIDTH)",30) + " == ", SET("MEMOWIDTH")?PADR("SET(MENU)",30) + " == ", SET("MENU")?PADR("SET(MESSAGE)",30) + " == ", SET("MESSAGE")?PADR("SET(MOUSE)",30) + " == ", SET("MOUSE")?PADR("SET(MULTILOCKS)",30) + " == ", SET("MULTILOCKS")?PADR("SET(NEAR)",30) + " == ", SET("NEAR")?PADR("SET(NOTIFY)",30) + " == ", SET("NOTIFY")?PADR("SET(ODOMETER)",30) + " == ", SET("ODOMETER")?PADR("SET(OPTIMIZE)",30) + " == ", SET("OPTIMIZE")?PADR("SET(ORDER)",30) + " == ", SET("ORDER")?PADR("SET(PALETTE)",30) + " == ", SET("PALETTE")?PADR("SET(PATH)",30) + " == ", SET("PATH")?PADR("SET(PDSETUP)",30) + " == ", SET("PDSETUP")?PADR("SET(POINT)",30) + " == ", SET("POINT")?PADR("SET(PRINTER)",30) + " == ", SET("PRINTER")?PADR("SET(PROCEDURE)",30) + " == ", SET("PROCEDURE")?PADR("SET(REFRESH)",30) + " == ", SET("REFRESH")?PADR("SET(REPROCESS)",30) + " == ", SET("REPROCESS")?PADR("SET(RESOURCE)",30) + " == ", SET("RESOURCE")?PADR("SET(SAFETY)",30) + " == ", SET("SAFETY")?PADR("SET(SCOREBOARD)",30) + " == ", SET("SCOREBOARD")?PADR("SET(SEPARATOR)",30) + " == ", SET("SEPARATOR")?PADR("SET(SHADOWS)",30) + " == ", SET("SHADOWS")?PADR("SET(SPACE)",30) + " == ", SET("SPACE")?PADR("SET(STATUS)",30) + " == ", SET("STATUS")?PADR("SET(STATUS BAR)",30) + " == ", SET("STATUS BAR")?PADR("SET(STEP)",30) + " == ", SET("STEP")?PADR("SET(STICKY)",30) + " == ", SET("STICKY")?PADR("SET(SYSMENU)",30) + " == ", SET("SYSMENU")?PADR("SET(TALK)",30) + " == ", SET("TALK")?PADR("SET(TEXTMERGE)",30) + " == ", SET("TEXTMERGE")?PADR("SET(TOPIC)",30) + " == ", SET("TOPIC")?PADR("SET(TYPEAHEAD)",30) + " == ", SET("TYPEAHEAD")?PADR("SET(UDFPARMS)",30) + " == ", SET("UDFPARMS")?PADR("SET(UNIQUE)",30) + " == ", SET("UNIQUE")?PADR("SET(ALTERNATE,1)",30) + " == ", SET("ALTERNATE",1)?PADR("SET(CLOCK,1)",30) + " == ", SET("CLOCK",1)?PADR("SET(CURRENCY,1)",30) + " == ", SET("CURRENCY",1)?PADR("SET(DELIMITERS,1)",30) + " == ", SET("DELIMITERS",1)?PADR("SET(FIELDS,1)",30) + " == ", SET("FIELDS",1)?PADR("SET(HELP,1)",30) + " == ", SET("HELP",1)?PADR("SET(MESSAGE,1)",30) + " == ", SET("MESSAGE",1)?PADR("SET(PRINTER,1)",30) + " == ", SET("PRINTER",1)?PADR("SET(RESOURCE,1)",30) + " == ", SET("RESOURCE",1)?PADR("SET(TALK,1)",30) + " == ", SET("TALK",1)?PADR("SET(TEXTMERGE,1)",30) + " == ", SET("TEXTMERGE",1)ENDIFT__IsError = .F.IF (EMPTY(m.T__Method) OR UPPER(m.T__Method)="ON")WAIT WINDOW NOWAIT "*** ON() ***"?? "*** ON() ***"?PADR("ON(ERROR)",30) + " == ", ON("ERROR")?PADR("ON(ESCAPE)",30) + " == ", ON("ESCAPE")?PADR("ON(KEY)",30) + " == ", ON("KEY")?PADR("ON(KEY LABEL)",30) + " == ", ON("KEY LABEL")?PADR("ON(PAGE)",30) + " == ", ON("PAGE")?PADR("ON(READERROR)",30) + " == ", ON("READERROR")?PADR("ON(SHUTDOWN)",30) + " == ", ON("SHUTDOWN")ENDIFT__IsError = .F.IF (EMPTY(m.T__Method) OR UPPER(m.T__Method)="MIS")WAIT WINDOW NOWAIT "其他設置"?? "其他設置"?PADR("CAPSLOCK()",30) + " == ", EVALUATE("CAPSLOCK()")?PADR("CPCURRENT()",30) + " == ", EVALUATE("CPCURRENT()")?PADR("CPCURRENT(1)",30) + " == ", EVALUATE("CPCURRENT(1)")?PADR("CPCURRENT(2)",30) + " == ", EVALUATE("CPCURRENT(2)")?PADR("DISKSPACE()",30) + " == ", EVALUATE("DISKSPACE()")?PADR("FULLPATH('')",30) + " == ", EVALUATE("FULLPATH('')")?PADR("GETENV('COMSPEC')",30) + " == ", EVALUATE("GETENV('COMSPEC')")?PADR("GETENV('FOXPROCFG')",30) + " == ", EVALUATE("GETENV('FOXPROCFG')")?PADR("GETENV('FOXPROSWX')",30) + " == ", EVALUATE("GETENV('FOXPROSWX')")?PADR("GETENV('FOXPROX')",30) + " == ", EVALUATE("GETENV('FOXPROX')")?PADR("GETENV('PATH')",30) + " == ", EVALUATE("GETENV('PATH')")?PADR("GETENV('TEMP')",30) + " == ", EVALUATE("GETENV('TEMP')")?PADR("INSMODE()",30) + " == ", EVALUATE("INSMODE()")?PADR("ISCOLOR()",30) + " == ", EVALUATE("ISCOLOR()")?PADR("MEMORY()",30) + " == ", EVALUATE("MEMORY()")?PADR("NUMLOCK()",30) + " == ", EVALUATE("NUMLOCK()")?PADR("OS()",30) + " == ", EVALUATE("OS()")?PADR("OS(1)",30) + " == ", EVALUATE("OS(1)")?PADR("PRINTSTATUS()",30) + " == ", EVALUATE("PRINTSTATUS()")?PADR("VERSION(1)",30) + " == ", EVALUATE("VERSION(1)")?PADR("VERSION(2)",30) + " == ", EVALUATE("VERSION(2)")?PADR("VERSION(3)",30) + " == ", EVALUATE("VERSION(3)")ENDIFT__IsError = .F.IF (EMPTY(m.T__Method) OR UPPER(m.T__Method)="VAR")WAIT WINDOW NOWAIT "系統(tǒng)內存變量"?? "系統(tǒng)內存變量"?PADR("_ASCIICOLS",30) + " == ", EVALUATE("_ASCIICOLS")?PADR("_ASCIIROWS",30) + " == ", EVALUATE("_ASCIIROWS")?PADR("_BROWSER",30) + " == ", EVALUATE("_BROWSER")?PADR("_BUILDER",30) + " == ", EVALUATE("_BUILDER")?PADR("_CONVERTER",30) + " == ", EVALUATE("_CONVERTER")?PADR("_DBLCLICK",30) + " == ", EVALUATE("_DBLCLICK")?PADR("_GENGRAPH",30) + " == ", EVALUATE("_GENGRAPH")?PADR("_GENMENU",30) + " == ", EVALUATE("_GENMENU")?PADR("_GENPD",30) + " == ", EVALUATE("_GENPD")?PADR("_GENSCRN",30) + " == ", EVALUATE("_GENSCRN")?PADR("_GENXTAB",30) + " == ", EVALUATE("_GENXTAB")?PADR("_PDRIVER",30) + " == ", EVALUATE("_PDRIVER")?PADR("_PDSETUP",30) + " == ", EVALUATE("_PDSETUP")?PADR("_SHELL",30) + " == ", EVALUATE("_SHELL")?PADR("_SPELLCHK",30) + " == ", EVALUATE("_SPELLCHK")?PADR("_STARTUP",30) + " == ", EVALUATE("_STARTUP")?PADR("_TRANSPORT",30) + " == ", EVALUATE("_TRANSPORT")?PADR("_WIZARD",30) + " == ", EVALUATE("_WIZARD")ENDIFT__IsError = .F.IF (EMPTY(m.T__Method) OR UPPER(m.T__Method)="FONT")WAIT WINDOW NOWAIT "可用字體"?? "可用字體"=AFONT(T__fonts)FOR T__i = 1 TO ALEN(T__fonts)T__string = T__fonts[m.T__i] + ": "IF AFONT(T__sizes, T__fonts[m.T__i])FOR T__j = 1 TO ALEN(T__sizes)T__string = m.T__string+IIF(m.T__j==1, "", ", ")+;IIF(T__sizes[m.T__j]==-1,"scalable", LTRIM(STR(T__sizes[m.T__j])))ENDFORENDIF? m.T__stringENDFORRELEASE T__i, T__j, T__fonts, T__sizes, T__stringENDIFT__IsError = .F.IF (EMPTY(m.T__Method) OR UPPER(m.T__Method)="CONFIG")FOR T__i = 1 TO 3DO CASECASE m.T__i==1T__File = SYS(2019)IF EMPTY(m.T__File)T__File = SYS(2004)+"CONFIG.FPW"ENDIFCASE m.T__i==2T__File = "C:\CONFIG.SYS"CASE m.T__i==3T__File = "C:\AUTOEXEC.BAT"ENDCASEWAIT WINDOW NOWAIT "配置文件"?DO CASECASE m.T__i==1T__File = SYS(2019)IF EMPTY(m.T__File)T__File = SYS(2004)+"CONFIG.FPW"? "*** " + "配置文件" + SYS(2004) + " CONFIG.FPW ***"ELSE? "*** " + "配置文件" + SYS(2019) + " CONFIG.FPW ***"ENDIFCASE m.T__i==2T__File = "C:\CONFIG.SYS"? "*** " + "配置文件" + "C:\CONFIG.SYS ***"CASE m.T__i==3T__File = "C:\AUTOEXEC.BAT"? "*** " + "配置文件" + "C:\AUTOEXEC.BAT ***"ENDCASEIF FILE(m.T__File)T__handle = FOPEN(m.T__File)IF m.T__handle>-1DO WHILE NOT FEOF(m.T__handle)? FGETS(m.T__handle)ENDDO=FCLOSE(m.T__handle)ELSE? "不能打開文件."ENDIFELSE? "不能找到文件."ENDIFENDFORRELEASE T__File, T__handle, T__iENDIFSET CONSOLE OFF? "完成"SET CONSOLE ONCLOSE ALLT__handle = FOPEN(T__OutputFile, 2)IF NOT m.T__handle==-1=FSEEK(m.T__handle, -1, 2)IF FREAD(m.T__handle,1)==CHR(26)=FCHSIZE(m.T__handle, FSEEK(m.T__handle, -1, 2))ENDIF=FCLOSE(m.T__handle)ENDIFACTIVATE SCREENSET TALK OFFSET MESSAGE TO "檢查完成,結果已寫至" + T__OutputFileWAIT CLEARZOOM WINDOW T__win MAXMODIFY COMMAND (T__OutputFile) NOEDIT WINDOW T__win NOMENURELEASE WINDOW T__winSET VIEW TO it.vueDELETE FILE it.vueSET MESSAGE TO " "RETURN
[dvnews_page=VFP 高級教程:VFP 開發(fā)技巧]
第十一節(jié) 附表:"選項"對話框的說明
顯示:
包含控制 Visual FoxPro 顯示界面的選項。
 
選項 說明注冊表主鍵名 命令、函數、系統(tǒng)變量
狀態(tài)欄 指定 Visual FoxPro 是否在主窗口底部顯示狀態(tài)欄。 StatusBar SET STATUS BAR
時鐘 指定 Visual FoxPro 是否在狀態(tài)欄中顯示系統(tǒng)時鐘。必須選中“狀態(tài)欄”選項,此選項有效。對應于 命令。 CLOCK SET CLOCK STATUS
命令結果 指定 Visual FoxPro 主窗口、系統(tǒng)信息窗口、圖形狀態(tài)欄或一個用戶定義窗口中,顯示命令(包括 APPEND FROM、AVERAGE、CALCULATE、COUNT、INDEX、SUM 和 TOTAL)的結果。 TALK SET TALK
系統(tǒng)信息 指定在 Visual FoxPro 的狀態(tài)欄顯示系統(tǒng)信息。 NOTIFY SET NOTIFY
最近用過的項目列表 指定 1、2、3、4 命令出現在“文件”菜單中。允許直接打開最近使用過的四個項目。如果未選定“文件位置”選項卡中的“資源文件”,或者 SET RESOURCE 被設置為 OFF,該選項不可用。 RecentlyUsedFiles
在啟動時打開上一個項目 指定啟動時 Visual FoxPro 打開最近一次使用的項目。如果未選定“文件位置”選項卡中的“資源文件”,或者 SET RESOURCE 被設置為 OFF,該選項不可用。 LastProject
 
返回頂部
常規(guī)
包含了有關 Visual FoxPro 中聲音、程序設計、數據輸入的選項以及其它選項。
 
選項 說明注冊表主鍵名 命令、函數、系統(tǒng)變量
警告聲音 關閉:關閉報告錯誤的聲音;默認:把報告錯誤的聲音設置為系統(tǒng)的默認值。播放:把報告錯誤的聲音設置為一個 .wav 文件??梢栽诳蛑墟I入文件名,也可以單擊三點按鈕選擇一個已存在的 .wav 文件。 BELL SET BELL
按ESC 鍵取消程序運行 通過按 ESC 鍵取消一個正在運行的程序 ESCAPE SET ESCAPE
記錄編輯錯誤 在一個與項目文件同名的 .err 文件中記錄 Visual FoxPro 的編譯錯誤。 LOGERRORS SET LOGERRORS
SET DEVELOPMENT 如果對象的代碼比源代碼舊,Visual FoxPro 將在運行前重新進行編譯。 DEVELOPMENT SET DEVELOPMENT
嚴格的日期級別 指定是否不明確的日期和日期時間常量會產生錯誤。 STRICTDATE SET STRICTDATE
與 dBASE 兼容 指定與 FoxBASE+、dBASE 以及其它 Xbase 語言的兼容性。 COMPATIBLE SET COMPATIBLE
使用 VFP 調色板 對所有位圖或 OLE 對象指定使用默認的 Visual FoxPro 調色板。在同時顯示幾個圖片時可以防止切換調色板。 PALETTE SET PALETTE
文件替換時加以確認 指定用新文件改寫已存在文件時,Visual FoxPro 要求確認。 SAFETY SET SAFETY
瀏覽表時啟動 IME 控件 當您在“瀏覽”窗口中定位一個文本框時,Visual FoxPro 將顯示一個輸入法編輯器。如果不是在 DBCS 環(huán)境中工作,該設置無效。對應于函數。 BROWSEIMECONTROL SET BROWSEIME
定位鍵 指定是否為任務(例如,在表單中的控件之間移動)使用與 Windows 或 MS_DOS 兼容的定位鍵。對應于 命令。 KEYCOMP SET KEYCOMP
用當前值填充新記錄 指定 Visual FoxPro 自動將當前記錄的值復制到插入或添加的新記錄中。 CARRY SET CARRY
使用 TAB 或 Enter 鍵退出字段 指定只有按 ENTER 或 TAB 鍵來退出編輯文本框。否則,鍵入的字符超過文本框最后一個字符時也可退出該文本框。對應于命令。 CONFIRM SET CONFIRM
 
返回頂部
數據
包含控制表中數據的選項。
 
選項 說明注冊表主鍵名 命令、函數、系統(tǒng)變量
以獨占方式打開 指定 Visual FoxPro 是否以獨占方式打開表及數據庫,這樣當您使用它們工作時,其他人不能夠查看或修改它們。以獨占方式打開文件可以帶來更好的性能。在其他用戶不需要訪問數據(比如在晚上)的環(huán)境下,當處理大量記錄時,可以使用該選項。 EXCLUSIVE SET EXCLUSIVE
顯示字段名 指定在 AVERAGE、CALCULATE、DISPLAY、LIST 和 SUM 命令的輸出中,是否在每個字段的開始位置放一個字段名作為列標頭。 HEADINGS SET HEADINGS
提示代碼頁 在打開沒有指定代碼頁的表時,Visual FoxPro 提示是否指定一個代碼頁。 CPDIALOG SET CPDIALOG
忽略已刪除記錄 當執(zhí)行帶有作用域子句的命令時,指定 Visual FoxPro 是否忽略帶有刪除標記的記錄;如果清除了這個選項,Visual FoxPro 命令將使用這些帶有刪除標記的記錄。 DELETED SET DELETED
Rashmore 優(yōu)化 當執(zhí)行帶有 FOR 子句的命令時,指定 Visual FoxPro 是否使用 Rushmore 優(yōu)化。該選項對應于 命令。 OPTIMIZE SET OPTIMIZE
在索引中不出現重復記錄 指定 Visual FoxPro 是否允許在索引文件中包含具有相同索引關鍵字值的記錄。如果選定了該選項,只有第一個包含原始索引關鍵字的記錄被索引。 UNIQUE SET UNIQUE
排序系列 指定字符字段在索引和排序操作中的排序順序。 COLLATE SET COLLATE
記錄計數器間隔 在諸如 COPY TO 等命令的執(zhí)行過程中,指定 Visual FoxPro 更新狀態(tài)欄中顯示的記錄計數器之前,應該處理多少條記錄(范圍從 1 到 32,767 條記錄)。指定的數目越高,更新之間的延遲就越長,但命令可以執(zhí)行的更快。必須選定“視圖”選項卡中的“狀態(tài)欄”選項,該選項才有效。 ODOMETER SET ODOMETER
備注塊大小 指定給備注字段分配的磁盤空間大小。您輸入的值指定了一個備注字段所需的最小磁盤空間,以及當數據添加到備注字段中時備注字段增加的大小。如果您指定了一個介于 1 和 32 之間的值,Visual FoxPro 用 512 乘以您的值,然后按那個大小的塊分配磁盤空間。如果您指定了一個大于 32 的值,Visual FoxPro 只分配該大小的塊,因此指定大于 32 的數目可以節(jié)省磁盤空間。 BLOCKSIZE SET BLOCKSIZE
瀏覽窗口刷新時間間隔 指定 Visual FoxPro 更新一個活動“瀏覽”窗口中記錄的顯示的頻率,在多用戶環(huán)境中它十分有用(可能的值從 0 到3600)。把該值設置為 0 可以防止更新。設置該值為一個大的數目,可以不太頻繁的更新“瀏覽”窗口,從而可以提高性能。 BrowseRefresh SET REFRESH
表刷新時間間隔 指定 Visual FoxPro 更新一個活動表的顯示的頻率(可能的值從 0 到3600)。把該值設置為 0 可以防止更新。設置該值為一個大的數目,可以不太頻繁的更新“瀏覽”窗口,從而可以提供性能。在多用戶環(huán)境中它十分有用。 TableRefresh SET REFRESH
SET NEAR on 指定如果 FIND 或 SEEK 命令失敗,則 Visual FoxPro 將記錄指針定位在匹配程度最大的記錄上。 NEAR SET NEAR
SET EXACT on 指定在使用等號 (=) 時,Visual FoxPro 使用兩個字符串的全部長度(除了后綴的空格)。如果清除了該選項,當到達等號 (=) 右側表達式的末尾時,Visual FoxPro 即停止比較兩個字符串。注釋 該設置對 = 操作符的結果不起作用。 EXACT SET EXACT
SET ANSI on 用 SQL = 操作符比較字符串時,指定 Visual FoxPro 是否填充字符串。SQL = 操作符逐字符比較,直至短字符串結束為止。如果您選擇了該選項,Visual FoxPro 用空格填充短的字符串,因此一個 SQL 比較可能失?。?#8220;Tommy”不等于“Tom”)。如果您清除了該選項,將不填充短字符串,因此不等長的字符串也可能相等(“Tommy”等于“Tom”)。 ANSI SET ANSI
文件自動鎖定 指定 Visual FoxPro 對某些不更改數據的命令(包括 AVERAGE、COPY TO、INDEX、REPORT、SORT 以及 TOTAL)自動鎖定文件。如果您清除了該選項,在這些命令執(zhí)行期間文件不鎖定,其他用戶可以在您的命令執(zhí)行期間更改記錄。 LOCK SET LOCK
多個記錄鎖定 指定是否能夠同時鎖定多條記錄。如果您清除了該選項,Visual FoxPro 清除當前所有的鎖定,并且一次只允許您鎖定一條記錄。當您鎖定下一條記錄時,當前記錄即解除鎖定。 MULTILOCKS SET MULTILOCKS
緩沖 在多用戶環(huán)境中,指定是否在本地進行緩沖更改記錄。緩沖分開放式緩沖或保守式緩沖。緩沖可以提高性能并能提供更強的并行控制。要使該選項生效,您必須選定“多個記錄鎖定”選項。 CrsBuffering CURSORSETPROP( )
重新處理 對已被其他用戶鎖定的表或記錄再進行多少次或多長時間鎖定嘗試。 REPROCESS SET REPROCESS
 
返回頂部
遠程數據
包含了有關遠程 (ODBC) 視圖和連接默認值的選項。
 
選項 說明注冊表主鍵名 命令、函數、系統(tǒng)變量
遠程視圖默認值 “遠程視圖默認值”框中的設置代表了 Visual FoxPro 當前工作期中臨時表的設置。
共享連接 指定 Visual FoxPro 使用當前連接處理新的視圖。在數據源一次只支持一個連接時,它很有用。 CRSShareConnection CURSORSETPROP( ) 和 CURSORGETPROP( )
取備注字段 指定只有在視圖輸出中激活一個備注或通用字段后才從數據源取備注或通用字段。清除該選項可以減少初始從遠程表中下載的數據量,這將提高性能。 CrsFetchMemo
SQL 更新條件 指定當您試圖更新數據前,Visual FoxPro 檢查遠程服務器上的字段來決定是否改變數據。如果選擇條件所指定遠程字段中的數據已經更改,則更新失敗。 CrsWhereClause
SQL 方法程序 指定 Visual FoxPro 是使用 SQL UPDATE 還是使用 SQL DELETE,然后用 INSERT 來更新遠程服務器上的信息。 CrsMethodUsed
每次取的記錄數 指定 Visual FoxPro 從遠程數據源中一次返回多少條記錄。選定“全部”可以指定在第一次取操作中即返回所有的記錄。該設置受“要取的最大記錄數”中指定值的限制。 CrsFetchSize
要取的最大記錄數 指定一個視圖返回的記錄總數。如果您錯誤地建立了一個查詢,它可以防止返回過多的數據。選擇“全部”可以指定返回所有的記錄。 CrsMaxRows
使用備注字段的長度 指定長字符型字段中數據的最大長度。指定在視圖輸出中,如果字符數據超出指定長度時,將長字符字段轉換成備注字段。默認值是 255 ,等于 Visual FoxPro 中字符型字段的最大長度。 CrsUseMemoSize
成批更新的記錄數 指定視圖一次發(fā)送的更新語句數目。調整這個值可以明顯地提高更新性能。默認值是 1。 CrsNumBatch
連接默認值 “連接默認值”框中的設置代表 Visual FoxPro 連接的全局默認設置。
異步執(zhí)行 指定把控制權返回給您的應用程序之后,Visual FoxPro 在后臺執(zhí)行 SQL pass-through 命令(使用 SQLEXEC( )、SQLMORERESULTS( )、SQLTABLES( ) 和 SQLCOLUMNS( ))。如果您選定了該選項,您的應用程序可以顯示過程信息,并且允許用戶使用 ESC 鍵中斷一個命令(如果 SET ESCAPE 已經設置為“真”)。您可以決定一個異步執(zhí)行的 SQL 命令的狀態(tài),方法是重復地調用其中一個 SQL pass-through 函數,直至它報告命令已經完成為止。這個選項的默認值是廢止(同步執(zhí)行),它指定 Visual FoxPro 在把控制權返回您的應用程序之前一直等待,直至 pass-through SQL 命令完成為止。 SQLAsynchronous SQLSETPROP( ) 和 SQLGETPROP( )
顯示警告信息 允許顯示警告信息。 SQLDispWarnings
批處理 在使用 SQLEXEC( ) 發(fā)送多個 SQL pass-through 語句時,指定 Visual FoxPro 并不返回任何結果,直到所有結果集合都檢索到為止。對應于在 SQLSETPROP( ) 函數中設置 BatchMode。如果廢止了該選項,您必須調用 SQLMORERESULTS( ) 來確定數據是否可用。 SQLBatchMode
自動事物處理 指定由遠程表上的連接自動處理事務。如果清除了該選項,您必須使用 SQLCOMMIT( ) 和 SQLROLLBACK( ) 人工處理事務過程。 SQLTransactions
顯示登陸信息 當一個連接激活時,指定是否顯示登錄提示(如果該連接需要用戶進行登錄)。例如,“只在必要時”指出,只有在連接或視圖定義中未指定登錄信息的情況下,才出現登錄提示。 SQLDispLogin
連接超時設定 指定與遠程服務器建立一個連接所需等待的秒數(0 到 600 之間)。如果在指定時間內不能建立這個連接,則 Visual FoxPro 顯示錯誤。指定 0 為無限制地等待一個連接。 SQLConnectTimeOut
空閑超時設定 指定連接不活動前允許空閑時間的分鐘數。如果在指定時間內沒有請求使用服務器,則 Visual FoxPro 終止該連接。但是,連接超時后如果對服務器又有請求,則 Visual FoxPro 將試圖自動恢復這個連接。 SQLIdleTimeOut
查詢超時設定 指定等待服務器響應一個請求的秒數(0 與 600 之間)。如果服務器在指定秒數的時間內還不處理查詢,則 Visual FoxPro 顯示錯誤。指定 0 可以無限制地等待查詢結果。 SQLQueryTimeOut
等待時間 指定 Visual FoxPro 檢查 SQL 語句是否執(zhí)行結束之前經過的毫秒數。 SQLWaitTime
 
返回頂部
文件位置
包含了 Visual FoxPro 使用文件的目錄位置和名字。可以直接在每個框中鍵入路徑和文件名,也可以單擊對話框按鈕激活對話框設置相應的選項。
 
選項 說明注冊表主鍵名 命令、函數、系統(tǒng)變量
ActiveDoc 啟動程序 當從“工具”菜單選擇“運行 Active Document”時,指定所調用的應用程序的文件名稱。默認值為 Runactd.prg。 _RUNACTIVEDOC _RUNACTIVEDOC
生成器 當在“表單設計器”中的快捷菜單中選擇“生成器”時,指定調用的應用程序名稱。一個生成器包含一個或多個對話框,幫您設置特定控件的屬性,或者組合一些子句來創(chuàng)建特定的表達式。如果您在“表單”選項卡中選定了“生成器鎖定”選項,可以自動顯示生成器。 _BUILDER _BUILDER
類瀏覽器 當從“工具”菜單選擇“類瀏覽器”時,指定所調用的應用程序的文件名稱。默認值為 Browser.app。 _BROWSER _BROWSER
組件管理庫 當從“工具”菜單選擇“組件管理器”時,指定所調用的應用程序的文件名稱。默認值為 Gallery.app。 _GALLERY _GALLERY
轉換器 指定轉換器應用程序的文件名,當打開由較早版本的 FoxPro 或 Visual FoxPro 創(chuàng)建的表單、報表、或其他應用程序時,調用轉換程序。 _CONVERTER _CONVERTER
代碼范圍分析器 在創(chuàng)建調試代碼范圍和分析輸出時,指定其應用程序的名稱。默認值為 Coverage.app。 _COVERAGE _COVERAGE
默認目錄 指定默認的 Visual FoxPro 目錄。如果選定該框并且選擇“設置為默認值”按鈕,則顯示的目錄將注冊為當前和所有將來工作期的默認目錄;如果未選定該框并且選擇“設置為默認值”,則將從注冊中刪除顯示的目錄;如果選定該框并且選擇“確定”,則只更改本工作期的默認目錄。最后,如果清除選定該框,則不能夠更改當前工作期的默認目錄。 SetDefault SET DEFAULT
默認包含文件 指定預定義編譯時刻常量的默認頭文件,該文件被自動包含在用戶自定義類、表單或表單集中。該選項默認為空。 _INCLUDE _INCLUDE
文檔向導 當從“工具”菜單選擇“修飾”時,指定所調用的應用程序的文件名稱。當在編輯窗口打開某個程序或文本文件時,在“工具”菜單中顯示“修飾”命令。默認值 Beautify.app。 _BEAUTIFY _BEAUTIFY
表達式生成器 當發(fā)出 GETEXPR 命令或從 Visual FoxPro 內部調用“表達式生成器”時,指定所執(zhí)行的應用程序名稱。該選項默認值為空。 _GETEXPR _GETEXPR
HTML 生成器 當從“文件”菜單選擇“另存為 HTML”命令時,指定所調用的應用程序名稱。默認值為 Genhtml.prg。 _GENHTML _GENHTML
幫助文件 指定 Visual FoxPro 是否顯示“幫助”,使用哪個文件作為幫助內容。復選框的設置對應幫助的打開和關閉。如果文件名的擴展名是 .hlp,使用圖形“幫助”。如果文件名擴展名是 .dbf,那么將使用 .dbf 樣式的“幫助”。如果未指定擴展名,則默認為圖形“幫助”。 HelpOn
HelpTo
SET HELP
菜單生成器 指定菜單生成程序的文件名。 _GENMENU _GENMENU
資源文件 指定 Visual FoxPro 是否把當前的狀態(tài)(宏、窗口的大小及位置等等)存儲在一個資源文件中。如果存儲,指定使用哪一個文件。如果未選定該選項,每次啟動時,Visual FoxPro 都把系統(tǒng)狀態(tài)重置為默認值。并且“選項”對話框中的一些選項將被廢止。 ResourceOn
ResourceTo
SET RESOURCE
示例目錄 指定包含 Visual FoxPro 示例文件的目錄。 _SAMPLES _SAMPLES
搜索路徑 指定一些目錄,當 Visual FoxPro 在默認目錄中找不到文件時,便在這個框中指定的目錄中繼續(xù)搜索文件??蛑械哪夸浿g必須用逗號或分號隔開。如果使用對話按鈕指定多個目錄,則自動在目錄之間插入分號。 PATH SET PATH
拼寫檢查器 指定拼寫檢查器應用程序的文件名。 _SPELLCHK _SPELLCHK
啟動程序 指定啟動 Visual FoxPro 時所調用的應用程序名稱。默認值為 Vfp6strt.app。 _STARTUP _STARTUP
臨時文件 指定 Visual FoxPro 保存臨時文件的目錄。例如,在排序或索引時。因為臨時文件可能變得很大,所以要指定一個具有足夠自由空間的目錄。要獲得最好的性能,還應該指定一個最快的驅動器;例如在多用戶環(huán)境中,您可能需要指定一個本地驅動器。 TMPFILES
向導 指定運行向導時調用的應用程序的文件名。 _WIZARD _WIZARD
 
返回頂部
表單
包含“表單設計器”的選項。
 
選項 說明注冊表主鍵名 命令、函數、系統(tǒng)變量
網格線 指定在“表單設計器”中顯示網格線,以幫助調整控件。注釋 此設置僅應用于新表單,對現有表單的設置將保存在表單的資源文件中。 GridShow
對齊格式 在畫新控件時,指定它們的邊緣與最近的表格線對齊。注釋 此設置僅應用于新表單,對現有表單的設置將保存在表單的資源文件中。 GridSnap
水平間距 指定水平網格線之間的間隔寬度。該寬度基于選項卡上的“度量單位”選項。注釋 此設置僅應用于新表單,對現有表單的設置將保存在表單的資源文件中。 GridHorz
垂直間距 指定垂直網格線之間的間隔高度。該高度基于選項卡上的“度量單位”選項。注釋 此設置僅應用于新表單,對現有表單的設置將保存在表單的資源文件中。 GridVert
顯示位置 指定是否在狀態(tài)欄上顯示對象的位置和尺寸。 GridShowPos
TAB 鍵次序 指定如何設置表單中的 Tab 鍵次序。選擇“交互”,可以單擊控件確定它們的順序。選擇“按列表”,可以使用“Tab 鍵次序”對話框。 TabOrdering
度量單位 為“表單設計器”和“類設計器”設置默認度量單位??芍付?#8220;像素”或者 “Foxel”。 ScaleUnits
最大設計區(qū) 指定設計時表單的最大尺寸。Visual FoxPro 不允許把表單調整到大于指定的尺寸。指定用戶可能希望的最小尺寸很有好處,可以讓所有用戶都能看到它。如果不選擇任何東西,Visual FoxPro 將不實施任何尺寸限制。 ResWidth
ResHeight
表單集 顯示“表單集模板”,從中可以選擇一個表單集模板。 FormSetLib
FormSetClass
表單 顯示“表單模板”對話框對話框,從中可以選擇一個表單模板。 FormsLib
FormsClass
生成器鎖定 當您創(chuàng)建的控件有一個注冊的生成器時,指定在“表單設計器”中自動顯示生成器。 BuilderLock
提示在運行表單之前前保存修改 指定當您從“表單設計器”中運行一個表單時,Visual FoxPro 將提示您保存您自上次保存以來所做的更改。如果清除了該選項,在運行表單之前,“表單設計器”自動保存更改。 PromptBeforeRun
 
返回頂部
項目
包含了有關“項目管理器”的選項。
 
選項 說明注冊表主鍵名 命令、函數、系統(tǒng)變量
項目雙擊操作 指定在“項目管理器”中雙擊一個文件時,Visual FoxPro 是否運行或修改該文件。 ProjectClick
向導提示 如果選中,指示 Visual FoxPro 提示您使用向導。當從“項目”菜單選擇“新建文件”或在“項目管理器”中選擇“新建”按鈕時,出現這些提示。 WizardPrompt
顯示用戶自定義的圖標 指定 Visual FoxPro 在“項目管理器”中顯示用戶自定義的容器圖標。 UseContainerIcons
激活源代碼管理器 指定要使用的源代碼管理應用程序名稱。您在這里指定的名稱將應用到新項目中。當您創(chuàng)建一個新項目時,這里起作用的源代碼管理程序名稱將與項目存儲在一起,這樣,每次打開該項目,Visual FoxPro 都可以知道要使用的源代碼管理程序。若要廢止源代碼管理,請選擇“無”。 SCCProvider
自動加入新的項目到源代碼管理器 指定當創(chuàng)建一個項目時,Visual FoxPro 將提示您把該項目置于源代碼管理器之中。如果清除了該選項,新項目不會自動置于源代碼管理器之中,您必須人工地添加它們。注釋 如果用戶在“命令”窗口中使用命令(比如 MODIFY)修改項目文件,他們必須首先簽出文件。 SCCUseSCCOnPjxCreate
通過修改簽出文件 指定當用戶從“項目管理器”中修改文件時,自動把它們簽出給用戶。如果文件已經簽出,Visual FoxPro 顯示錯誤信息。如果清除了該選項,試圖修改文件(沒有從“項目管理器”簽出的文件)的用戶可以查看文件,但不能修改它們。 SCCCheckOutOnModify
通過添加往源代碼管理器上加入文件 指定添加進項目的文件自動置于該項目的源代碼管理器之中。如果清除了該選項,您添加的文件變成項目的一部分(.pjx 文件),但沒有置于源代碼管理器之中。
注釋 在添入項目時,數據庫 (.dbc)、表 (.dbf)、API 庫以及應用程序 (.app) 文件不能自動添到源代碼管理器。但您可以人工地把這些文件添加進源代碼管理器。
SCCAddFileOnAdd
通過移去從源代碼管理器中刪除文件 當您從項目中移出一個文件時,指定文件也從源代碼管理器中移出。如果清除了該選項,當您從項目中移出一個文件時,該文件的源代碼管理信息仍保留在源代碼管理數據庫中。這樣做可以維持這個文件的歸檔信息,并且如果該文件未從磁盤上刪除,您可以通過源代碼管理器在 Visual FoxPro 之外訪問它。 SCCRemoveFileOnRemove
顯示快捷菜單命令的對話框 當您從項目快捷菜單中選擇一個源代碼管理命令時,指定 Visual FoxPro 允許您選擇多個文件來執(zhí)行選定的命令。如果清除了該選項,所選命令只能用于項目中的選定文件,但是,按 SHIFT+單擊鼠標右鍵然后選擇命令可以忽略這個設置。 SCCContextDialogsOn
文本生成 在每次簽入文件時,指定用來創(chuàng)建二進制文件(表單、標簽、菜單、報表或類庫)的文本表示的應用程序名稱。結果文本文件與表的源文件一起簽入,可以用來創(chuàng)建報表以記錄同一文件的不同版本之間的區(qū)別。 _SCCTEXT
項目類 顯示“項目參考”對話框,可以從中指定一個默認的 ProjectHook 類作為新項目的模板。 ProjectHookLib
ProjectHookClass
 
返回頂部
控件
包含了為指定“選項”對話框中“表單”選項卡上的模板類而登記可視類庫的選項。這些選項也指定“表單控件”工具欄上“查看類”按鈕中可以選擇的內容,這可以簡化向表單中添加用戶自定義控件的工作。
 
選項 說明注冊表主鍵名 命令、函數、系統(tǒng)變量
可視類庫\ActiveX 控件 指定類庫(.vcx 文件)在“選定”列表框中顯示。 ShowVCXs
指定顯示在“選定”列表中的 ActiveX 控件。
選定 列出可以添加或移出您的 Visual FoxPro 環(huán)境的文件。如果您選擇了“可視類庫”,該列表顯示您已經添加的 .vcx 文件,同時指定當您單擊“表單控件”工具欄上的“查看類”按鈕時,哪些庫出現在快捷菜單上。如果您選擇了“ActiveX 控件”,該列表顯示系統(tǒng)中可用的對象及控件類。您添加的 ActiveX 對象和控件已經選定,當您單擊“表單控件”工具欄上的“查看類”按鈕時,它們將出現在快捷菜單上。
標簽 當選定“可視類庫”選項時顯示標簽。指定類庫的名稱。默認情況下,Visual FoxPro 使用不帶 .vcx 擴展名的文件名。
庫 當選定“可視類庫”選項時顯示。對當前選定類庫的 .vcx 文件,顯示它的路徑及文件名。
可插入對象 當選定“ActiveX”時出現??梢灾付ǔ霈F在“選定”列表中的 ActiveX 對象類型。指定“選定”列表顯示對象的類,它們作為 ActiveX 對象插入到 Visual FoxPro 應用程序中。 ShowOLEInsertable
控件 當選定“ActiveX”時出現。可以指定出現在“選定”列表中的 ActiveX 對象類型。
指定“選定”列表顯示 ActiveX 控件。
ShowOLEControls
添加 選擇按鈕顯示“打開”對話框,從而可以向“選定”列表中添加庫(.vcx文件)或者 ActiveX 控件。添加一個控件同時也注冊它,從而使它在“插入對象”對話框以及其他應用程序中可用。
移去 當選定“可視類庫”選項時出現,選擇此按鈕,從“選定”框中移去選定的庫。
 
返回頂部
區(qū)域
 
選項 說明注冊表主鍵名 命令、函數、系統(tǒng)變量
使用系統(tǒng)設置 選定該選項時,本選項卡上全部選項均從系統(tǒng)讀取(設置是控制面板中建立的設置)。在這種方式下,絕大部分選項是只讀的。
如果清除該選項,則可以指定選項設置,Visual FoxPro 使用這些設置,而不使用系統(tǒng)設置。
SYSFORMATS SET SYSFORMATS
日期格式 指定一個日期格式(年、月、日的順序)。選擇“短”可以移去日期中前面的零。選擇“長”可以完全地顯示日期。 DATE SET DATE
日期分隔符 指定日期各部分之間的字符。清除該選項將使用默認的分隔符。 MARK SET MARK TO
年份 選定時,指定顯示關于世紀的信息(例如,1998)。清除選項時,指定用 2 位顯示年份(例如,98)。 CENTURY SET CENTURY
小時 把時間設置為顯示“AM”或“PM”的 12 小時或24 小時格式。 HOURS SET HOURS
計秒 時間顯示中包括秒。 SECONDS SET SECONDS
貨幣格式 指定貨幣符號的位置。 CurrLeft SET CURRENCY
符號格式 指定貨幣符號字符或字符串。 CurrSymbol SET CURRENCY
千位分隔符 指定小數點左方每三位插入的一個字符。 SEPARATOR SET SEPARATOR
小數分隔符 指定一個用以指示小數點位置的字符。 POINT SET POINT
小數位數 指定小數分隔符后的小數位數。 DECIMALS SET DECIMALS
星期開始于 指定哪一天是一個星期的開始。 FDOW SET FDOW
一年的第一周 指定哪一個星期是一個年日歷的開始。 FWEEK SET FWEEK
 
返回頂部
調試
通過設置選項來定制 Visual FoxPro 調試器窗口。
 
選項 說明注冊表主鍵名 命令、函數、系統(tǒng)變量
環(huán)境 指定調試環(huán)境:
Debug Frame 所有調試器的窗口出現在一個大頁框中。這個頁框在 Visual FoxPro 主窗口之外,有自己的菜單和工具欄。這樣,可以使調試器更少地介入應用程序的運行環(huán)境。如果選擇了該選項,您可以通過選擇"工具"菜單上的"調試器"來打開調試器。
FoxPro Frame 調試器窗口出現在 Visual FoxPro 主窗口中。如果您只需要單個的窗口打開(如"監(jiān)視"窗口),FoxPro 環(huán)境最有用。如果選擇了該選項,Visual FoxPro 用打開單個窗口的命令代替"工具"菜單上的"調試器"命令,同時單個調試窗口的工具欄也貼在 Visual FoxPro 主窗口中。
注釋 調試器打開時您不能更改該選項。
DebugEnvironment
顯示計時器事件 在達到間隔值時,如果您希望 Timer 控件的 Timer 事件顯示在“跟蹤”窗口中,選定該選項。如果您清除了這個選項,Timer 事件仍然發(fā)生,但不顯示;就好象您已經為那個事件指定了“跳出”一樣對待。 DebugTimerEvents
指定窗口 選定一個選項,指定為哪一個調試器窗口設置選項。
調用堆棧 顯示堆棧調用順序:在"調用堆棧"窗口列出的每一個程序旁邊顯示一個編號,最大的編號指示當前執(zhí)行的程序。 CallstackOrder
顯示當前行的指示器:指示當前行指示符→是否顯示在“調用堆棧”窗口中 CallstackCurrentLine
顯示堆棧調用指示器:在"調用堆棧"窗口中,是否顯示一個箭頭→ 來指示在"跟蹤"窗口中顯示的過程。如果當前行與調用堆棧過程相同,Visual FoxPro 只顯示當前行指示符。 CallstackStackPos
輸出:顯示“記錄調試輸出”區(qū)域 記錄調試輸出 把寫入"調試輸出"窗口中的值復制到文本文件中。如果選擇記錄輸出值,您需要指定一個日志文件,日志文件的默認擴展名是 .log。只有當"調試輸出"窗口顯示時,Visual FoxPro 才會把輸出記錄到一個文件中。您可以在程序中使用 DEBUGOUT 或 SET PRINTER TO DEBUG 命令顯示"調試輸出"窗口中的信息(并把它發(fā)送到日志文件中)。
當退出 Visual FoxPro 時,該選項被清除。這樣下次啟動 Visual FoxPro 時,您就不會無意中改寫日志文件。
DebugOutputFileName
追加 指定在現有文件當前內容的后面寫入調試輸出,保留初始的內容。 DebugOutputAppend
改寫 指定調試輸出改寫指定文件的內容。 DebugOutputAppend
監(jiān)視 該窗口沒有可用的附加選項。
局部 該窗口沒有可用的附加選項。
跟蹤 顯示行號 在"跟蹤"窗口中的代碼行左側顯示行號。 TraceLineNumbers
跟蹤斷點之間的部分 以調節(jié)速度執(zhí)行斷點之間的代碼。調節(jié)速度意味著在每行程序的執(zhí)行之間有數秒的停頓。如果您清除了該選項,則以正常速度執(zhí)行斷點之間的代碼。 TRBETWEEN SET TRBETWEEN
運行每行時暫停 指定執(zhí)行每行代碼之間停頓的秒數。該選項允許您減慢程序的執(zhí)行,這樣您可以看到每行代碼,而不需要單獨找每一行。 _THROTTLE
所有窗口 字體:為指定的調試器窗口選擇一個字體和樣式。例如,若要設置調試器“跟蹤”窗口的字體,在“指定窗口”下選擇“跟蹤”,然后選定“字體”來選擇字體、大小及字體樣式。 TraceFontName
WatchFontName
LocalsFontName
OutputFontName
CallstackFontName
TraceFontSize
WatchFontSize
LocalsFontSize
OutputFontSize
CallstackFontSize
TraceFontStyle
WatchFontStyle
LocalsFontStyle
OutputFontStyle
CallstackFontStyle
區(qū)域:選擇您準備為其指定顏色的文本元素。例如,若要指定更改的值所用文本的顏色,選定“已改變的值”。“區(qū)域”列表中的選擇取決于“指定窗口”下指定的窗口。 TraceNormalColor
TraceExecutingColor
TraceCallstackColor
TraceBreakpointColor
TraceSelectedColor
WatchNormalColor
WatchSelectedColor
WatchChangedColor
LocalsNormalColor
LocalsSelectedColor
OutputNormalColor
OutputSelectedColor
CallstackNormalColor
CallstackSelectedColor
前景:為選定范圍的文本選擇顏色。要使用 Windows 控制面板中建立的默認顏色,選擇“自動”。
背景:為選定范圍選擇一個背景顏色。例如,如果要用藍底黃字顯示注釋,可以在“前景”框中選擇黃色,然后在“背景”框中選擇藍色。要使用 Windows 控制面板中建立的默認顏色,選擇“自動”。
 
返回頂部
語法著色
包含的選項可以指定顏色及字體,用來區(qū)分 Visual FoxPro 的程序元素,比如關鍵字和注釋。這些程序元素在命令窗口或所有編輯窗口(除用 MODIFY FILE 或 MODIFY MEMO 命令打開的編輯窗口之外)中使用。
 
選項 說明注冊表主鍵名 命令、函數、系統(tǒng)變量
區(qū)域 選擇要設置字體及顏色的程序元素類型。當選擇時,其他控件將被更新到選定范圍值。
字體 為指定的區(qū)域選擇一個字體樣式。例如,在您的程序中,要用斜體顯示所有注釋,在“區(qū)域”框中選擇“注釋”,然后在“字體”框中選擇“斜體”。 EditorCommentColor
EditorKeywordColor
EditorConstantColor
EditorNormalColor
EditorOperatorColor
EditorStringColor
EditorVariableColor
EditorCommentStyle
EditorKeywordStyle
EditorConstantStyle
EditorNormalStyle
EditorOperatorStyle
EditorStringStyle
EditorVariableStyle
前景 為選定范圍的文本選擇顏色。要使用 Windows 控制面板中建立的默認顏色,選擇“自動”。
背景 為選定區(qū)域選擇一個背景顏色。例如,如果要用藍底黃字顯示注釋,可以在“區(qū)域”框中選擇“注釋”,在“前景”框中選擇黃色,然后在“背景”框中選擇藍色。要使用 Windows 控制面板中建立的默認顏色,選擇“自動”。
示例 該區(qū)域顯示您的設置效果。
全部重置 選定該選項可以把語法著色設置為 Visual FoxPro 默認值。
 
返回頂部
字段映象
 
選項 說明注冊表主鍵名 命令、函數、系統(tǒng)變量
將字段類型映象到類中 顯示字段類型與類(控件)之間當前的映象關系。列表包括:
類型
類庫 一個類庫,該類庫包含映象到一個字段類型的類定義。如果該列為空,該字段類型將映象到一個 Visual FoxPro 基類上。
類名 一個字段類型將要映象的類,它指定了將要創(chuàng)建的控件類型。
修改 選擇該按鈕可以顯示“字段類型映象”對話框,從中可為選定的字段類型指定一個不同的映象。
若要修改字段映象
在“選項”對話框的“字段映象”選項卡中,選擇“修改”。
在“字段類型映象”對話框內,從“字段類型”列表中選擇一個字段類型。
若要設置類(該類在拖動一個表或多個記錄時即可創(chuàng)建),選擇“多用途型”。
要選擇類庫(.vcx 文件),該類庫包含您希望與選定字段類型聯系在一起的控件,選擇“瀏覽”。
從“文件名”列表中選擇一個類的名稱。每當把選定類型的字段拖到表單上時,都會創(chuàng)建您在這里指定的類。
選擇“確定”或“應用”來接受映象。
拖放字段標題 如果希望 Visual FoxPro 使用字段的標題作為即將創(chuàng)建類的標題,選定該選項。如果您清除該選項,Visual FoxPro 將不會創(chuàng)建字段標題。
復制字段備注 選定該選項可以使 Visual FoxPro 在創(chuàng)建類時,把字段的注釋(如果有的話)復制到新類的 Comment 屬性中。
復制字段輸入掩碼 選定該選項可以使 Visual FoxPro 在創(chuàng)建類時,把字段的輸入掩碼(如果有的話)復制到新類的 InputMask 屬性中。
復制字段格式 選定該選項可以使 Visual FoxPro 在創(chuàng)建類時,把字段的格式設置(如果有的話)復制到新類的 Format 屬性中。
 
本站僅提供存儲服務,所有內容均由用戶發(fā)布,如發(fā)現有害或侵權內容,請點擊舉報。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
vfp6中怎樣制作安裝程序???
VFP的_SCREEN對象屬性和事件的定義
vfp《基礎知識》含參考答案
VFP能干什么?六、客戶/服務器開發(fā)方案
vfp 如何實現樹形路徑|交流區(qū) - 梅子Visual FoxPro 編程 - Powered by phpwind
編程論壇-[求助]VFP9連編后的程序傳到未裝VFP的機上不能運行?
更多類似文章 >>
生活服務
分享 收藏 導長圖 關注 下載文章
綁定賬號成功
后續(xù)可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點擊這里聯系客服!

聯系客服