全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:1924
推到 Plurk!
推到 Facebook!

DELPHI開發Web程式常見問題

 
jackkcg
站務副站長


發表:891
回覆:1050
積分:848
註冊:2002-03-23

發送簡訊給我
#1 引用回覆 回覆 發表時間:2002-10-28 05:25:52 IP:61.221.xxx.xxx 未訂閱
此為轉貼資料 DELPHI開發Web程式常見問題 引子 Web程式開發對開發工具提出了極大挑戰,面對用戶的?多需求,許多公司推出一大堆開發平臺:開發桌面應用程式和C/S程式的,開發中間件的,開發Web伺服器的。這造成程式師面對一大堆工具無從下手。 DELPHI和其他開發工具不同,因?它是一個開放系統,只要靈活使用一些控制項,即可開發出各種類型的系統,不論N-Tie程式、多線程程式、分佈計算程式(包括DCOM和CORBAR)、TCP程式、Web程式、ActiveX、中間件、推程式(Push),甚至你可以用它來寫組合語言程式。 DELPHI將ISAPI/NSAPI/CGI/WCGI等巧妙地封裝成一個類,用戶只要在編譯時選擇編譯結果,就可以得到不同的系統。 在DELPHI4中Inprise公司進一步加強了對Web程式開發的支援,可以開發出更好更強的系統。以下是開發Web應用程式中的幾個常見問題,可以供大家參考。如果沒有特別申明,則表示程式運行於 DELPHI 4下。 如何從Web Server Application返回一幅圖像? Web Server Application不僅可以生成複雜的頁面文檔,也可以根據用戶請求返回不同的圖像。當然有比較簡單的方法,根據輸入參數不同,〈img src...〉標記也指向不同的URL位址。這裏我們不用這個辦法,而是利用DLL返回圖像。 當然要首先建立一個頁面容器(page producer),內容如下: 〈html〉 〈body〉This is a test〈BR〉〈img src=〃/scripts/mydll.dll/picture〃〉〈/body〉 〈/html〉 接下來我們設定對應於PathInfo的動作事件,返回圖像結果,源代碼如下: (注意:單元聲明中要包含JPEG單元) procedure TWebModule1.WebModule1WebActionItem1Action(Sender: TObject;Request: TWebRequest; Response: TWebResponse; var Handled: Boolean); var Jpg: TJpegImage; S: TMemoryStream; begin Jpg := TJpegImage.Create; try Jpg.LoadFromFile(′test′); S := TMemoryStream.Create; try Jpg.SaveToStream(S); S.Position := 0; Response.ContentType := ′image/jpeg′; Response.ContentStream := S; // 必須在流釋放前完成 Response. SendResponse; finally S.Free; end; finally Jpg.Free; end; end; 實際上用這種方法和前面提到的簡單做法相比,具有更安全和更靈活的特點。在某些地方靈活使用,以此?基礎稍加修改可以?生一般開發工具難以實現的效果。 如何在ISAPI/NSAPI動態連接庫(DLL)中使用本地資料庫驅動程式(native Access driver)? 這是因?DAO 3.0 或者DAO 3.5是所謂thread-safe(線程安全程式),而一個Web伺服器(例如IIS)會隨用戶請求?生多個線程,同時把ISAPI對應的DLL也列?線程。這時ISAPI就會通過BDE通知DAO,告訴它不符合線程安全規定。 解決的方法有很多,如果你一定要訪問Access 95/97庫,那?可以通過ODBC訪問。ODBC不會經過DAO,而且也是一個線程安全程式。此外還有一些第三方的控制項集,通過他們可以直接由BDE訪問Access 95/97,效率更高。 用戶訪問我Web伺服器上的ISAPI DLL,可是報告:“Invalid filename"(無效的檔案名),然而文件的確存在的。對了,我的資料庫在一台Novell 伺服器上。這是?什?呢? 你沒有設定對應於你IUSR_XXX賬戶的驅動器路徑映射(MAPING)。因?Novell不是採用FAT,所以要手工添加路徑映射。當然,可以做成開機登錄腳本。請牢記,如果你運行IIS作?Web伺服器,而又涉及Novell,無論作?文件伺服器或資料庫伺服器,都要定義好路徑映射。 “Invalid configuration parameter for alias {alias_name}"(無效的別名配置),當我設置一個ODBC DSN,並通過它訪問ISAPI/NSAPI伺服器時就出現這樣一個錯誤。 你如果要?訪問的用戶(IIS用戶)建立一個ODBC別名,那?要注意創建一個SYSTEM DSN(系統DNS),而不要創建“用戶DNS”,雖然“用戶DNS”是缺省設定。 如何取得客戶機(訪問機器)的名稱和IP地址? 實現這個功能用TCP控制項來做非常容易。從Internet頁面上選取一個TCP控制項,然後直接就可以得到你所需要的: Memo1.Lines.Add(TCP1.LocalHostName); Memo1.Lines.Add(TCP1.LocalIp); 當然,如果你不希望這樣做,還有比較複雜的辦法: uses Winsock; procedure TForm1.FormCreate(Sender: TObject); var wVersionRequested : WORD; wsaData : TWSAData; begin {創建 WinSock} wVersionRequested := MAKEWORD(1, 1); WSAStartup(wVersionRequested, wsaData); end; procedure TForm1.Button1Click(Sender: TObject); var p : PHostEnt; s : array[0..128] of char; p2 : pchar; begin {得到電腦名稱} GetHostName(@s,128); p:=GetHostByName(@s); Memo1.Lines.Add(p^.h_Name); {得到機器IP地址} p2 := iNet_ntoa(PInAddr(p^.h_addr_list^)^); Memo1.Lines.Add(p2); end; procedure TForm1.FormDestroy(Sender: TObject); begin {釋放 WinSock} WSACleanup; end; 這是一個調用了WINSOCK的獨立單元,你可以把它直接嵌入到你的程式中去。 在DELPHI 3中?何不能創建真正的多線程DLL? 雖然DELPHI3中的ISAPI DLL向導已經?創建多線程DLL生成了大量代碼,可是還是有一個嚴重的缺陷:沒有申明本應用程式是一個多線程的程式。所以需要你添加一句話: IsMultiThread := TRUE; 把這句話放在DPR程式begin-end塊的開始處,使之成?第一句。 如何得知現在是否和Internet連接? 最簡單的辦法是用一個TCP元件得到自己當前的IP,通過判斷IP得知是否連入Internet。例如: if TCP1.LocalIp = '0.0.0.0' then ShowMessage('目前沒有連入Internet!'); 需要注意的是:因?Internet和Intranet沒本質區別,所以一般不能判定是和Internet連接還是僅僅連入Intranet。當然。你也可以再加一個PING元件,去PING一個比較穩定、速度比較快的站點,如果連通則表明已經接入Internet。不過這種辦法通用性不好。 如何列印一個Web頁面? 可以選用HTML控制項的AutoPrint方法。例如: uses Printers; procedure TForm1.Button1Click(Sender: TObject); var OldCur: TCursor; begin OldCur := Screen.Cursor; with Printer do begin BeginDoc; HTML1.AutoPrint(handle); Title := HTML1.URL; EndDoc; end; Screen.Cursor := OldCur; end; 此外還可以利用其PrintPage方法。不過我推薦你採用AutoPrint,因?這樣控制更靈活,可以過濾一些你不希望列印的內容。 **********************************************************************
------
**********************************************************
哈哈&兵燹
最會的2大絕招 這個不會與那個也不會 哈哈哈 粉好

Delphi K.Top的K.Top分兩個字解釋Top代表尖端的意思,希望本討論區能提供Delphi的尖端新知
K.表Knowlege 知識,就是本站的標語:Open our mind
系統時間:2024-04-27 3:11:35
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!