【Delphi】取得自己電腦的 IP

參考資料 ----
Determine Your IP with Delphi


在 Form 上放置 2 個 TEdit 和 1 個 TButton
 
uses
    ..., winsock;

...
...

implementation

{$R *.dfm}

function GetIPFromHost (var HostName, IPaddr, WSAErr: string): Boolean;
type
    // Name = array[0..100] of Char;     // Delphi 7(D7) 的寫法
    Name = array[0..100] of AnsiChar;    // Delphi2009 以後的寫法
    PName = ^Name;
var
    HEnt: pHostEnt;
    HName: PName;
    WSAData: TWSAData;
    i: Integer;
begin
    Result := False;
    if WSAStartup($0101, WSAData)<>0 then
    begin
        WSAErr := 'Winsock is not responding."';
        Exit;
    end;

    IPaddr := '';
    New(HName);
    if GetHostName(HName^, SizeOf(Name)) = 0 then
        begin
            HostName := StrPas(HName^);
            HEnt := GetHostByName(HName^);
            for i:=0 to (HEnt^.h_length-1) do
                IPaddr := Concat(IPaddr, IntToStr(Ord(HEnt^.h_addr_list^[i])) + '.');
            SetLength(IPaddr, Length(IPaddr) - 1);
            Result := True;
        end
    else
        begin
            case WSAGetLastError of
                WSANOTINITIALISED:  WSAErr := 'WSANotInitialised';
                WSAENETDOWN      :  WSAErr := 'WSAENetDown';
                WSAEINPROGRESS   :  WSAErr := 'WSAEInProgress';
            end;
        end;
    Dispose(HName);
    WSACleanup;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
    Host, IP, Err: string;
begin
    if GetIPFromHost(Host, IP, Err) then
        begin
            Edit1.Text := Host;
            Edit2.Text := IP;
        end
    else
        MessageDlg(Err, mtError, [mbOk], 0);
end;