全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:2598
推到 Plurk!
推到 Facebook!

Delphi 2009 如何使用 IdStack 取得 IP 值?

缺席
pcboy
版主


發表:177
回覆:1838
積分:1463
註冊:2004-01-13

發送簡訊給我
#1 引用回覆 回覆 發表時間:2009-05-05 20:50:37 IP:59.104.xxx.xxx 訂閱
Delphi 2009 如何使用 IdStack 取得 IP 值?

[code delphi]

uses
IdStack; // 要有 IdStack

function GetAllIP:String;
var
IdStack: TIdStack;
begin
//IdStack := TIdStack.CreateStack; // Delphi 7, 可以
IdStack := TIdStack.Create; // Delphi 2009, 失敗, 不知為何
try
Result := IdStack.LocalAddresses.Text;
finally
IdStack.Free;
end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
Memo1.Lines.Add(GetAllIP);
end;

end.

[/code]

------
能力不足,求助於人;有能力時,幫幫別人;如果您滿意答覆,請適時結案!

子曰:問有三種,不懂則問,雖懂有疑則問,雖懂而想知更多則問!
HikaruGo
中階會員


發表:22
回覆:69
積分:88
註冊:2007-12-09

發送簡訊給我
#2 引用回覆 回覆 發表時間:2009-05-06 00:05:48 IP:61.62.xxx.xxx 訂閱
Trce indy Code ..
版大可能誤會了 OOP



IdStack: TIdStack;
function GetLocalAddresses: TIdStrings; virtual; abstract;
property LocalAddresses: TIdStrings read GetLocalAddresses;
引用的Code為 abstract 故尚未時作

故你引用需要有演生的Class 如 TIdStackWindows

Sample Code :

uses IdStackWindows;

function GetAllIP:String;
var
IdStack: TIdStack;
begin

IdStack := TIdStackWindows.Create;
try

//Result := IdStack.LocalAddress;
Result := IdStack.LocalAddresses.Text;
finally
IdStack.Free;
end;
end;

沒有Calss 階層表所以只能用猜的

TIdStackWindows 是我猜的... 參考 IdStackXXXX.pas




Trace code

procedure TIdStackWindows.PopulateLocalAddresses;
type
TaPInAddr = Array[0..250] of PInAddr;
PaPInAddr = ^TaPInAddr;
var
i: integer;
AHost: PHostEnt;
PAdrPtr: PaPInAddr;
begin
FLocalAddresses.Clear ;
AHost := GetHostByName(PChar(HostName));
if AHost = nil then begin
CheckForSocketError(SOCKET_ERROR);
end else begin
PAdrPtr := PAPInAddr(AHost^.h_address_list);
i := 0;
while PAdrPtr^[i] <> nil do begin
FLocalAddresses.Add(TranslateTInAddrToString(PAdrPtr^[I]^,Id_IPv4)); //BGO FIX
Inc(I);
end;
end;
end;


若單純List IP 不必引用 外掛的Lib ,對Code維護是一大負擔,,況且Lib 可能會 init 一些memory 之類的.
簡單精準是最好的上策


===================引 用 pcboy 文 章===================
Delphi 2009 如何使用 IdStack 取得 IP 值?
編輯記錄
HikaruGo 重新編輯於 2009-05-06 00:09:26, 註解 無‧
pcboy 重新編輯於 2009-05-06 06:58:22, 註解 無‧
pcboy
版主


發表:177
回覆:1838
積分:1463
註冊:2004-01-13

發送簡訊給我
#3 引用回覆 回覆 發表時間:2009-05-06 01:02:01 IP:59.104.xxx.xxx 訂閱
錯誤訊息是 
Project Project1.exe raised exception class EAbstractError with messahe 'Anstract Error'


IdStack.pas 可到此處下載
http://www.badongo.com/file/14800218
------
能力不足,求助於人;有能力時,幫幫別人;如果您滿意答覆,請適時結案!

子曰:問有三種,不懂則問,雖懂有疑則問,雖懂而想知更多則問!
pcboy
版主


發表:177
回覆:1838
積分:1463
註冊:2004-01-13

發送簡訊給我
#4 引用回覆 回覆 發表時間:2009-05-06 07:23:26 IP:59.104.xxx.xxx 訂閱
查到了 ( 雖然還是沒搞動 abstract base class )

TIdStack is an abstract base class. Do not instantiate it directly. Use

the global GStack variable instead. Call the TIdStack.IncUsage() class

method to ensure GStack is intialized before accessing it, ie:


[code delphi]
uses
IdStack;

function GetAllIP: String;
begin
TIdStack.IncUsage;
try
Result := GStack.LocalAddresses.Text;
finally
TIdStack.DecUsage;
end;
end;
[/code]






Note - the TIdStack.LocalAddesses property is not thread-safe. If you have

threads involved, a safer approach would be to use the

TIdStack.AddLocalAddressesToList() method instead, ie:

[code delphi]
uses
IdStack;

function GetAllIP: String;
var
List: TStringList;
begin

List := TStringList.Create;
try
TIdStack.IncUsage;
try
GStack.AddLocalAddressesToList(List);
finally
TIdStack.DecUsage;
end;
Result := List.Text;
finally
List.Free;
end;
end;
[/code]
------
能力不足,求助於人;有能力時,幫幫別人;如果您滿意答覆,請適時結案!

子曰:問有三種,不懂則問,雖懂有疑則問,雖懂而想知更多則問!
編輯記錄
pcboy 重新編輯於 2009-05-06 07:24:40, 註解 無‧
系統時間:2024-11-22 16:41:26
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!