VCL How To - FastNet 元件篇 |
|
bruce0211
版主 發表:157 回覆:668 積分:279 註冊:2002-06-13 發送簡訊給我 |
Delphi/BCB 元件頁上有一整頁網路元件
叫做 FastNet 元件頁
很就沒更版了 (從 Delphi 4.0 - 6.0 版本編號都沒變)
怪不得會被 Indy 元件取代掉 (也許 Delphi 7.0 就沒 FastNet 元件頁)
但老實說
個人覺得若是一些基本的網路功能,用 FastNet 系列元件比較簡單
但 FastNet 系列元件有一個很大的問題
(也經過我跟原廠求證過)
那就是只要在 Win2000 關機時
若系統中含有 FastNet 元件開發的 AP 還在 RUN
Win2000 就關不了機 (無論是手動按左下角"開始"->關機
或是程式中自己撰寫關機指令關機) 自行測試的簡單方法
打開 Delphi 或 BCB , 開一新的專案 , 放一個 NMFTP (FastNet 元件頁中任一元件皆可),什麼動作都不要做,然後直接執行這個 Project1.exe
您在關機看看關得起來嗎 ? 我們常常寫的第一個網路程式功能就是在右下角藏一個 FTP 程式
用來自動上傳下載商品檔或其它異動資料,而且都是不用人去關閉他的
(跟作業系統一起關)
但若用 NMFTP 來寫 , 可就得先人工關閉這個 AP 才能關機了
|
bruce0211
版主 發表:157 回覆:668 積分:279 註冊:2002-06-13 發送簡訊給我 |
元件名稱:NMFTP (FTP Client端元件 , FTP檔案傳輸協定)
文件版本:for Delphi
文件作者:bruce0211 1999.01.12 ●前言:NMFTP 為Delphi/BCB 之 FastNet 元件頁之一員,用來連接FTP伺服
器,故其實為一FTP Client端元件,不能做為普通電腦間傳檔之用,對象一定是要一台 FTP Server (如 NT IIS 之 FTP Server 或 UNIX FTP Server等),目前
發現其缺點為列出檔案時無法判斷所列出之檔名為一檔案或目錄名稱(子目錄); 若在家使用 FastNet 系列之所有元件,執行時若發現尚未連線,FastNet 系列元件還會自動帶起撥號網路,您也不用煩惱撥號網路啟動程式要如何寫。 ●應用:FTP 工具(外面已有許多現成、功能強大且免費的工具,故可應用於一些其它市場區隔的方向上);或配合您的應用程式定時更新資料,如Norton AntiVirus 防毒軟體之 LiveUpdate 定時更新病毒碼的應用,其即利用FTP至Norton病毒碼防制中心之 FTP 伺服器 DownLoad 最新病毒碼的檔案資料; 還有,一般企業內部皆使用 UNIX 主機,可於每天晚上固定時間將各地營業分店單位業績資料用FTP上傳至UNIX 主機上,半夜UNIX 主機再安排自動工作排程將各店業績運算分析匯入MIS,第二天一早”晨會”即有業績分析資料可做報告 ●連至FTP伺服器步驟:
//設定連接參數
NMFTP1.host:= '210.66.250.123'; {主機位置}
NMFTP1.port:=21; {FTP服務習慣用之埠號}
NMFTP1.TimeOut :=20000; {連接前容許等待時間(ms), 時間到若仍未連上則放棄連
接}
NMFTP1.userid:='anonymous'; {連接FTP伺服器所需之User ID}
NMFTP1.password:=''; {連接FTP伺服器所需之 Password}
try
NMFTP1.connect; {連接命令}
except
showmessage('Not Connectted !');
end; □若連接成功會自動觸發 NMFTP 之 OnConnect事件
可於該事件中寫入一些提示訊息或做一些立即動作
procedure TForm1.NMFTP1Connect(Sender: TObject);
begin
NMFTP1.ChangeDir(‘/test1’); {連接後馬上做切換目錄之動作}
或
ShowMessage( 'Connected'); {提示訊息亦可寫於OnSuccess事件中}
end; □切換目錄:使用 ChangeDir(‘字串’)方法
例:NMFTP1.ChangeDir(‘/test1’); □列出檔案:使用 nlist方法
例:NMFTP1.nlist;
註:在列出檔案時類似DOS之DIR指令,但因無類DOS之畫面空間可容納所列出之檔案
故需靠一些小技巧,才能看到這些檔案;在列出檔案同時,每列一筆檔案會觸發一次
OnListItem 事件,即若一目錄中有十個檔案,當下完NMFTP1.nlist指令後會觸發
十次NMFTP之OnListItem 事件(無法分辨何者為檔案何者為目錄) ●列出檔案於畫面上之技巧(與ListBox元件配合):藉由OnListItem 事件
例:procedure TForm1.NMFTP1ListItem(Listing: String);
begin
listbox1.items.add(Listing); {每一筆觸發本事件之檔名由Listing變數
取出}
end; □上下傳模式:使用Mode方法來控制
例:NMFTP1.Mode(MODE_IMAGE); {二進位檔模式}
或
NMFTP1.Mode(MODE_ASCII); {文字檔模式} □上傳檔案:使用Upload(LocalFile, RemoteFile)方法
例:NMFTP1.Mode(MODE_ASCII); {設定傳輸模式為文字檔模式}
NMFTP1.Upload(‘C:\AUTOEXEC.BAT’,’AUTOEXEC.BAT’);
即將本台電腦之C:\AUTOEXEC.BAT上傳至FTP伺服器上 □下傳檔案:使用Download(RemoteFile, LocalFile)方法
例:NMFTP1.Mode(MODE_ASCII); {設定傳輸模式為文字檔模式}
NMFTP1.Download(‘AUTOEXEC.BAT’,’C:\AUTOEXEC.BAT’);
即將FTP伺服器上之檔案以”文字檔模式”下傳至本台電腦之C:\AUTOEXEC.BAT
□上傳進度指示:藉由上傳進度中會觸發OnPacketSent事件,可同時取出BytesSent屬性
及BytesTotal屬性值,自行標示在”狀態列”中
例:procedure TForm1.NMFTP1PacketSent(Sender: TObject);
begin
StatusBar1.SimpleText := IntToStr(NMFTP1.BytesSent) ' of '
IntToStr(NMFTP1.BytesTotal);
end; □下傳進度指示:藉由下傳進度中會觸發OnPacketRecvd事件,可同時取出BytesRecvd屬
性及BytesTotal屬性值,自行標示在狀態列中
例:procedure TForm1.NMFTP1PacketRecvd(Sender: TObject);
begin
StatusBar1.SimpleText := IntToStr(NMFTP1.BytesRecvd) ' of '
IntToStr(NMFTP1.BytesTotal);
end; ● 判斷各種動作成功之事件: OnSuccess 事件 (任何事件成功時皆會觸發之)
procedure TForm1.NMFTP1Success(Trans_Type: TCmdType);
begin {於Delphi中將上列中之TcmdType 反白按 “F1” 鍵,即有輔助說明其可能的型態
值}
Case Trans_Type of {將 Trans_Type 變數取出並判斷到底是哪種動作成功}
cmdChangeDir: StatusBar1.SimpleText := 'ChangeDir success';
cmdMakeDir: StatusBar1.SimpleText := 'MakeDir success';
cmdDelete: StatusBar1.SimpleText := 'Delete success';
cmdRemoveDir: StatusBar1.SimpleText := 'RemoveDir success';
cmdList: StatusBar1.SimpleText := 'List success';
cmdRename: StatusBar1.SimpleText := 'Rename success';
cmdUpRestore: StatusBar1.SimpleText := 'UploadRestore success';
cmdDownRestore: StatusBar1.SimpleText := 'DownloadRestore
success';
cmdDownload: StatusBar1.SimpleText := 'Download success';
cmdUpload: StatusBar1.SimpleText := 'Upload success';
cmdAppend: StatusBar1.SimpleText := 'UploadAppend success';
cmdReInit: StatusBar1.SimpleText := 'ReInit success';
cmdAllocate: StatusBar1.SimpleText := 'Allocate success';
cmdNList: StatusBar1.SimpleText := 'NList success';
cmdDoCommand: StatusBar1.SimpleText := 'DoCommand success';
end;
end; <註> TNMFTP 元件不像一般元件或函式常用的習慣--可邊執行動作邊判斷是否成功 如 IF DeleteFile(‘C:\Autoexec.bat’) THEN
Showmessage(‘Delete Succeed !’)
Else Showmessage(‘Delete Failure !’);
可邊殺檔案邊傳回布林值(殺檔成功則傳回TRUE, 殺檔失敗則傳回FALSE,便可藉此秀出
一段訊息) TNMFTP 不管做任何動作,其結果都是觸發OnSuccess(成功)或 OnFailure(失敗)事件
但又由於各種動作成功與否皆有可能觸發此兩事件,故還要至事件中將Trans_Type
變數取出再判斷是哪一種動作觸發的以便做出適當的回應 ●判斷各種動作失敗之事件: OnFailure 事件 (任何事件失敗時皆會觸發之)
說明同OnSuccess 事件,不再詳述 ●TNMFTP 元件列檔之方法研究:
TNMFTP.nlist 方法:只列檔名,無法判斷為一檔案或子目錄 TNMFTP.list 方法:可列出屬性、Size、修改日期及檔名
(由上圖知第四列檔名為test者實為一子目錄,因其屬性第一字元為”d”) 以上方法執行同時須立刻至OnListItem 事件中攔截Listing變數,並秀於ListBox
中,否則無別處可記錄這些檔案列表 ●若一定要記錄檔案列表:
程式執行前或一開始,設TNMFTP之ParseList屬性為true:
TNMFTP.ParseList:=true;
爾後執行 TNMFTP.list 方法後( TNMFTP.nlist 方法不行),其FTPDirectoryList
屬性(為一 Tstringlist型態)即會記錄最後一次TNMFTP.list 方法的列檔資訊 以下四例為隨時可從FTPDirectoryList 取出最後一次執行 TNMFTP.list 方法後的各項
列檔資訊並放於Memo元件中(屬性、Size、修改日期及檔名)
Memo1.lines.assign(NMFTP1.FTPDirectoryList.Attribute);
Memo2.lines.assign(NMFTP1.FTPDirectoryList.Size);
Memo3.lines.assign(NMFTP1.FTPDirectoryList.ModifDate);
Memo4.lines.assign(NMFTP1.FTPDirectoryList.Name); ●要判斷何者為檔名何者為目錄可能要要藉這些這些方法交叉測試,有點累就是了.. 發表人 - bruce0211 於 2002/08/11 15:55:01
|
bruce0211
版主 發表:157 回覆:668 積分:279 註冊:2002-06-13 發送簡訊給我 |
元件名稱:NMSMTP (SMTP 發信元件 , SMTP簡易郵件傳輸協定)
文件版本:for Delphi
文件作者:bruce0211 1999.01.12
●前言:NMSMTP 為 Delphi/BCB 之 FastNet 元件頁之一員,用來連接 MAIL Server 做為發信用途,其可由您的程式內直接發信,且因不經過您的系統郵件軟體(OutLook 或 Netscape),故不會在其”寄件備份”夾中留下痕跡 ●應用:本元件當然並非教您用來寫一類似 Outlook Express 的郵件軟體,因人家不但功能強,而且還免費;本元件應該可配合您開發的應用程式自動定時送出廣告信或使用者帳單(如通話費率報表等)。 .
●連至郵件伺服器
//設定連接參數,假設您的電子郵件地址為 bruce0211@yahoo.com.tw
NMSMTP1.host:= 'yahoo.com.tw'; {MAIL伺服器位置}
NMSMTP1.port:=25; {SMTP服務習慣用之埠號}
NMSMTP1.userid:='bruce0211'; {連接MAIL伺服器所需之User ID,不需密碼}
try
NMSMTP1.connect; {連接命令動作}
except
showmessage('Not Connectted !');
end; □信寫好後要發信時(信一般寫在Memo元件中或一文字檔中)
可於自設之”發信”按扭之OnClick中寫下列程序 : procedure TForm1.TForm1.Button1Click(Sender: TObject);
begin
//初始設定—設定寄件人資訊
NMSMTP1.postmessage.fromaddress:='bruce0211@yahoo.com.tw';
{此行一定要,據測試此行亂填亦無所謂,但將來收信人無法於其郵件軟體中執行”回覆作者”功能 }
NMSMTP1.postmessage.fromname:='bruce0211';
{寄件人名稱代號,無此行傳送會較慢,並用fromaddress值代之 } //初始設定—設定寄信目標(收信人地址)
NMSMTP1.postmessage.toaddress.clear;
NMSMTP1.postmessage.toaddress.add('pius@yahoo.com.tw');
NMSMTP1.postmessage.toaddress.add('JYChang@yahoo.com.tw');
.
.
(愛同時寄給幾個就一直add下去,toaddress屬性為一TStringList型態)
//初始設定—設定寄信主題
NMSMTP1.postmessage.subject:=’Subject Test’; {此行可有可無} //初始設定—加入信件內容(下面三段至少要設定一段,否則無發信內容,無法發信)
{信件內容,假設您信件內容手寫於Memo元件中}
NMSMTP1.postmessage.body.assign(memo1.lines); {信件內容,假設您信件內容為一廣告信且事先已放在c:\test.txt文字檔中}
NMSMTP1.postmessage.body.loadfromfile(‘c:\test.txt’); {附加檔案}
NMSMTP1.postmessage.attachments.clear;
NMSMTP1.postmessage.attachments.add(‘c:\autoexec.bat’);
NMSMTP1.postmessage.attachments.add(‘c:\config.sys’);
.
.
(愛同時加幾個附檔就一直add下去,attachments屬性為一TStringList型態) //發信動作開始!!
NMSMTP1.sendmail; end; ●發信中監測發信進度,於 OnPackSent 事件中監測
procedure TForm1.NMSMTP1PacketSent(Sender: TObject);
begin
(進度顯視於狀態Bar-StatusBar1.SimpleText中)
StatusBar1.SimpleText := IntToStr(NMSMTP1.BytesSent) ' bytes of
' IntToStr(NMSMTP1.BytesTotal) ' sent';
end; ●其它動作之狀態回報請參考各狀態觸發事件 發表人 - bruce0211 於 2002/08/11 15:54:12
|
bruce0211
版主 發表:157 回覆:668 積分:279 註冊:2002-06-13 發送簡訊給我 |
元件名稱:NMSMTP & NMHTTP
文件版本:for BCB
文件作者:bruce0211 2003/03/11 ●前言:目前一般企業界對外網路幾乎皆有防火牆,在有限制的環境中要做資料交換,幾乎就只能應用防火牆比較常開放的 HTTP (上網)及 SMTP & POP3 (電子郵件)兩條路;至於 FTP,在大部分的企業界防火牆中,也幾乎都是不被開放;最近因為客戶一些 CASE,有機會用 BCB 實做一些簡單的資料交換應用,利用的是 HTTP 收資料、SMTP 發送資料,之所以未用到 POP3 來收資料,是因為怕資料先被客戶的 OutLook 收去,還有用POP3 收資料需有帳號及密碼(SMTP 送信則不用密碼) ●應用:在程式中透過 HTTP 來下載資料或更新版本,而利用 SMTP 來送出資料(只要知道客戶的帳號,不需知道客戶密碼,即可利用客戶 Mail Server 來發送資料,況且每個Mail Server 都有 root 這個帳號....) ●NMSMTP:從程式中發送檔案至遠端某一收件者 (放一個 StatusBar1 元件來顯示狀態)
void __fastcall TForm1::Button1Click(TObject *Sender) { String Send="guest"; //使用者帳號 NMSMTP1->Host= "someone.com.tw"; //MAIL伺服器位置 NMSMTP1->Port=25; //SMTP服務習慣用之埠號 NMSMTP1->Send; //連接MAIL伺服器所需之User ID,不需密碼 NMSMTP1->Charset = "big5"; //若怕對方收信時主旨變亂碼 , 則加入之 try { StatusBar1->SimpleText="郵件傳送中....."; NMSMTP1->Connect(); //連接命令動作 //初始設定—設定寄件人資訊 , 此行一定要,據測試此行亂填亦無所謂,但將來收 信人無法於其郵件軟體中執行”回覆作者”功能 NMSMTP1->PostMessageA->FromAddress=Send "@" NMSMTP1->Host; //寄件人名稱代號,無此行傳送會較慢,並用fromaddress值代之 } NMSMTP1->PostMessageA->FromName=NMSMTP1->PostMessageA->FromAddress; //初始設定—設定寄信目標(收信人地址) NMSMTP1->PostMessageA->ToAddress->Clear(); NMSMTP1->PostMessageA->ToAddress->Add("bruce0211@yahoo.com.tw"); NMSMTP1->PostMessageA->ToAddress->Add("bruce0829@yahoo.com.tw"); //初始設定—設定寄信主旨 NMSMTP1->PostMessageA->Subject="業績資料回收";// {此行可有可無} //要傳送的檔案名稱(附件) NMSMTP1->PostMessageA->Attachments->Clear(); NMSMTP1->PostMessageA->Attachments->Add("C:\\DATA1.TXT"); NMSMTP1->PostMessageA->Attachments->Add("C:\\DATA2.TXT"); //發信動作開始!! NMSMTP1->SendMail(); NMSMTP1->Disconnect(); StatusBar1->SimpleText="郵件傳送完成 !!"; } catch(...) { StatusBar1->SimpleText="郵件伺服器連結失敗 !!"; } }●NMHTTP:在程式中從接收遠端一個檔案 (放一個 StatusBar1 元件來顯示狀態及進度) void __fastcall TForm1::Button1Click(TObject *Sender) { //如果有透過 Proxy Server 實則設下兩行 , 否則刪掉下兩行 NMHTTP1->Proxy="proxy.someone.com.tw"; NMHTTP1->ProxyPort=80; NMHTTP1->InputFileMode=true; NMHTTP1->Body= "c:\\httpget.zip"; //接收回來的檔案存放路徑 NMHTTP1->Get("http://www.utilmind.com/delphi/httpget.zip"); //一定要有 "http://" 字樣 //不能寫在這裡,所以 mark 掉 //NMHTTP1->Disconnect(); } void __fastcall TForm1::NMHTTP1PacketRecvd(TObject *Sender) { StatusBar1->SimpleText = IntToStr(NMHTTP1->BytesRecvd) " of " IntToStr(NMHTTP1->BytesTotal) " retrieved"; //接收完 , 關掉與 HTTP 主機 (Web Server) 的連結 if (NMHTTP1->BytesRecvd==NMHTTP1->BytesTotal) NMHTTP1->Disconnect(); } |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |