国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Delphi > 正文

DELPHI開發(fā)Web程序常見問題

2019-11-18 18:44:14
字體:
供稿:網(wǎng)友
引子
  Web程序開發(fā)對開發(fā)工具提出了極大挑戰(zhàn),面對用戶的眾多需求,許多公司推出一大堆開發(fā)平臺(tái):開發(fā)桌面應(yīng)用程序和C/S程序的,開發(fā)中間件的,開發(fā)Web服務(wù)器的。這造成程序員面對一大堆工具無從下手。

  DELPHI和其他開發(fā)工具不同,因?yàn)樗且粋€(gè)開放系統(tǒng),只要靈活使用一些控件,即可開發(fā)出各種類型的系統(tǒng),不論N-Tie程序、多線程程序、分布計(jì)算程序(包括DCOM和CORBAR)、TCP程序、Web程序、ActiveX、中間件、推程序(Push),甚至你可以用它來寫匯編程序。

  DELPHI將ISAPI/NSAPI/CGI/WCGI等巧妙地封裝成一個(gè)類,用戶只要在編譯時(shí)選擇編譯結(jié)果,就可以得到不同的系統(tǒng)。
  在DELPHI4中InPRise公司進(jìn)一步加強(qiáng)了對Web程序開發(fā)的支持,可以開發(fā)出更好更強(qiáng)的系統(tǒng)。以下是開發(fā)Web應(yīng)用程序中的幾個(gè)常見問題,可以供大家參考。如果沒有特別申明,則表示程序運(yùn)行于 DELPHI 4下。

如何從Web Server application返回一幅圖像?
  Web Server Application不僅可以生成復(fù)雜的頁面文檔,也可以根據(jù)用戶請求返回不同的圖像。當(dāng)然有比較簡單的方法,根據(jù)輸入?yún)?shù)不同,〈img src...〉標(biāo)記也指向不同的URL地址。這里我們不用這個(gè)辦法,而是利用DLL返回圖像。
  當(dāng)然要首先建立一個(gè)頁面容器(page producer),內(nèi)容如下:
  〈html〉
  〈body〉This is a test〈BR〉〈img src=″/scripts/mydll.dll/picture″〉〈/body〉
  〈/html〉

  接下來我們設(shè)定對應(yīng)于PathInfo的動(dòng)作事件,返回圖像結(jié)果,源代碼如下:
  (注意:單元聲明中要包含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;

  實(shí)際上用這種方法和前面提到的簡單做法相比,具有更安全和更靈活的特點(diǎn)。在某些地方靈活使用,以此為基礎(chǔ)稍加修改可以產(chǎn)生一般開發(fā)工具難以實(shí)現(xiàn)的效果。

  
如何在ISAPI/NSAPI動(dòng)態(tài)連接庫(DLL)中使用本地數(shù)據(jù)庫驅(qū)動(dòng)程序(native access driver)?
  這是因?yàn)镈AO 3.0 或者DAO 3.5是所謂thread-safe(線程安全程序),而一個(gè)Web服務(wù)器(例如IIS)會(huì)隨用戶請求產(chǎn)生多個(gè)線程,同時(shí)把ISAPI對應(yīng)的DLL也列為線程。這時(shí)ISAPI就會(huì)通過BDE通知DAO,告訴它不符合線程安全規(guī)定。

  解決的方法有很多,如果你一定要訪問Access 95/97庫,那么可以通過ODBC訪問。ODBC不會(huì)經(jīng)過DAO,而且也是一個(gè)線程安全程序。此外還有一些第三方的控件集,通過他們可以直接由BDE訪問Access 95/97,效率更高。

 
  用戶訪問我Web服務(wù)器上的ISAPI DLL,可是報(bào)告:“Invalid filename"(無效的文件名),然而文件的確存在的。對了,我的數(shù)據(jù)庫在一臺(tái)Novell 服務(wù)器上。這是為什么呢?

  你沒有設(shè)定對應(yīng)于你IUSR_XXX賬戶的驅(qū)動(dòng)器路徑映射(MAPING)。因?yàn)镹ovell不是采用FAT,所以要手工添加路徑映射。當(dāng)然,可以做成開機(jī)登錄腳本。請牢記,如果你運(yùn)行IIS作為Web服務(wù)器,而又涉及Novell,無論作為文件服務(wù)器或數(shù)據(jù)庫服務(wù)器,都要定義好路徑映射。

  “Invalid configuration parameter for alias {alias_name}"(無效的別名配置),當(dāng)我設(shè)置一個(gè)ODBC DSN,并通過它訪問ISAPI/NSAPI服務(wù)器時(shí)就出現(xiàn)這樣一個(gè)錯(cuò)誤。

  你如果要為訪問的用戶(IIS用戶)建立一個(gè)ODBC別名,那么要注意創(chuàng)建一個(gè)SYSTEM DSN(系統(tǒng)DNS),而不要?jiǎng)?chuàng)建“用戶DNS”,雖然“用戶DNS”是缺省設(shè)定。

如何取得客戶機(jī)(訪問機(jī)器)的名稱和IP地址?
  實(shí)現(xiàn)這個(gè)功能用TCP控件來做非常容易。從Internet頁面上選取一個(gè)TCP控件,然后直接就可以得到你所需要的:
  Memo1.Lines.Add(TCP1.LocalHostName);
  Memo1.Lines.Add(TCP1.LocalIp);

  當(dāng)然,如果你不希望這樣做,還有比較復(fù)雜的辦法:
  uses Winsock;
  procedure TForm1.FormCreate(Sender: TObject);
  var
  wVersionRequested : Word;
  wsaData : TWSAData;
  begin
   {創(chuàng)建 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
   {得到計(jì)算機(jī)名稱}
   GetHostName(@s,128);
   p:=GetHostByName(@s);
   Memo1.Lines.Add(p^.h_Name);

    {得到機(jī)器IP地址}
   p2 := iNet_ntoa(PInAddr(p^.h_addr_list^)^);
   Memo1.Lines.Add(p2);
  end;

  procedure TForm1.FormDestroy(Sender: TObject);
  begin
   {釋放 WinSock}
   WSACleanup;
  end;

  這是一個(gè)調(diào)用了WINSOCK的獨(dú)立單元,你可以把它直接嵌入到你的程序中去。

  
在DELPHI 3中為何不能創(chuàng)建真正的多線程DLL?
  雖然DELPHI3中的ISAPI DLL向?qū)б呀?jīng)為創(chuàng)建多線程DLL生成了大量代碼,可是還是有一個(gè)嚴(yán)重的缺陷:沒有申明本應(yīng)用程序是一個(gè)多線程的程序。所以需要你添加一句話:
  IsMultiThread := TRUE;

  把這句話放在DPR程序begin-end塊的開始處,使之成為第一句。

  
如何得知現(xiàn)在是否和Internet連接?
  最簡單的辦法是用一個(gè)TCP元件得到自己當(dāng)前的IP,通過判斷IP得知是否連入Internet。例如:
   if TCP1.LocalIp = '0.0.0.0' then
   ShowMessage('目前沒有連入Internet!');

  需要注意的是:因?yàn)镮nternet和Intranet沒本質(zhì)區(qū)別,所以一般不能判定是和Internet連接還是僅僅連入Intranet。當(dāng)然。你也可以再加一個(gè)PING元件,去PING一個(gè)比較穩(wěn)定、速度比較快的站點(diǎn),如果連通則表明已經(jīng)接入Internet。不過這種辦法通用性不好。


如何打印一個(gè)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,因?yàn)檫@樣控制更靈活,可以過濾一些你不希望打印的內(nèi)容。


上一篇:delphi函數(shù)參考手冊

下一篇:Delphi代碼的標(biāo)準(zhǔn)風(fēng)格

發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
學(xué)習(xí)交流
熱門圖片

新聞熱點(diǎn)

疑難解答

圖片精選

網(wǎng)友關(guān)注

主站蜘蛛池模板: 丹棱县| 贞丰县| 中西区| 封丘县| 香格里拉县| 青川县| 涿鹿县| 都江堰市| 溧水县| 三河市| 遵化市| 绥阳县| 彭山县| 垦利县| 岗巴县| 永济市| 大足县| 武胜县| 丰都县| 苏尼特右旗| 嘉鱼县| 长沙市| 天等县| 郓城县| 唐山市| 昭觉县| 西乡县| 浙江省| 贵港市| 和政县| 霍城县| 迁安市| 景泰县| 温泉县| 游戏| 叶城县| 潢川县| 保定市| 康马县| 旬阳县| 喜德县|