在網絡程序的設計過程中,經常需要根據得到的IP地址取得主機的名稱,本實例將演示如何根據用戶輸入的IP地址獲取對應主機的名稱。
向窗體上添加兩個TLabel組件、兩個TEdit組件和一個TButton組件,設計完成的主界面如圖1所示。
圖1 主界面
在程序運行過程中首先需要向程序的uses段中加入Winsock,這樣就可以調用與Winsock相關的函數進行操作。
Attributes和FileName是兩個全局變量。其中Word類型的Attributes變量用於存儲文件的屬性,而String類型的FileName屬性用於存儲文件的路徑和文件名。
另外還要在FormCreate過程中添加下列代碼:
procedure TfrmMain.btnConversionClick(Sender: TObject);
var
WSAData: TWSAData;
HostEnt: PHostEnt;
IPAddress: string;
addr: dword;
begin
edtName.Clear;
WSAStartup(2, WSAData);
IPAddress:=edtAddress.Text;
try
addr := inet_addr(PChar(IPAddress));
HostEnt:= GetHostByAddr(@addr, Length(IPAddress), PF_INET);
edtName.Text:=HostEnt.h_name;
except
ShowMessage('無效的IP地址');
end;
WSACleanup;
end;
程序運行初期就會執行FormCreate中的代碼,首先通過OpenDialog.Execute語句來顯示一個提示讀者選擇文件的對話框。如果用戶在該對話框中確認選擇了一個有效文件後,就把文件路徑和文件名等信息存儲在變量FileName中,把文件讀寫屬性等信息存儲在變量Attributes中。然後通過判斷Attributes分別與faReadOnly、faArchive、faSysFile和faHidden常量比較的結果,來決定ReadOnly、Archive、System和Hidden4個CheckBox組件的選中狀態。
通過lblPosition.Caption:=lblPosition.Caption+ExtractFileDir(FileName)語句在lblPosition組件中顯示文件位置,通過lblName.Caption:=lblName.Caption+ExtractFileName(FileName)語句顯示文件名。最後通過GetFileSize函數和lblSize.Caption:=lblSize.Caption+Format('%d bytes', [GetFileSize(FileName)])語句來顯示文件大小,GetFileSize函數代碼如下:
function TfrmMain.GetFileSize(const FileName: string): LongInt;
var
SearchRec: TSearchRec;
begin
try
if FindFirst(ExpandFileName(FileName), faAnyFile, SearchRec) = 0 then
Result := SearchRec.Size
else Result := -1;
finally
SysUtils.FindClose(SearchRec);
end;
end;
首先聲明SearchRec為一個查找記錄,然後通過FindFirst(ExpandFileName(FileName), faAnyFile, SearchRec)語句來查找目標文件,找到後設置GetFileSize函數的返回值為目標文件的大小SearchRec.Size。
程序代碼如下:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Mask,Winsock;
type
TfrmMain = class(TForm)
Label1: TLabel;
btnConversion: TButton;
edtName: TEdit;
Label2: TLabel;
edtAddress: TEdit;
procedure btnConversionClick(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure edtAddressChange(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
frmMain: TfrmMain;
implementation
{$R *.dfm}
procedure TfrmMain.btnConversionClick(Sender: TObject);
var
WSAData: TWSAData;
HostEnt: PHostEnt;
IPAddress: string;
addr: dword;
begin
edtName.Clear;
WSAStartup(2, WSAData);
IPAddress:=edtAddress.Text;
try
addr := inet_addr(PChar(IPAddress));
HostEnt:= GetHostByAddr(@addr, Length(IPAddress), PF_INET);
edtName.Text:=HostEnt.h_name;
except
ShowMessage('無效的IP地址');
end;
WSACleanup;
end;
procedure TfrmMain.FormCreate(Sender: TObject);
begin
edtAddress.Clear;
edtName.Clear;
btnConversion.Enabled:=False;
end;
procedure TfrmMain.edtAddressChange(Sender: TObject);
begin
btnConversion.Enabled:=True;
if edtAddress.Text='' then
begin
btnConversion.Enabled:=False;
end;
end;
end.
保存文件,然後按F9鍵運行程序,程序運行的初始畫面如圖2所示。
在“IP地址”對應的文本框中輸入一個有效的IP地址,單擊“轉換”按鈕,程序就會在“主機名”對應的文本框中顯示該IP地址對應的主機名,如圖3所示。
圖2 程序運行的初始畫面
圖3 程序運行結果