在網(wǎng)絡(luò)程序的設(shè)計過程中,經(jīng)常需要根據(jù)得到的IP地址取得主機的名稱,本實例將演示如何根據(jù)用戶輸入的IP地址獲取對應(yīng)主機的名稱。
向窗體上添加兩個TLabel組件、兩個TEdit組件和一個TButton組件,設(shè)計完成的主界面如圖1所示。
圖1 主界面
在程序運行過程中首先需要向程序的uses段中加入Winsock,這樣就可以調(diào)用與Winsock相關(guān)的函數(shù)進行操作。
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;
程序運行初期就會執(zhí)行FormCreate中的代碼,首先通過OpenDialog.Execute語句來顯示一個提示讀者選擇文件的對話框。如果用戶在該對話框中確認選擇了一個有效文件后,就把文件路徑和文件名等信息存儲在變量FileName中,把文件讀寫屬性等信息存儲在變量Attributes中。然后通過判斷Attributes分別與faReadOnly、faArchive、faSysFile和faHidden常量比較的結(jié)果,來決定ReadOnly、Archive、System和Hidden4個CheckBox組件的選中狀態(tài)。
通過lblPosition.Caption:=lblPosition.Caption+ExtractFileDir(FileName)語句在lblPosition組件中顯示文件位置,通過lblName.Caption:=lblName.Caption+ExtractFileName(FileName)語句顯示文件名。最后通過GetFileSize函數(shù)和lblSize.Caption:=lblSize.Caption+Format('%d bytes', [GetFileSize(FileName)])語句來顯示文件大小,GetFileSize函數(shù)代碼如下:
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)語句來查找目標文件,找到后設(shè)置GetFileSize函數(shù)的返回值為目標文件的大小SearchRec.Size。
向窗體上添加兩個TLabel組件、兩個TEdit組件和一個TButton組件,設(shè)計完成的主界面如圖1所示。
圖1 主界面
在程序運行過程中首先需要向程序的uses段中加入Winsock,這樣就可以調(diào)用與Winsock相關(guān)的函數(shù)進行操作。
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;
程序運行初期就會執(zhí)行FormCreate中的代碼,首先通過OpenDialog.Execute語句來顯示一個提示讀者選擇文件的對話框。如果用戶在該對話框中確認選擇了一個有效文件后,就把文件路徑和文件名等信息存儲在變量FileName中,把文件讀寫屬性等信息存儲在變量Attributes中。然后通過判斷Attributes分別與faReadOnly、faArchive、faSysFile和faHidden常量比較的結(jié)果,來決定ReadOnly、Archive、System和Hidden4個CheckBox組件的選中狀態(tài)。
通過lblPosition.Caption:=lblPosition.Caption+ExtractFileDir(FileName)語句在lblPosition組件中顯示文件位置,通過lblName.Caption:=lblName.Caption+ExtractFileName(FileName)語句顯示文件名。最后通過GetFileSize函數(shù)和lblSize.Caption:=lblSize.Caption+Format('%d bytes', [GetFileSize(FileName)])語句來顯示文件大小,GetFileSize函數(shù)代碼如下:
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)語句來查找目標文件,找到后設(shè)置GetFileSize函數(shù)的返回值為目標文件的大小SearchRec.Size。