1,修改s:= '/k ping www . 163 . com & gt;AAA . txt ';這個很簡單把退貨情況轉到aaa.txt。
2.如果想精確控制ping,可以考慮使用idicmpclient控件的ping方法(在indy客戶端中)。具體看壹下控件的幫助。
3.至於獲取公網地址,就看妳是不是網管了。用* * *享受上網,大多用地址翻譯。每臺機器應該沒有公網地址,而是在路由中動態維護壹個內網地址-外網地址:端口映射表(作為網關設備)。只有壹個外部網絡地址。壹旦內部地址連接到外部網絡,不同的端口用於對應不同的內部地址。所以只有網絡管理員才能登錄設備查看,妳也可以通過這個表知道內部地址是否連接外網。
不知道我說的有沒有幫助!
7.3.5控制服務器應用程序的執行。
客戶端程序控制服務器應用程序的壹個方面是,客戶端程序可以在必要時啟動服務器程序並加載會話主題。
客戶端控制服務器應用更重要的壹點是向服務器發送服務器識別的宏命令,完成對服務器應用的各種操作。請參考服務器應用程序文檔,了解服務器支持哪些宏命令。
要發送宏命令,需要使用DDEClientConv的兩個方法,ExecuteMacro和ExecuteMacroLines。它們的語法如下:
函數execute macro(Cmd:PChar;WaitFlag: Boolean):布爾型;
函數執行macro lines(Cmd:TStrings;WaitFlag: Boolean):布爾型;
Cmd是要發送的宏命令串或宏命令串鏈表。WaitFlag決定了DDE服務器程序執行宏命令時客戶端程序的行為。如果WaitFlag設置為True,則在執行服務器宏命令之前,不允許成功調用ExecuteMacro、ExecuteMacroLines、PokeData和PokeDataLines等方法,並且它們都不會向服務器發送數據並返回False。如果WaitFlag設置為False,則被調用的方法會在第壹個宏執行完畢之前嘗試向服務器發送數據。
WaitFalg的設置也取決於服務器應用程序。當某些應用程序試圖在第壹個宏完成執行之前向其發送數據或命令時,可能會導致第壹個宏失敗或導致不可預知的後果。有關詳細信息,請參考服務器應用程序文檔。
該函數的返回值指示命令字符串是否成功傳輸。但是,宏命令是否成功執行,客戶無法檢測到。
格式化文本
DDEClientConv有壹個用於決定是否格式化文本的布爾屬性FormartChars。所謂格式化文本是指從傳輸的文本數據中過濾掉退格(8)、制表符(7)、換行(10)、回車(13)等字符。字符的ASCII碼在括號中。很多時候,這些字符會導致DDE客戶數據的顯示混亂。
FormatChars的默認值為False。
7.3.7響應DDE事件
組件DDEClientConv有兩個事件OnOpen和once closed,分別在建立和終止DDE會話時觸發。小部件DDEClientItem有壹個OnChange事件。此事件通常用於轉儲和顯示DDE項目數據,如(7.3.1)部分所示。
在自動模式下,當創建包含DDEClientConv小工具的窗口時,或者當調用SetLink方法時,會觸發OnOpen事件;當關閉客戶端或服務器程序時,會觸發OnClose事件。
在手動模式下,調用OpenLink方法時觸發OnOpen事件,調用ColseLink方法時觸發OnClose事件。
7.3.8與客戶端程序和Excel交換數據。
讓我們構建壹個DDE客戶端程序,並使用該程序與Excel中的工作表交換數據。編程接口
該接口包含壹個DDE會話組件DDEClientConv1和壹個DDE項目組件DDEClientItem1,它們用於建立和維護DDE連接。RadioGroup控件及其兩個單選按鈕AutoRadio和ManualRadio用於設置連接模式;壹個GroupBox控件及其兩個按鈕RequestBtn和PokeBtn用於控制數據的應用和發送,其中RequestBtn在自動模式下是灰顯的;文本框Memo1用於保存DDE數據;按鈕PasteBtn用於粘貼連接信息並建立DDE連接;另壹個按鈕CloseBtn用於關閉系統。
設計時將DDEClientConv1的FormatChars屬性設置為True,可以保留服務器發送的數據的顯示格式。ConnectMode保留ddeAutomatic的默認設置。
程序在類TForm1中定義了壹個私有數據成員Automatic,用來標記join模式。三個字符串數據成員DDEService、DDETopic和DDEItem用於記錄連接信息。
生成窗口時初始化變量和組件狀態。
程序TForm1。FormCreate(發件人:to object);
開始
請求Btn。enabled:= False;
放射自顯影。選中:=真;
自動:=真;
結束;
當連接模式改變時,程序相應地進行處理。
自動模式到手動模式:
程序TForm1。ManualRadioClick(發送方:to object);
開始
如果自動,那麽
開始
請求Btn。啟用:=手動無線電。已檢查;
DDEClientConv1。connect mode:= DDE manual;
自動:=假;
結束;
結束;
從手動模式切換到自動模式:
程序TForm1。放射自顯影(發送者:to object);
開始
如果不是自動的,那麽
開始
請求Btn。啟用:=手動無線電。已檢查;
如果(DDEService = ' ')或(DDETopic = ' ')則
開始
MessageDlg('無法設置鏈接。,mtWarning,[mbOK],0);
退出;
結束;
DDEClientConv1。SetLink (DDEService,DDE topic);
DDEClientItem1。DDE conv:= ddeclientconv 1;
DDEClientItem1。DDE item:= DDE item;
DDEClientConv1。connect mode:= DDE automatic;
自動:=真;
結束;
結束;
從自動模式切換到手動模式時,只需要簡單修改相應的屬性即可;從手動模式切換到自動模式時,需要調用SetLink重新建立連接,否則經常會拋出DDE異常。
通過從剪貼板粘貼連接信息來建立連接,這是最靈活的方法。
程序TForm1。PasteBtnClick(發件人:to object);
開始
如果GetPasteLinkInfo (DDEService,DDETopic,DDEItem ),則
開始
DDEClientConv1。SetLink (DDEService,DDE topic);
如果自動,那麽
開始
DDEClientItem1。DDE conv:= ddeclientconv 1;
DDEClientItem1。DDE item:= DDE item;
結束;
結束;
結束;
GetPasteInfo是在DDEMan庫單元中定義的函數,用於檢測剪貼板上是否有連接信息,並返回相應的DDE服務、主題和項目。
對於手動模式,客戶端必須顯式地從服務器申請數據。在這種模式下,DDE項目組件是冗余的,接收到的DDE連接信息由壹個字符串記錄。下面是實現代碼。
程序TForm1。RequestBtnClick(發送方:to object);
定義變量
數據:PChar
開始
如果DDEItem = ' '那麽
開始
MessageDlg('不能請求數據',mtWarning,[mbOK],0);
退出;
結束;
the data:= StrAlloc(79);
DDEClientConv1。OpenLink
數據:= DDEClientConv1。request data(DDE item);
DDEClientConv1。CloseLink
如果數據& lt& gt那就零吧
Memo1。text:= StrPas(the data);
StrDisPose(the data);
結束;
OpenLink和CloseLink方法用於打開和關閉連接。RequestData方法從服務器請求數據,並將其返回給PChar字符串。該字符串必須顯式分配內存,並在退出時被釋放。
不同的連接方式下,數據傳輸是不同的。對於手動模式,增加了連接的打開和關閉操作。節目單如下。
程序TForm1。PokeBtnClick(發送方:to object);
開始
如果DDEItem = ' '那麽
開始
MessageDlg('不能戳數據。',mtWarning,[mbOK],0);
退出;
結束;
如果自動,那麽
DDEClientConv1。PokeDataLines(DDEItem,Memo1。線條)
其他
開始
DDEClientConv1。OpenLink
DDEClientConv1。PokeDataLines(DDEItem,Memo1。臺詞);
DDEClientConv1。CloseLink
結束;
結束;
在Microsoft Office中打開Excel,加載壹個文件,選擇相關單位並復制到剪貼板。然後運行程序並按下粘貼鏈接按鈕,DDE連接將建立,相關單元中的數據將顯示在Memo1中。之後就可以進行模式轉換、數據應用、應用發送等壹系列工作了。運行後的屏幕如下圖所示。
7.3.9用客戶端程序控制程序管理器。
以下示例使用客戶端程序向程序管理器發送命令,以創建程序組、程序項和刪除程序組。
程序管理器提供了應用程序的DDE接口命令串,應用程序可以利用這些命令串實現以下功能:
1.創建程序組
命令格式是:
CreateGroup(程序組名[,程序組所在的路徑])
當程序組不存在時創建壹個程序組;如果程序組存在,它將按照指定的路徑被激活。
2.刪除程序組
命令格式是:
刪除組(程序組名)
3.顯示程序組
命令格式為:
顯示組(節目組名稱,顯示標誌)
顯示標誌用於控制程序組以最大、最小或正常方式在程序管理器中顯示。
4.重新加載程序組
命令格式是:
ReLoadGroup(程序組名)
該命令使程序管理器刪除並重新加載壹個現有的程序組。
5.向程序組添加程序項。
命令格式是:
AddItem(命令行[,描述[,圖標路徑[,圖標序列號[,圖標橫坐標,圖標縱坐標[,工作區目錄[,熱鍵[,是否最小化顯示徽標]]]]
命令行控制程序項的執行,程序項可能包括路徑、參數等。其他參數對應於在程序管理器中添加程序項時需要設置的參數和選項。它們都有默認設置,所以是可選的。
6.替換程序組中的程序項
命令格式是:
ReplaceItem(程序項目名)
這個命令刪除壹個節目項並記錄被刪除節目項的位置,然後通過AddItem在這個記錄的位置添加壹個新的節目項。
7.從程序組中刪除程序項
命令格式是:
刪除項目(項目名稱)
從當前活動的程序組中刪除程序項。
8.關閉程序管理器
命令格式是:
退出程序(是否保存程序組信息標誌)
從應用程序向程序管理器發送命令字符串的方法基本相同。為了簡單起見,例程中只實現了壹個字符串參數,讀者可以很容易地進行進壹步的擴展。
如圖所示,編程界面包括壹個DDEClientConv組件和四個按鈕來完成不同的功能。
DDEClientConv在設計時與程序管理器建立DDE會話,其中DDE服務器和DDE主題都是PROGMAN。ConnectMode設置為ddeManual。
我們抽象出只有壹個字符串參數的命令發送情況,形成下面的SendMacro函數。
函數TForm1。SendMacro(名稱:字符串;command:String):Boolean;
定義變量
宏:字符串;
Cmd:數組[0..255]的Char
開始
結果:=真;
如果名稱& lt& gt’‘那麽
開始
macro:= Format('['+Command+'(% s)]',[Name])+# 13 # 10;
StrPCopy (Cmd,宏);
DDEClient。OpenLink
如果不是DDEClient。然後執行宏(Cmd,False)
結果:=假;
DDEClient。CloseLink
結束;
結束;
該過程首先使用Format函數來形成宏字符串:
macro:= Format('['+Command+'(% s)]',[Name])+# 13 # 10;
然後將Pascal類型的字符串復制到程序經理可以接受的PChar類型的字符串中。
DDE連接采用手動模式。首先調用OpenLink方法。然後調用ExecuteMacro方法發送命令,如果失敗則返回False。最後,用CloseLink關閉連接。
CreateButton、AddButton和DeleteButton三個按鈕分別用於創建節目組、添加節目項和刪除節目組。它們的程序實現是相似的,如下所示。
創建程序組:
程序TForm1。CreateButtonClick(發件人:to object);
定義變量
名稱:字符串;
開始
Name := InputBox('輸入框','輸入組名',' ');
如果Name = ' '那麽
MessageDlg('組名不能為空。,mtError,[mbOK],0)
其他
如果SendMacro(Name,' CreateGroup') = False,則
MessageDlg('無法創建組。,mtInformation,[mbOK],0);
結束;
添加計劃項目:
程序TForm1。AddButtonClick(發件人:to object);
定義變量
名稱:字符串;
開始
Name := InputBox('輸入框','輸入應用程序完整路徑名',' ');
如果Name = ' '那麽
MessageDlg('應用程序名稱不能為空。,mtError,[mbOK],0)
其他
如果SendMacro(Name,' AddItem') = False,則
MessageDlg('無法添加項目。,mtInformation,[mbOK],0);
結束;
刪除程序組:
程序TForm1。DeleteButtonClick(發件人:to object);
定義變量
名稱:字符串;
開始
Name := InputBox('輸入框','要刪除的輸入組名',' ');
如果Name = ' '那麽
MessageDlg('組名不能為空。,mtError,[mbOK],0)
其他
如果SendMacro(Name,' DeleteGroup') = False,則
MessageDlg('無法創建組。,mtInformation,[mbOK],0);
結束;
7.4 DDE服務器程序的實現
DDE服務器程序響應DDE客戶端的請求,通常它包含客戶端程序想要獲得的數據。
若要創建DDE服務器程序,必須在表單中添加壹個DDEServerItem部件。DDEServerItem的text或Lines屬性包含要連接的數據。通常,DDEServerItem小部件與另壹個文本控件相關聯。當text控件中的內容更改時,更新DDEServerItem的text或Lines屬性的值。以下程序將DDEServerItem與列表框相關聯。這個連接是在列表框的OnChange事件中實現的。
程序表單1。OnListBoxChange(發件人:to object);
開始
DDEServerItem1。行數:= ListBox1。物品;
結束;
創建DDE服務器程序時,還可以添加壹個DDEServerConv組件,並使用DDEServerItem的ServerConv屬性連接這兩個組件。此時,DDE主題成為部件DDEServerConv的名稱,而不是帶有DDEServerItem的部件表單的標題。
在下列情況下,有必要使用DDEServerConv組件:
1.帶有DDEServerItem小部件的表單的標題可能會在運行時更改,或者可能有其他表單具有相同的標題。在這種情況下,可能無法建立DDE連接;
2.DDE客戶端程序可能會向服務器程序發送宏命令。在這種情況下,只有DDEServerConv組件可以響應OnMacroExecute事件並執行相應的操作。
7.4.1與DDE客戶端程序建立連接。
壹般來說,建立DDE連接是客戶端程序的任務。但是,服務器程序可以將鏈接復制到剪貼板,供客戶端程序粘貼和建立DDE會話。步驟如下:
1.調用DDEServerItem組件的CopyToClipboard方法,將Text(或Lines)屬性的值和DDE連接信息復制到剪貼板;
2.DDE客戶端程序插入鏈接的數據。通常,這是通過選擇適當的命令來實現的(如編輯|選擇性粘貼或編輯|粘貼鏈接)。
7.4.2響應DDE事件
Part DDEServerConv有三個事件:OnOpen、OnClose、OnExecuteMacro。前兩個事件在DDE會話建立和終止時觸發。同(7.3.7)。
OnExecuteMacro事件用於響應客戶端程序發送的宏指令。OnExecuteMacro事件處理程序有壹個Msg參數來保存發送的指令字符串。在這個過程中,用戶可以決定如何響應這些宏指令。
DDEServerItem部分只有壹個事件OnPokeData。此事件用於響應客戶端程序發送的數據。如果客戶端程序是Delphi程序,則客戶端程序調用PokeData或PokeDataLines方法。在處理該事件的過程中,用戶可以將發送的數據保存到合適的地方。壹般來說,這應該是DDEServerItem接觸的文本控件。
下面的程序將發送的數據保存到ListBox。
程序表單1。onddeservitempokedata(ser der:to object);
開始
列表框1。Items := DDEServerItem1。線條;
結束;
7.4.3 DDE服務器應用程序
讓我們創建壹個DDE服務器例程和壹個相應的DDE客戶端例程。
DDE服務器例程可以執行以下操作:
1.為其他程序將DDE連接信息復制到剪貼板;
2.使用TMemo組件為其他程序提供數據源;
3.接收客戶端程序發送的數據;
4.根據客戶端程序發送的宏指令改變其運行狀態。
每個組件的關鍵屬性如下:
DDESrvrForm。ActiveControl = Memo1
DDESrvrForm。Menu = MainMenu1
斜面1。Align = alTop
Memo1。Align = alClient
DDETestItem。ServerConv = DDETestTopic
通過設置Bevel1和Memo1的Align屬性,可以保證在窗口大小變化的情況下,屏幕顯示依然可以保持美觀。
Memo1是服務器的數據源,DDE項目組件DDETestItem通過Memo1的OnChange事件與Memo1建立聯系。
過程TDdeSrvrForm.doOnChange(發送方:to object);
開始
如果不是FInPoke那麽
DDETestItem。行數:= Memo1。線條;
結束;
FInPoke是壹個布爾私有數據成員,用來表示程序是否正在處理客戶端程序的數據傳輸。當數據由客戶發送並傳輸到數據源時,不需要將數據傳輸到DDE項目組件。
要將連接信息復制到剪貼板,只需調用DDETestItem的CopyToClipboard方法。
過程TDDESrvrForm。CopyClick(發件人:to object);
開始
DDETestItem。CopyToClipboard
結束;
這是通過菜單項“編輯|復制”調用的。
接收客戶端程序發送的數據是在處理DDETestItem的OnPokeData事件的過程中。在接收過程中改變FInPoke的值,防止數據的無效反向傳輸。
過程TDDESrvrForm.doOnPoke(發送方:to object);
開始
fin poke:= True;
Memo1。行數:= DDETestItem。線條;
fin poke:= False;
結束;
處理客戶在處理DDE會話組件DDETestTopic的OnExecuteMacro事件過程中發送的宏指令。我們* * *定義了五個可以響應的宏指令:CopyDDE、Clear、WS_Normal、WS_MINIMIZED和WS_MAXIMIZED,分別用於復制連接信息、清除Memo1中的內容和改變窗口的顯示狀態。
過程TDdeSrvrForm.doMacro(發送方:TObjectmsg:TStrings);
定義變量
Cmd:字符串;
I:整數;
開始
cmd:=“”;
如果味精。Count = 0然後退出;
對於I := 0到Msg。Count-1 do
開始
Cmd := Msg。字符串[I];
如果大寫(Cmd) = 'COPYDDE '則
DDETestItem。抄寫板
否則,如果大寫(Cmd) = 'CLEAR ',則
Memo1.text: = ' '
else如果大寫(Cmd) = 'WS_NORMAL '那麽
窗口狀態:= wsNormal
else如果大寫(Cmd) = 'WS_MINIMIZED '則
WindowState := wsMinimized
else如果大寫(Cmd) = 'WS_MAXIMIZED '則
WindowState := wsMaximized
其他
MessageDlg('無效命令',mtWarning,[mbOK],0);
結束;
結束;
下面的DDE客戶端程序主要是為了驗證上面的DDE服務器程序而設計的,但是也提供了壹個完整的DDE客戶端程序設計的例子。
程序將接收到的DDE數據保存在壹個TMemo類組件DDEDat中,而要發送到服務器的數據和宏指令則輸入到另壹個TMemo類組件PokeDat中。PokeBtn和ExecuteBtn兩個按鈕用於發送數據和宏指令。“文件|新建鏈接”和“編輯|粘貼鏈接”這兩個菜單項用於根據用戶的輸入創建新鏈接,並從剪貼板粘貼DDE鏈接。
DDE連接的建立是通過調用SetLink方法實現的。
建立新連接的實現代碼如下。
過程TFormD.doNewLink(發送方:to object);
開始
DDEClient。SetLink (AppName。文本,主題名稱。正文);
DDEClientItem。DDE conv:= DDE client;
DDEClientItem。DDEItem := ItemName。文本;
結束;
通過從剪貼板粘貼連接信息來建立連接的實現代碼如下。
程序TFormD。Edit1Click(發件人:to object);
定義變量
服務,主題,項目:字符串;
開始
PasteLink1。enabled:= GetPasteLinkInfo(Service,Topic,Item);
結束;
過程TFormD.doPasteLink(發送方:to object);
定義變量
服務,主題,項目:字符串;
開始
如果GetPasteLinkInfo(服務、主題、項目),則
開始
AppName。text:= Service;
TopicName。正文:=題目;
項目名稱。text:= Item;
DDEClient。SetLink(服務,主題);
DDEClientItem。DDE conv:= DDE client;
DDEClientItem。DdeItem := ItemName。文本;
結束;
結束;
在OnChange事件處理過程中,將收到的事件保存在DDEClientItem中。
程序TFormD。DDEClientItemChange(發件人:to object);
開始
DDEDat。Lines := DDEClientItem。線條;
結束;
數據傳輸的實現代碼如下。
過程TFormD.doPoke(發送方:to object);
定義變量
DDE CLI:TDDEClientConv;
開始
DDECli := DDEClientItem。DdeConv
如果DdeCli & lt& gt那就零吧
DDECli。PokeDataLines (DDEClientItem。DDEItem,PokeDat。臺詞);
結束;
宏指令發送的實現代碼如下。
過程TFormD.doMacro(發送方:to object);
定義變量
DDE CLI:TDDEClientConv;
Cmd:字符串;
開始
DDECli := DDEClientItem。DdeConv
如果DDECli & lt& gt那就零吧
開始
Cmd := PokeDat。text+# 13 # 10;
DDECli。ExecuteMacroLines (PokeDat。臺詞,真);
結束;
結束;
運行以上兩個程序建立DDE連接。經過測試,數據傳輸、數據傳輸以及宏指令傳輸和執行都達到了預期的要求。
總結
剪貼板和DDE是Windows下數據通信的兩種方法。Delphi以簡單友好的方式實現了相應的功能,為用戶編程提供了方便。壹般來說,剪貼板多用於靜態數據傳輸,DDE用於動態數據交換和其他程序的控制。這些內容對於多用戶環境下的程序開發非常重要。