DELPHI開發Web程式常見問題 (轉)
DELPHI開發Web程式常見問題 (轉)[@more@]引子
開發對開發工具提出了極大挑戰,面對的眾多需求,許多公司推出一大堆開發平臺:開發桌面應用程式和C/S程式的,開發的,開發Web的。這造成程式設計師面對一大堆工具無從下手。
和其他開發工具不同,因為它是一個開放,只要靈活使用一些,即可開發出各種型別的系統,不論N-Tie程式、多執行緒程式、分佈計算程式(包括DCOM和R)、TCP程式、Web程式、、中介軟體、推程式(Push),甚至你可以用它來寫匯序。
DELPHI將IS/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: T;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 )?
這是因為DAO 3.0 或者DAO 3.5是所謂thread-safe(執行緒安全程式),而一個Web伺服器(例如IIS)會隨使用者請求產生多個執行緒,同時把ISAPI對應的DLL也列為執行緒。這時ISAPI就會透過BDE通知DAO,告訴它不符合執行緒安全規定。
解決的方法有很多,如果你一定要訪問Access 95/97庫,那麼可以透過OC訪問。ODBC不會經過DAO,而且也是一個執行緒安全程式。此外還有一些第三方的控制元件集,透過他們可以直接由BDE訪問Access 95/97,更高。
使用者訪問我Web伺服器上的ISAPI DLL,可是報告:“Invalid filename"(無效的名),然而檔案的確存在的。對了,我的資料庫在一臺Novell 伺服器上。這是為什麼呢?
你沒有設定對應於你IUSR_XXX賬戶的驅動器路徑對映(MA)。因為Novell不是採用,所以要手工新增路徑對映。當然,可以做成開機登入指令碼。請牢記,如果你執行IIS作為Web伺服器,而又涉及Novell,無論作為檔案伺服器或資料庫伺服器,都要定義好路徑對映。
“Invalid configuration parameter for alias {alias_name}"(無效的別名),當我設定一個ODBC DSN,並透過它訪問ISAPI/NSAPI伺服器時就出現這樣一個錯誤。
你如果要為訪問的使用者(IIS使用者)建立一個ODBC別名,那麼要注意建立一個SYSTEM DSN(系統),而不要建立“使用者DNS”,雖然“使用者DNS”是預設設定。
如何取得客戶機(訪問機器)的名稱和?
實現這個功能用TCP控制元件來做非常容易。從Inte頁面上選取一個TCP控制元件,然後直接就可以得到你所需要的:
Memo1.Lines.Add(TCP1.LocalHostName);
Memo1.Lines.Add(TCP1.LocalIp);
當然,如果你不希望這樣做,還有比較複雜的辦法:
uses Winsock;
procedure TForm1.FormCreate(Sender: TObject);
var
wVersionRequested : ;
wsaData : TWSAData;
begin
{建立 WinSock}
wVersionRequested := MAKEWORD(1, 1);
Wtartup(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 :=_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.Local= '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,因為這樣控制更靈活,可以過濾一些你不希望列印的內容。
開發對開發工具提出了極大挑戰,面對的眾多需求,許多公司推出一大堆開發平臺:開發桌面應用程式和C/S程式的,開發的,開發Web的。這造成程式設計師面對一大堆工具無從下手。
和其他開發工具不同,因為它是一個開放,只要靈活使用一些,即可開發出各種型別的系統,不論N-Tie程式、多執行緒程式、分佈計算程式(包括DCOM和R)、TCP程式、Web程式、、中介軟體、推程式(Push),甚至你可以用它來寫匯序。
DELPHI將IS/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: T;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 )?
這是因為DAO 3.0 或者DAO 3.5是所謂thread-safe(執行緒安全程式),而一個Web伺服器(例如IIS)會隨使用者請求產生多個執行緒,同時把ISAPI對應的DLL也列為執行緒。這時ISAPI就會透過BDE通知DAO,告訴它不符合執行緒安全規定。
解決的方法有很多,如果你一定要訪問Access 95/97庫,那麼可以透過OC訪問。ODBC不會經過DAO,而且也是一個執行緒安全程式。此外還有一些第三方的控制元件集,透過他們可以直接由BDE訪問Access 95/97,更高。
使用者訪問我Web伺服器上的ISAPI DLL,可是報告:“Invalid filename"(無效的名),然而檔案的確存在的。對了,我的資料庫在一臺Novell 伺服器上。這是為什麼呢?
你沒有設定對應於你IUSR_XXX賬戶的驅動器路徑對映(MA)。因為Novell不是採用,所以要手工新增路徑對映。當然,可以做成開機登入指令碼。請牢記,如果你執行IIS作為Web伺服器,而又涉及Novell,無論作為檔案伺服器或資料庫伺服器,都要定義好路徑對映。
“Invalid configuration parameter for alias {alias_name}"(無效的別名),當我設定一個ODBC DSN,並透過它訪問ISAPI/NSAPI伺服器時就出現這樣一個錯誤。
你如果要為訪問的使用者(IIS使用者)建立一個ODBC別名,那麼要注意建立一個SYSTEM DSN(系統),而不要建立“使用者DNS”,雖然“使用者DNS”是預設設定。
如何取得客戶機(訪問機器)的名稱和?
實現這個功能用TCP控制元件來做非常容易。從Inte頁面上選取一個TCP控制元件,然後直接就可以得到你所需要的:
Memo1.Lines.Add(TCP1.LocalHostName);
Memo1.Lines.Add(TCP1.LocalIp);
當然,如果你不希望這樣做,還有比較複雜的辦法:
uses Winsock;
procedure TForm1.FormCreate(Sender: TObject);
var
wVersionRequested : ;
wsaData : TWSAData;
begin
{建立 WinSock}
wVersionRequested := MAKEWORD(1, 1);
Wtartup(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 :=_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.Local= '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,因為這樣控制更靈活,可以過濾一些你不希望列印的內容。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752043/viewspace-991258/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 微信小程式中開發常見問題微信小程式
- 微信小程式開發常見問題(四)微信小程式
- 微信小程式開發常見問題(五)微信小程式
- 微信小程式開發常見問題(七)微信小程式
- JAVA常見開發問題Java
- MFC開發常見問題的回答2 (轉)
- MFC開發常見問題的回答3 (轉)
- Laravel 個人開發常見問題Laravel
- 近期BSN開發常見問題
- DDC/NFT開發常見問題
- [Web開發] IE Cookie丟失問題的常見原因薦WebCookie
- 近期BSN開發常見問題答疑
- DDC開發常見問題答疑(二)
- Vue.js開發常見問題Vue.js
- vue.js 前端開發常見問題Vue.js前端
- 開發過程中mysql常見問題MySql
- react-native開發常見問題React
- 前端開發常見問題精選(五)前端
- iOS開發常見問題之綜合篇iOS
- VueJS 開發常見問題集錦VueJS
- AI運動小程式開發常見問題集錦二AI
- Web標準中的常見問題Web
- redis持久化開發運維常見問題Redis持久化運維
- Vue.JS 開發常見問題集錦Vue.js
- vue專案開發過程常見問題Vue
- iOS開發執行報錯、常見問題iOS
- vi 命令常見問題解答(轉)
- Java常見問題集錦(轉)Java
- Windows 98 常見問題解答(轉)Windows
- C 語言常見問題(轉)
- 【常見Web應用安全問題】—7、CRLFinjectionWeb
- 【常見Web應用安全問題】—12、URLredirectionWeb
- 使用ActiveX控制元件開發網頁常見的問題 (轉)控制元件網頁
- web開發技巧-網頁排版佈局常見問題及解決辦法Web網頁
- 開發Web應用程式中Cookie使用的問題 (轉)WebCookie
- Web開發常見性的錯誤Web
- 常見Web開發漏洞解決方法Web
- CodeReview常見程式碼問題View