VFP7-Behavior Changes since the Previous Version

本章翻譯自 foxhelp.chm Behavior Changes since the Previous Version.
很多可能翻譯的與原文不同,但是大意是一樣的.
從前一版到現在的行為改變
這個章節描述了這一版和前版VFP行為較為不同的地方,這些改變可能會影響到已經存在的程式碼.
._Screen 和 _VFP 這兩個物件的屬性已經經過調整,使得這兩個物件的屬性比較容易區分._VFP就是協調整個VFP應用程式的視窗(包含選單和狀態列)._Screen就是負責協調目前整個桌面區域(比如使用?指令時,會有輸出結果的視窗)
.為了效率,CreateObject()函數不再為一個動態已被建立的Name屬性的值加入連續號碼.這會應用到在prg檔案中的沒有明確定義Name屬性或基本類別的類別定義.(似乎影響不大)
.因為支援 IntelliSense 和 COM Server 型態(舉例來說 Local cName as string), 利用空白字元隔開的變數宣告(如 local x y z)將不再被允許.宣告變數的時候必須以 , 隔開(如 local x,y,z ).
.Session類別現在在為一個OLEPUBLIC的子類別產生Type Library的時候隱藏了固有的屬性,方法和事件. 另外,當利用session物件使用一個私有的data session時,SET TALK,SET EXCLUSIVE,SET SAFETY預設設定為 off.
.Version函數傳回的格式改變了. Build number現在移到最後面去了.如果你有使用AGETFILEVERSION函數的話,這也可能影響到.
.某些 Home([n]) 傳回的數值被改變了.這些變化只會影響到目前安裝的 Visual Studio. Samples和Graphics資料夾現在移到VFP的根目錄下.
.儲存檔案的新預設位置為了要和Windows 2000 Logo Guide相容的關係,已經被改變了.你可以從選項對話方盒(檔案位置頁籤)查看(或改變)位置. 譯註1.
.選單檔案(MNX)的格式已經被改變,以便能容納新的圖形支援.
.資料庫檔案(DBC)的格式在”DBC事件”啟動的時候將會被改變.
.命令列視窗現在會自動把內容保存起來.內容存放在 _command.prg 中.
.資源檔(如 FOXUSER )現在是開啟為分享模式,所以你可以執行好幾個VFP的個體,且使用同一個資源檔.在前一個版本,你可以在選項對話方盒中去設定.
.VFP執行時期函式庫(舉例,VFP7T.DLL)不在安裝在 Windows\system 目錄下.此外,其他語言的資源檔現在將和英文的產品一同安裝.譯註2.
.當屬性視窗設定為Dockable的時候,將會一直開啟著,即使目前的form/class designer(表單/類別設計)已經關閉.
.舊版FoxBASE+所支援的FOXGRAPH,FOXVIEW,FOXGEN,FOXCODE,CENTRAL和ASSIST已經不再被支援.
.Windows檔案總管在開啟已經的VFP檔案格式的時候,現在會喚起一個新的VFP個體來開啟檔案.此外,程式檔(PRG)和查詢檔(QRY)同時支援”Open”和”Run”選項.程式檔現在的預設動作為”Open”取代了前版本的”Run”.
.Class/Form Designer(類別/表單設計)畫面顯示的格子(如果有設定要顯示格線)現在以實際的像素來顯示,取代前一版本使用Fox2x的設定.譯註3.
.Grid欄位標頭現在允許顯示鍵盤快捷鍵.這僅僅只有顯示而已,所以開發者如果要處理快捷鍵的動作,必須要寫程式來處理.
.#includes 的搜尋路徑已經延展為PRGs(程式檔), SCXs(畫面檔)和VCXs(類別檔).
.使用SET EVENTTRACKING指令產生出來的事件追蹤歷史檔的格式現在包含了一個Timestamp的欄位.
._DBLCLICK系統變數不再為控制項控制incremental搜尋,如listbox. 現在這被一個新的系統變數_INCSEEK來處理.
.一個起始的應用程式(舉例,vfp7strt.app)不再和VFP發布出去.
.ASCAN()函數的 nStartPos 參數如果傳入為0的數值的話,將只產生一個錯誤. 如果傳入一個比陣列個數要多的數值,也將傳回0.
.在前版本,當呼叫Create Table … name LongTable Name 時,我們可以利用 _ 來取代空白.當在Table Designer(表單設計)時將不會發生.在這個版本,這個功能被保留起來了,以與Table Designe的行為相同.
從前版本至今具特色的改變
接下來這些前一版本VFP的特點已經被移除了:
.文法檢查不再包含在此產品中.
.安裝精靈不再包含在此產品中. 一個以Microsoft Installer為基礎的發布工具將被提供. 細節部分請參考 Destributing Applications 這章.
.Graph不再包含,因為他本來是跟著之前的安裝精靈一併發布的.
.執行 ActiveDoc 的選單項目不再被包含在此產品中,但是仍然有效並且可以利用Do來呼叫.
.好幾個MSDN的選單項目已經從輔助說明選單中移除.此產品的線上文件已經改變為一個獨立的輔助說明檔,他和MSDN Library一樣好.此外,”Microsoft on the Web”子選單已經被一個單獨的”Visual FoxPro on the Web”項目所取代.
.Calendar, Outline 和 FoxHWnd ActiveX控制項不再和此產品一起銷售.
.VFP ODBC 驅動程式不再和此產品一起銷售.你仍然可以從VFP網站來取得.但VFP OLEDB Provider是一個存取遠端VFP資料更好的解決方案.
譯註1:可是我並沒有發現有任何改變,我使用的環境是 Windows 2000+VFP7.我想他指的是不是 set default 呢??
譯註2:的確,現在多安裝了VFP7CHT.DLL,VFP7KOR.DLL等這些資源檔.
譯註3:簡單的說,單位已經改變了.

初試啼聲 – 利用 Visual FoxPro 建立 Web Services

本文轉譯自VFP7光碟片 \technical articles\vfpws.doc

McAlister Merchant
Microsoft Corporation
Created: March 2001
Revised: March 2001
Applies To: Microsoft Visual Foxpro

總覽

Web Services 可以在任何地方被使用.你可以自己建立他們,或者你可以在他們被公佈的地方存取他們.
你可以使用VFP去建立 Web Services, 而且如果你在IntelliSense中註冊他們,VFP使得你能近乎自動化地存取他們變的可能.
你也可以使用VFP存取利用其他語言建立的 Web Services.

內容

介紹
Web Services
Establishing a Virtual Directory (建立一個虛擬目錄)
Creating a Project (建立專案)
Creating a COM Server (建立一個COM伺服器)
Creating and Publishing a Web Service (建立並發布一個 Web Service)
Registering a Web Service (註冊一個 Web Service)
Using a Web Service (使用一個 Web Service)
更多資訊
譯註

 

介紹

使用VFP建立 Web Services 是一個複雜的過程,因為牽涉到使用IIS, VFP COM伺服器和SOAP.
你使用IIS去建立一個虛擬目錄來參照到你的Service擺放在硬碟上的位置.
IIS可以利用MS NT4 Option Pack, MS W2k Professional或MS W2K Server來安裝.(在Option Pack中,IIS是其中的一部份,在W2K
Pro中可以利用新增/移除來安裝,W2K Server則是安裝時會自動一併安裝).譯註1.
然後你可以使用專案管理員去建立或編譯COM物件.當COM物件被建立了,你可以使用VFP Web Services精靈把他們公佈到你的虛擬目錄中.
你可以利用VFP的IntelliSense管理員去註冊 Web Services,所以Web Service的佈置和程式碼中必要呼叫的常式能迅速被執行.
這篇文章引領你為現存的COM伺服器建立Web Serveice並且準備Web Service以使用的這個複雜過程.
你能從一個COM伺服器建立一個簡單的Web Service,讓任何人都能從HTTP協定上存取.
這個 Web Service 提供一個關於目前目錄和有多少檔案在目錄中的簡單報告.

Web Services

Web Services延展了你自己的COM伺服器的可存取能力,能夠使得其他開發者能透過瀏覽器來存取.
Web Services提供機能並且能跨平台和在異質連接中存取資料.
你可以從Web Service存在的地方建立並使用Web Services去提供或者獲得功能.(譯註2)
大部分Web Service重要的觀點是Web Services使用HTTP協定和SOAP代理人,因此功能可以在跨越防火牆之後,仍然有效.
因為HTTP和SOAP是不管平台的,所以Web Services也是不管平台的.在某些案件,這仍能在COM失效的時候提供功能.
要發布一個 Web Service, 你必須在IIS中建立一個虛擬目錄,然後建立或複製一個COM伺服器,從而產生一個Web Service到你的虛擬目錄中.

 

Establishing a Virtual Directory(建立一個虛擬目錄)

你必須建立或識別一個目錄以存放你的 Web Services.
儘管你可以使用一個已存在的目錄,你仍可能想要在你硬碟上建立一個不一樣的地方存放這些檔案以方便管理你的Web Service檔案.
去建立一個虛擬目錄,譯註3
1.在VFP主要目錄下(\Program Files\Microsofft Visual FoxPro 7)建立一個資料夾,並命名為 Web Services.
2.在控制台裡的系統管理工具資料夾中,雙擊Internet服務管理員.
3.Internet服務管理員視窗打開,在左邊會顯示一個樹狀目錄,他顯示了你的硬碟.展開節點,以便能看到子資料夾.
4.在樹狀目錄中選擇預設的Web站台.
5.從右擊選單中,選擇"新增",然後點選"虛擬目錄".這會開啟"虛擬目錄新增精靈".
6.遵循精靈的指示進行,選擇虛擬目錄的時候,指定到步驟一所建立的 Web Services 資料夾.
你已經建立了一個虛擬目錄,參照到你的Web Services資料夾,之後你將會在這裡存放你建立的所有Web Services檔案.

 

Creating a Project (建立一個專案)

專案管理員在VFP中是十分基礎的應用程式建立工具.
在VFP專案中,你可以組合各式各項的文件,資料,類別,程式碼和其他類型的檔案等.
一個專案提供了你可能想要含括到一個伺服器中的所有元件,並且容納,以便編輯.
在這個範例中,你使用專案去編譯你的 Web Services
去建立一個專案,譯註4
1.在File(檔案)選單中,選擇 New(開新檔案)
2.在New(開新檔案)的對話盒中選擇 Project(專案),並點選 New File(開新檔案).
3.在 Create(建立)對話盒中,選擇你之前建立的 Web Services 資料夾,並且取名為 myWServ1.
4.點選 Save(存檔)
現在你已經在 Web Services 資料夾中建立了你的專案.這使得當你完成加入元件後可以在正確的資料夾中自動的儲存並編譯.

 

Creating a COM Server(建立一個COM伺服器)

因為,一個Web Service是一個.dll或.exe的檔案,你必須使用一個COM伺服器來當作你Web Service的基礎.
一個COM伺服器在VFP來說是一個有.dll或.exe副檔名,裡面包含從一個利用OLEPUBLIC識別字所建立的類別.
當一個物件被指定為OLEPUBLIC時,表示可以被Automation客戶端存取.當你從.dll檔案發布Web Service時,一個新的.wsdl檔案將會被產生.
.wsdl檔案有必要的XML源碼,他描述在.dll檔中的類別和參照實際在Web Service背後出力的.dll檔案.
從這個COM伺服器範例中,你將建立一個custom類別,他簡單回報了一些非常簡單的訊息.
在這個過程中,你將要寫一個程式來建立一個包含兩個方法的類別,並且編譯這個專案成一個COM伺服器和一個已發布的Web Service.
去建立一個簡單的類別,譯註5
1.在File(檔案)選單中,選擇New(新增).
2.在New(開新檔案)對話盒中,選擇Project(專案),並點選New file(開新檔案).這會開啟Project Manager(專案管理員).
3.在Project Manager(專案管理員)的All(所有)頁籤中,將Code(程式)展開,選擇Programs(程式碼),然後選擇New(開新檔案).
4.將下列的程式碼複製到程式碼編輯視窗中.
*– returns curdir() and number of JPEG files

DEFINE CLASS showem AS session OLEPUBLIC

Name = "showem"

PROCEDURE justshow
howmany=ADIR(afilArry,"*.jpg")
IF howmany <1
fileNm="no"
ELSE
fileNm=ALLTRIM(STR(howmany))
ENDIF

X = "about " + CURDIR() + " … "
Y = "There are " + fileNm + " JPEG files here."
RETURN x + y
ENDPROC
ENDDEFINE

這個程式定義了一個類別 showem,他有一個方法 justshow
5.關閉編輯視窗,並在Save As(另存新檔)對話盒中,將程式命名為myWServ1,並點選存檔.
6.確定 myServ1 設定為主程式.(如果他被設定為主程式,他將會以粗體呈現).如果沒有,在Project Manager(專案管理員)中,以滑鼠右鍵點選myWServ1並在快捷選單中選擇Set
Main(設為主程式).

 

去編譯這個COM伺服器

1.在Project Manager(專案管理員)中,選擇 Build (建立)
2.選擇 Single-threaded COM Server
3.選擇 Ok, 並接受名稱為 myWServ1
VFP將會編譯這個myWServ1檔案為一個COM伺服器,之後你就可以將這個COM伺服器轉為Web Service.

 

Creating and Publishing a Web Service(建立並發布一個Web Service)

必要地加入一個元件並且編譯COM伺服器,才能將你的COM伺服器轉為Web Service, 當成一個 Web Service發布.譯註6
在你指定完這些設定,VFP會建立必要的XML和SOAP檔案以將你的伺服器轉為一個 Web Service,註冊你的新 Web Service,並發布到你的虛擬目錄中.
去編譯和發佈一個Web Service
1.在你完成前一個步驟,並且編譯好COM伺服器myWServ1.dll,以滑鼠右鍵點選Project Manager(專案管理員),並從快捷選單中選擇Builder.
2.在Wizard Selection(精靈選擇)對話盒中,選擇Web Services Publisher,然後按下 Ok.
3.在VFP Web Services Publisher對話盒中,使用 Ellipsis 按鈕去找到 myWServ1, 然後選擇你想要從伺服器中註冊的類別.在這個你建立的COM伺服器中,myWServ1,你只有一個類別
showem
Note 點選 Advance(進階)按鈕以確定Web Services Publisher對話盒參照到正確的檔案是一個不錯的主意,特別是如果你建立了相似名稱的伺服器或者服務在不同資料夾的時候.如果正確的檔案沒有被顯示在下拉清單中,使用
Ellipsis 按鈕(…)去找到正確的檔案.
IntelliSense scripts 欄位下方顯示了你(和SOAP toolkit)將找到的名稱.在Advance Web Services Publisher對話盒中確認了資訊之後,點選Ok
譯註7.
4.點選Generate(產生)按鈕
在VFP產生Web Service檔案後, Web Services Publishing Results對話盒會出現,顯示包含COM伺服器,.wsdl檔案,ISAPI或ASP
listener和IntelliSense路徑名稱和編輯結果的清單.
到了這裡,你已經建立和發布你的Web Service.任何存取到你早先所建立的這個虛擬目錄,就能使用HTTP去存取你剛剛建立的Web Service.
要使用這個Web Service,你必須撰寫SOAP用戶端,一個listener(傾聽者)和瀏覽器的程式碼並且必須利用好幾個協定的層級和過程.
在VFP裡面,只要藉著在IntelliSense管理者中註冊Web Service就能簡化許多.

 

Registering a Web Service(註冊一個Web Service)

你可以在IntelliSense管理者中註冊Web Services(你所建立的或被其他人建立的).
當你做完,IntelliSense在你存取一個已註冊的Web Service時會提供了支援的程式碼.

去註冊一個Web Service
1.在 Tools(工具)選單,選擇IntelliSense Manager.
2.在IntelliSense Manager的Types頁籤,按下Web Services按鈕以註冊你新的Web Services(你的新類別也將會出現在Types清單中)
現在,當你加入一個強制型別的變數到你的VFP程式碼中時,IntelliSense將會提供你的Web Services如同一個非必要的選擇.
譯註8

 

Using a Web Service(使用一個Web Service)

使用Web Service就跟你想要一個應用程式的任何COM伺服器把功能公開出來給另一個應用程式或程式一樣.
舉例來說,你可以建立一個呼叫範例Web Service, myWServ1,的VFP程式.
在一個VFP程式中,宣告一個強制型別的變數,如同下列的程式碼一樣,藉著從IntelliSense下拉選單中可以參照到你的Web Service, myServ1.
LOCAL x AS myWServ1
VFP IntelliSense使用這個Web Service已註冊的資訊,去完成下列的程式碼:
x = CREATEOBJECT("MSSOAP.SoapClient")
x.MSSoapInit("http://TheVirtualDisk/web services/myWServ1.WSDL", ,
" myWServ1SoapPort")
然後,你可以像以前呼叫COM物件或類別的方法一樣去呼叫,就像下列的程式碼一樣:
? x.justshow()
譯註9
你可以加入相似的程式碼到VFP程式或應用程式中,去存取你自己的或其他Web Services.

 

更多資訊

要取得更多關於Web Services的資訊,請看VFP輔助說明中的 "Web Services Overview".
要取得更多關於COM伺服器的資訊,請看VFP輔助說明中的 "Creating Automation Servers".

Text for description meta tag:VFP使得從COM伺服器建立Web Services變的可能.

KeyWords(關鍵字):VFP Web Services, creating; VFP, creating Web Services;VFP, Web
Services.

 

譯註

譯註1:此句翻譯的不好,本來只有一句,但我切成兩句.
譯註2:此句也翻譯的不好.意思有到了.
譯註3:這邊的步驟,我都照做一次,並將原有的英文W2k上的字眼換成中文w2k上的字眼.
譯註4:因為我的VFP7是英文版的,所以我使用英文的字,不用中文的
譯註5:如果你前面有建立專案的話,就不需要再建立了,直接從步驟三開始吧.
譯註6:這句翻的非常不好,附上原文: To add the components necessary to turn your COM server into
a Web Service, you must compile the COM server as a Web Service.
譯註7:此處務必要自己玩過一遍,盡量多按一按,因為這邊寫的不是很清楚.
譯註8:如果你之前為虛擬目錄取名為 "Web Services" 時,會出現錯誤,因為他不允許名稱中間有空白!!
譯註9:這段程式碼讓我花了一些時間去測試,不過錯誤原因在於我自己在建立並發布Web Services的時候,選擇了以ASP的方式產生,後來改為ISAPI的方式產生就ok了.

VFP7 對 XML 的支援

XML是一種在網路上用來描述與傳遞的標準語言,就跟 HTML 是用來建立並顯示網頁的標準語言一樣.
XML使用標籤和屬性來界定資料,並且完整的保留資料原有的解釋讓應用程式去閱讀.
為了盡可能的要讓你更容易的利用XML來實作資料交換,VFP提供如下的新函數和功能:
CURSORTOXML( ) 將一個Cursor轉換成XML.
XMLUPDATEGRAM( ) 從一個有被變更過的工作區或cursor建立一個XML更新語法.
XMLTOCURSOR( ) 將XML資料轉換成Cursor或資料表格.
以上轉譯自 VFP7 提供的輔助說明.
以下就簡單介紹用法,但詳細用法,仍請參照輔助說明.
CursorToXML()
直接把工作區的資料轉換為一個xml檔案
舉例來說
CursorToXML(“LABELS”, “myXMLFile.xml”, 1, 512, 0, ;
“mySchema.xsd”, “http://www.microsoft.com/mySchema.xsd”)
這一行就是說把 LABELS 這個工作區的資料,轉換為 myXMLFile.xml
1 的意思就是Element-centric XML ,轉換為以元素為主的XML.
512 是表示第二個參數是一個檔案
0 則是設定編碼原則
“mySchema.xsd” 則是轉出後的規則檔
“http://www.microsoft.com/mySchema.xsd” 則是表示規則要參照 www.microsoft.com 上的 mySchema.xsd
XMLTOCursor()
就是把xml檔案轉換為一個工作區,注意:目前工作區若有開啟檔案,將會被關閉!
XMLToCursor(“myXMLFile.xml”,”LABELS”)
XMLUpdateGram()
這是一個很有用的函數,使用前,你必須先把目前的buffering開啟
它主要是把目前工作區有被變更過的資料轉變為 xml
只有變更過的才會喔~
於是可以聯想到,資料在Client被處理完,可以只把有被變更過的傳回Server
大大減低網路的負荷,並且提昇速度喔
之後就可以利用 xmltocursor() 函數來處理

Build Library How-to

程式碼
======
假設 main() 呼叫 iloveso() 這個函式,而且程式分開的話,程式碼就會像這樣子:
callso.c
#include <stdio.h>
void iloveso(void);
int
main(void)
{
printf(“\nmain() begin\n”);
iloveso();
printf(“main() end\n”);
}
iloveso.c
#include <stdio.h>
extern void iloveso(void);
void
iloveso(void)
{
printf(“here is so!!\n”);
}
一般做法
========
一般的情況下,我們會這樣去編譯程式
gcc callso.c iloveso.c –o callso
編譯出來後,直接執行 ./callso 就可以執行程式了。
靜態連結
========
因為 iloveso() 這個函式,其他程式也可能會使用到,我們希望把他獨立出來,這樣子,別人就可以直接連結他,而不需要重新編譯一次。
我們可以先編譯為 obj 檔之後,再利用 ar 指令,將 obj 檔變為 .a (靜態library) 檔。
再執行Ranlib 以確保 .a 檔能跟 unix 相容。
gcc -c iloveso.c -o iloveso.o
ar rcv libiloveso.a iloveso.o
ranlib libiloveso.a
為了驗證這樣子是可行的,請先在 /etc/ld.so.conf 最後加上 /usr/local/lib。
接著執行 ldconfig。然後將 libiloveso.a 放到 /usr/local/lib
執行
gcc –o callso callso.c –liloveso
沒有錯誤訊息的話表示成功,請執行 ./callso 試試。
如果有錯誤的話,通常是因為 ld.so.conf 檔案未設定,或設定後未執行 ldconfig 的緣故。
動態連結
========
當有很多程式都使用同一個靜態Library時,每個程式都會將該靜態連結檔給含括進來,所以會造成空間浪費,我們可以利用動態連結避免掉這個缺點。
同樣的,我們可以利用下列的程式來編譯動態連結檔
gcc -shared -Wl,-soname,libiloveso.so -o libiloveso.so iloveso.c -lc
這樣子就直接產出 libiloveso.so 了。
接下來同樣安裝到 /usr/local/lib,確定ld.so.conf有增加/usr/local/lib後,執行 ldconfig,以完成設定。
然後利用如下指令編譯 callso.c
gcc -o callso callso.c –liloveso
這樣就 ok 了,你可以試著用 ldd callso 去驗證一下,是不是真的有連結到。
結論及注意事項
==============
發現了嗎??不管是靜態或動態,程式碼和程式指令都不曾變更過,只有編譯Library 檔時,有些許差別而已。這對程式設計師來說,真是方便很多。
要特別注意的是Library檔必須以 lib 為開頭;另外,當 .a 和.so 同時存在時,gcc 會自動以 .so 作為優先連結對象,若你要強迫gcc作靜態連結,就要在編譯時加上 –static 。

Windows Script Component 與 NT/2000 的安全

摘要:說明 Windows Script Component 與 NT/2000 檔案安全的關係

內容:

說明
參考

下載本文章的範例程式(下載後以滑鼠右鍵點選,然後選擇註冊即可)

說明

前二日,我在使用WSC(Windows Script Component)的時候,發現了很詭異的事情.

這個元件不管是利用VB或是利用Windows Script Host呼叫,都是正常而且可以運作的.

但是在 ASP 中,卻始終無法使用, 我為了這個問題,搞了兩個多小時,才終於搞懂,這個檔案的安全權限必須要加入IUSR_XXXX(IIS訪客)這個使用者才行!

唉唉唉~~

真是難搞的要命,如果各位有遇到難解的問題,不妨檢查一下資料夾以及檔案的安全權限,也許就能迎刃而解了.

呼~~

上面有提到 WSC, 我在這裡也順便說明一下, WSC 是 Microsoft 提出的一個與 Script 相關的技術,它讓我們可以利用 Script
來撰寫COM的元件,你可以參考http://www.microsoft.com/taiwan/products/develop/scripting/,這裡有許多與
Script 相關的技術文件.

本篇文章所附的範例則是來自 Active Server Pages 3.0 深度探索一書中的範例,主要的用處是結合Recordset來產生一個表格,使用方法很簡單:

dim objtbl
set objtbl = server.createobject("asptable.wsc")
objtbl.addcolumn "員工編號","emp_no",""
objtbl.addcolumn "員工姓名","emp_name", ""
obj.gettext()

不過我改寫過了,增加了兩個方法,一個方法是getpagetext(pageno),可以得到第幾頁的Table;另一個則是obj.getstrtext(),取得整個table的html字串.

當然這裡寫的還不是清楚,以後再來補吧 ^_^

參考

Active Server Pages 3.0 深度探索(國外出版社Wrox,國內則是由碁峰翻譯後發行)

What is an Interface

What is an iterface?(什麼是介面)?
在英文裡面,一個介面(Interface)是一組用來與不相干實體互動的設備或系統.根據這個定義,一個遙控器是一組介於你和電視的介面,英文是一組介於兩個人之間的介面,在軍隊中的行為協定是一組在不同階級的人之間的介面.在Java語言中,一組介面是一個與不相干物件互動的設備.一組介面大致可以比擬為一個協定(在行為上的允許).實際上,其他物件導向語言也有介面的功能,但他們稱他們的介面為協定.
腳踏車類別和他的後繼類別定義了一部腳踏車在騎的時候可以做什麼和不可以做什麼,但不包括腳踏車在其他期間與世界的互動.舉例來說,在店裡的一部腳踏車可以被一個庫存程式來管理.一個庫存程式不管物品是什麼類別的,他只要每個物品提供確切的資訊,像是價錢和追蹤號碼,就能管理.取代在其他不相關聯的物品上作強制類別關聯的做法是,庫存程式初始化了一個通訊的協定.這個協定引入常數和函式的集合,包含在一個介面之中.庫存介面將會被定義,但不是實作,裡面的方法將會被用來設定和取得零售價錢,給予一個追蹤號碼等等.
在庫存程式裡作業時,腳踏車類別必須藉著實作這個介面以同意這個協定.當一個類別實作一個介面,這個類別就需要實作在介面中定義的所有方法.例如,腳踏車類別將提供設定和取得零售價格,給予一個追蹤號碼等方法的實作.
使用一個介面去定義一個行為的協定,以用來被任何類別來實作.介面在以下情況是非常有用的:
.在沒有關聯的類別中找到相似點,而不需要強制給予類別的關係.
.定義一個或多個類別預計要實作的方法.
.不需要顯露出物件的類別,就能顯露他的程式化介面.

Internet Transfter Control的聯想

摘要:對於 Internet Transfer Control 元件的一個聯想

內容:

安裝說明
發想
參考

下載本文章的範例程式: ASP端 Client端
(均為自動解壓縮檔)

安裝說明

請將下載下來的 ASPCODE.EXE 解壓縮,放到 WEB Server 的某個資料夾 上, 然後在 IIS 中開啟一個虛擬目錄,對應到此資料夾.

而 INETCTRL.EXE 解壓縮後就放在 client 端執行,只是可能要改一下程式!!你需要在 Query Customer Informat 那個按鈕的click事件中作修正.
請原諒我沒有作詳細的說明,主要是因為程式中已經有說明了.

另外需要注意的是,WEB Server 必須要安裝 ADO 2.5
以上版本,另外要有裝 IE5.0以上版本, client 端的需求也是一樣!!

發想

某天,我在 Microsoft Newsgroup上看到一個Inetctrl 元件的應用範例
以前都沒想到可以用這個 Active X元件
挺有趣的
所以就動手寫了一個小程式,配合 ASP 做了一個有趣的應用
ASP 負責在 WEB Server 上 抓資料,並產生 XML
VFP 程式利用 Inetctrl 元件對 ASP 送指令,並取得 XML, 再轉換為 Recordset
於是就可以用啦!!
但是修改後的資料要怎麼送回去呢??
我在 post 的按鈕裡面已經寫了一部份了
到底在 ASP 程式還要作怎樣的配合才能把資料送回去?!

 

參考

Active Server Pages 3.0 深度探索(國外出版社Wrox,國內則是由碁峰翻譯後發行)


® 2001ellery寫的!!引用時,請加註出處!!謝謝~

SQL pass-through的使用

在VFP所附的範例或者是微軟的建議中,都一直有看到這方面的函數。
事實上,這些函數對於遠端資料的控制來說是很方便的。
如果經過適當包裝的話,就非常類似於Delphi或BCB的TQuery元件或TStoreProc元件,
有看過Delphi或BCB的人可以自行比較一下。
但是偏偏市面上的書對於這個部分如何使用…等都略過不提。
在這裡,提出一個範例供大家研究一下,略盡棉薄之力 。
p.s. Arsen=Ellery, And this article is co-write with Saint.
————————————————————————————————————

*使用SPT更新表格的範例
*作者:Arsen(Ellery)
*環境:在ODBC設定中,我設了fpm這個別名,路徑設到目錄下的foreign.dbc
Local ln_handle
*先連接
ln_handle=sqlconnect("fpm")
*執行查詢
=sqlexec(ln_handle,"select emp_no,name from basic","_basic")
*設定相關屬性:這幾個屬性必須設定,在MSDN上有詳細說明(記得多看MSDN)
=cursorsetprop("tables","basic") &&設定欲更新的資料表格
=cursorsetprop("sendupdates",.t.,"_basic") &&確定要進行更新
=cursorsetprop("keyfieldlist","emp_no","_basic") &&要依據何鍵值來進行更新 =cursorsetprop("updatablefieldlist","emp_no,name","_basic") &&哪些欄位要更新
*以下這行,比較複雜一點,空格前寫的是上一行的欄名,後面寫的是資料表格的欄名(要用alias.field這樣) =cursorsetprop("updatenamelist","emp_no basic.emp_no,name basic.name","_basic")
Replace Next 1 alltrim(name) with alltrim(name)+"Test"
use
*釋放連接
=sqldisconnect(ln_handle)

————————————————————————————————————
首先,謝謝Arsen,幫我解決了想了好久無法解決的問題。
其實,我的作法和他,並無很大的不同,只有這一行
=cursorsetprop(“updatenamelist”,”emp_no basic.emp_no,name basic.name”,”_basic”)
由於資料集預設的BUFFERING是3,所以只要移動記錄指標便會做存檔的動作
為了Client/Server效率上的考量,改用
=CURSORSETPROP(“BUFFERING”,5)
似乎是比較好的選擇。
另外附上另一份範例如下:

?sqldisconnect(0)
?sqlconnect("testdbc")
_sqlsele="sele * from mydbf"
=sqlexec(1,_sqlsele ,"myview")
?cursorsetprop("buffering",5)
REPLACE NAME WITH "TEST"
=cursorsetprop("tables","mydbf","myview")
=cursorsetprop("keyfieldlist","id","MYVIEW")
=cursorsetprop("updatablefieldlist","name","MYVIEW")
=cursorsetprop("sendupdates",.t.,"MYVIEW")
*=cursorsetprop("updatenamelist","ID MYDBF.ID,name MYDBF.name")&&這一行指令,有興趣的人可以比較
=cursorsetprop("updatenamelist","ID MYDBF.ID,name MYDBF.name") &&註解前和註解後有何差別
IF NOT TABLEUPDATE(.T.,.T.,"MYVIEW")
=AERRO(MYERROR)
CLEAR
?MYERROR(1)
?MESSAGE()
ENDIF

另外附上其他的做法,一檥可做到,請自行參考

AA=sqlconnect("testdbc")
IF AA>0
=SQLSETPROP(AA,"ASYNCHRONOUS",.F.)
=SQLSETPROP(AA,"BATCHMODE",.T.)
=SQLEXEC(AA,"sele * from mydbf","myview")
M.SQLDESC="UPDATE ...." &&請參考 SQL INSERT,UPDATE 語法"
=SQLEXEC(AA,M.SQLDESC) &&把指令送到後端讓Server去執行
ENDIF

VFP的認證測驗

VFP的認證測驗,主要測驗的是設計和實作分散式應用程式的解決方案。
在測驗之前,你必須要熟練以下列出的內容:
發展概念和邏輯規劃(Developing the Conceptual and Logical Design)

  • 將資料分組為實體,並且為它們正規化。
  • 在實體之間指定關聯。
  • 選擇能在實體間進行關聯並且擔保指示一致性(Referential Integrity)的外來鍵(Foreign key)。
  • 辨識出關聯到資料一致性(Data Integrity)的商業規則(Business rules)。
  • 將商業規則和限制(Constraint)混合到資料模型中。
  • 給予狀況以決定非正規化是否恰當。

衍伸出實體規劃
審慎評估邏輯規劃中對效率、維護、可伸展性和可利用性潛在的影響。需要考慮的部分包括COM、DCOM和中間層(middle tier)。

  • 發展VFP元件從資料庫中存取資料。
  • 規劃元件的屬性(Properite)和方法(Method)。
  • 規劃類別庫。考慮的部分包含繼承、封裝、容器(containership)、委任(delegation)和多形。

完成發展環境

  • 完成原始程式碼版本控制的環境。
  • 為發展分散式應用程式安裝並設定VFP。
  • 完成發展環境以執行MTS(Microsoft Transaction Server)、IIS(Inter Information Server)和MSMQ(Microsoft Message Queue Server)。

建立使用者服務

  • 實作方向(navigational)規劃
  • 建立選單。
  • 增加一個快捷選單(shortcut menu)到應用程式中。
  • 增加控制項(controls)到表單(forms)中。
  • 為控制項設定屬性。
  • 為控制項指定程式碼以回應一個事件。
  • 建立一個工具列。
  • 建立並管理資料輸入表單和對話盒(dialog boxes)
    • 運用控制項顯示、操作和連結資料。
    • 在執行時期(runtime)新增、刪除和操作控制項。
    • 使用表單集合( Forms collection)以在執行時期操作表單。
    • 給予一個狀況,增加程式碼到適當的表單事件中。這些事件包含Init、Destroy、Load、Unload、QueryUnload、Activate、Deactivate。
  • 檢查使用者輸入。考慮部分包含了單層(single-tier)、二層(two-tier)和多層(n-tier)的應用程式。
  • 在進入表單之後撰寫處理資料的程式碼。
  • 為表單或是Container加入一個ActiveX控制項去操作資料。這些ActiveX控制項包括 TreeView、ListView、ImageList和Web Browser。
  • 從網頁上和VFP互動。考慮到的技術包括FoxISAPI、DHTML、ASP和XML。
  • 產生、喚起和操作一個COM元件。
  • 在分散式應用程式中實作線上使用者輔助說明。
    • 設定恰當的屬性以讓使用者容易瞭解該屬性的用處。求助內容包括求助檔、HelpContextID(求助檔中作為指定訊息或文章的編號)和WhatsThisHelp。
    • 為一個應用程式建立HTML Help。
  • 在桌面應用程式(Desktop Application)為使用者介面(User Interface)實作錯誤處理。
    • 辨識並捕捉執行時期錯誤。
    • 處理行間錯誤(inline errors)。
    • 提示使用者錯誤訊息。
  • 經由Windows API來提昇功能。
  • 建立並管理COM元件

    • 建立一個實作了商業規則或邏輯的COM元件。
    • 建立一個和其他COM元件溝通的COM元件。
    • 為一個COM元件增加錯誤處理。
    • 為了要錯誤處理和除錯,將錯誤記錄下來到一個錯誤檔中。
    • 規劃並建立給MTS使用的元件。
      • 讓一個COM元件支援交易處理。
    • 為一個COM元件建立適合的伺服器類型(Server type)。類型有in-process、out-of-process和multithreaded。
    • 使用MTS Explorer來建立和管理套件。
      • 將原件增加到一個MTS套件中。
    • 利用使用者權限指定使用者只能限制使用某個MTS套件。
    • 使用元件陳列庫去管理元件。
    • 註冊和解除註冊一個COM元件。

    建立資料服務

    • 使用ADO和RDS存取和操作資料。
    • 使用VFP的原生資料處理和查詢能力(Query capabilities)(包含Local View)來存取和操作資料。
    • 使用SQL pass-through存取和操作資料。
    • 使用遠端資料集(Remote views)和本地資料集(Local views)來存取和操作資料。
    • 管理資料庫交易以確保資料一致性和可復原性。
    • 撰寫能取得和變更資料的SQL敘述。
    • 撰寫使用連結(join)來從多個資料表格連結資料的SQL敘述。
    • 撰寫能建立資料集(views)的SQL敘述。
    • 使用適合的鎖定和緩衝策略。策略包括悲觀(pessimistic)、樂觀(optimistic)、列和表格。
    • 建立和操作一個VFP stored procedure。
    • 建立並實作VFP trigger。
    • 從其他外在的資料來源匯入資料。
    • 撰寫能更新及變更資料的SQL敘述。

    建立實體資料庫

    • 以程式來建立和維護VFP的資料庫。
    • 規劃、建立和實作資料庫和資料表格。包含了資料一致性(Data Integrity)、參考完整性(Referential Integrity)和正規化(Normalization)。
    • 選擇並規劃一個索引策略。考慮最佳化(經由Rushmore)和索引維護。
    • 建立並維護索引。考慮最佳化(經由Rushmore)、程式化的操作、視覺化的操作和索引維護。

    測試並除錯

    • 決定適合的除錯技巧。
    • 辨識和描述測試計劃的要素。要素包括beta的測試、回歸測試(Regression testing)、單元測試(unit testing)、整合測試(integration testing)和重點測試(stress testing)。
    • 給予一個狀況,選擇適當的建立選項。(此處應是指在專案管理員裡按下建立後的一些選項)
    • 在應用程式中使用條件編譯。(此處應是指#ifdef、#ifndef…等指令的應用)
    • 使用除錯視窗(Debug Window)監控運算式和變數的值。
      • 使用即時運算視窗(Immediate window)來檢查或變更值。
      • 使用監看視窗(Watch window)來檢查或變更值。
      • 使用呼叫堆疊視窗(Call stack Window)來尋找錯誤。
    • 在應用程式中使用 Asserts。
    • 使用涵蓋分析工具應用程式來辨識效率瓶頸(Performance bottlenecks)和程式碼涵蓋範圍(Code coverage)。
    • 使用事件追蹤來確定事件發生的順序。
    • 設定中斷點以除錯應用程式。

    散發應用程式

    • 使用安裝程式精靈去建立一個能安裝分散式應用程式、註冊COM元件並容許反安裝的安裝程式。
    • 註冊一個實作DCOM的元件。
    • 為客戶端電腦(Client computer)和伺服器端電腦(Server computer)設定DCOM。
    • 為客戶端電腦設定以使用一個MTS元件,並且為客戶端電腦及伺服器端電腦設定遠端自動化(Remote automation)。
    • 為一個分散式應用程式計劃並實作以軟式磁碟機或CD為基礎的散發程式。
    • 為一個分散式應用程式計劃並實作以Web為基礎的散發程式。
    • 為一個分散式應用程式計劃並實作以網路(Network)為基礎的散發程式。

    為應用程式提供維護和支援

    • 為災難復原程序提出計劃並實作之。
    • 修正錯誤並提早評估以預防未來的錯誤。
    • 維護異常的報告。
    • 為分散式應用程式散發應用程式更新。

    Step by Step 用 C# 做出一個 GUI 的應用程式

    這是我在 MSDN 網站上,看到的一篇文章
    這篇文章一步一步的引領你如何使用 C# 來寫作 GUI 應用程式.
    我覺得很實用
    http://msdn.microsoft.com/library/en-us/dnmag01/html/winforms.asp
    這篇文章主要是假設你有 Visual Studio.Net beta 1 整合開發環境來引領的
    不過如果沒有 vs.net beta 1 的話,可以用 .Net Framework beta 1 來實作
    如果使用 .Net Framework beta 2 的話,有幾點要注意:
    1.編譯時所引用的 Dynamic Link Library 有變化
    這是文章所建議的編譯方法,即 beta 1:
    csc /target:winexe /out:Hello.exe /reference:System.dll
    /reference:System.WinForms.dll /reference:System.Drawing.dll
    /reference:Microsoft.Win32.Interop.dll Hello.cs
    beta 2 的編譯方法改變了, 以下是我試出來的結果:
    csc /target:winexe /out:Hello.exe /reference:System.dll
    /reference:System.Windows.Forms.dll /reference:System.Drawing.dll Hello.cs
    主要是 beta 2 將 DLL 的架構做了一些調整
    2.using 的架構:
    beta 1 是
    using System;
    using System.WinForms;
    using System.Drawing;
    而 beta 2 是
    using System;
    using System.Windows.Forms;
    using System.Drawing;
    其實這邊主要是跟 1 有關係,在beta 1 你可以試著尋找 System.WinForms.dll, 你將會發現有這麼一個檔案;但是在 beta 2 中卻沒有, beta 2 中只有System.Windows.Forms.dll.
    3.MessageBox 類別有變化,其實應該也是因為架構調整的關係吧
    beta 1:
    MessageBox.Show (String.Format (“{0} is not ” +
    “a valid image file”, fileName), “Error”,
    MessageBox.OK | MessageBox.IconError);
    beta 2:
    MessageBox.Show (String.Format (“{0} is not ” +
    “a valid image file”, fileName), “Error”,
    MessageBoxButtons.OK,MessageBoxIcon.Error);
    其他應該還有很多有所調整, 可能要參考 .Net Framework 的說明才能得知囉.