2012-03-09 9 views
2

厳密には予約済みアドレス範囲で使用するため、IPv4で十分です。クラスA、B、またはC(おそらくCですが...)を使用するかどうかはまだ分かりませんので、すべてを処理できるようになるのはボーナスになります。FOSS IPv4アドレスピッカーVCLコンポーネントを探す

"localhost"のようなものを入力することもできますが、私はそれがなくても生きることができます。

ので、最低限の要件は192.xxx.xxx.xxxを指定し、xxxは255

確かを超えていないことを確認することです、私はいくつかのマスクの編集とアップ1をノックすることができ、しかし確実に誰かが持っていますその前にその特定の(FOSS)ホイールを発明しましたか?自己へ


注:あなたはそれをコーディングする必要がない場合、this pageJEDI Visual Component LibraryからTJvIPAddressを試してはどう便利

答えて

5

WindowsにはIP Address edit controlが組み込まれています。あなたは、例えば、簡単にアクセスおよび再利用するためのカスタムTWinControl子孫コンポーネントでそれをラップすることができます:

type 
    TIPAddressFieldChange = procedure(Sender: TObject; Field: Integer; Value: Integer) of object; 

    TIPAddress = class(TWinControl) 
    private 
    FOnFieldChange: TIPAddressFieldChange; 
    function GetIP: String; 
    function GetIsEmpty: Boolean; 
    procedure SetIP(const Value: String);  
    protected 
    procedure CreateParams(var Params: TCreateParams); override; 
    procedure CNNotify(var Message: TWMNotify); message CN_NOTIFY; 
    procedure WMGetDlgCode(var Message: TMessage); message WM_GETDLGCODE; 
    procedure WMSetFont(var Message: TWMSetFont); message WM_SETFONT; 
    public 
    constructor Create(Owner: TComponent); override; 
    procedure Clear; 
    property IP: String read GetIP write SetIP; 
    property IsEmpty: Boolean read GetIsEmpty; 
    published: 
    property OnFieldChange: TIPAddressFieldChange read FOnFieldChange write FOnFieldChange; 
    end; 

uses 
    Commctrl; 

constructor TIPAddress.Create(Owner: TComponent); 
begin 
    inherited; 
    InitCommonControl(ICC_INTERNET_CLASSES}; 
end; 

procedure TIPAddress.CreateParams(var Params: TCreateParams); 
begin 
    inherited; 
    CreateSubClass(Params, WC_IPADDRESS); 
    Params.Style := WS_CHILD or WS_TABSTOP or WS_VISIBLE; 
    if NewStyleControls and Ctl3D then 
    begin 
    Params.Style := Params.Style and not WS_BORDER; 
    Params.ExStyle := Params.ExStyle or WS_EX_CLIENTEDGE; 
    end; 
    Params.WindowClass.style := Params.WindowClass.style and not (CS_HREDRAW or CS_VREDRAW); 
end; 

procedure TIPAddress.Clear; 
begin 
    Perform(IPM_CLEARADDRESS, 0, 0); 
end; 

function TIPAddress.GetIP: String; 
var 
    dwIp: DWORD; 
begin 
    dwIp := 0; 
    Perform(IPM_GETADDRESS, 0, LPARAM(@dwIp)); 
    Result := Format('%d.%d.%d.%d', [FIRST_IPADDRESS(dwIp), SECOND_IPADDRESS(dwIp), 
THIRD_IPADDRESS(dwIp), FOURTH_IPADDRESS(dwIp)]); 
end; 

function TIPAddress.GetIsEmpty: Boolean; 
begin 
    Result := Perform(IPM_ISBLANK, 0, 0) <> 0; 
end; 

procedure TIPAddress.SetIP(const Value: String); 
var 
    dwIP: LPARAM; 
begin 
    with TStringList.Create do try 
    Delimiter := '.'; 
    StrictDelimiter := True; 
    DelimitedText := Value; 
    Assert(Count = 4); 
    dwIP := MAKEIPADDRESS(StrToInt(Strings[0]), StrToInt(Strings[1]), StrToInt(Strings[2]), StrToInt(Strings[3])); 
    finally 
    Free; 
    end; 
    Perform(IPM_SETADDRESS, 0, dwIP); 
end; 

procedure TIPAddress.CNNotify(var Message: TWMNotify); 
begin 
    inherited; 
    if (Message.NMHdr^.code = IPN_FIELDCHANGED) and Assigned(FOnFieldChange) then 
    begin 
    with PNMIPAddress(Message.NMHdr)^ do 
     FOnFieldChange(Self, iField, iValue); 
    end; 
end; 

procedure TIPAddress.WMGetDlgCode(var Message: TMessage); 
begin 
    inherited; 
    Message.Result := Message.Result or DLGC_WANTARROWS; 
end; 

procedure TIPAddress.WMSetFont(var Message: TWMSetFont); 
var 
    LF: LOGFONT; 
begin 
    if GetObject(Message.Font, SizeOf(LF), @LF) <> 0 then 
    begin 
    Message.Font := CreateFontIndirect(LF); 
    inherited; 
    end; 
end; 
+0

+1と答え、それはスタンドアロンなので(他の提案で私にJVCLをすべてインストールする必要があるかどうかはわかりません)。ありがとう – Mawg

3

に見えますか?自動範囲値の補正があり、標準のWindows IP編集ボックスから派生しています。

+0

+1よろしくお願いいたします。 – Mawg

+0

よろしくお願いいたします。これは実際にここに投稿されたレミーと同じものに基づいています。 WindowsのIPアドレスコントロールでは、コンポーネントとしてラップされているだけです。 – TLama

関連する問題