为Delphi/C++Builder增添IP控件

http://www.ithome-cn.net/technology/delphi/de085.htm

一、IP控件的属性、方法及事件

  本文将为Delphi/C++ Builder的IP控件实现下面的属性、方法和事件。它们的简单介绍如下:

  IP属性:IP控件中的IP地址值(32位整数LongWord)。为了获取IP控件的IP值,我们只需要读取此属性即可;通过对IP属性赋值,我们就能够改变IP控件的内容。

  Field0..Field3属性:Field0到Field3分别为IP控件的4个部分的值。这四个属性也是为了读取和改变IP控件的IP值而设置的。

  Field0Range..Field3Range 属性:Field0Range到 Field3Range限制IP控件各部分的取值的范围。

  Blank属性:判断IP控件的IP串是否为空,此属性为只读属性。

  About属性:在Object Inspector中点击它可以显示控件的版本信息,添加此属性是为了提供一个编写属性编辑器的简单例子。

  以下属性继承自TWinControl类:Font、TabOrder、 TabStop、 ParentShowHint、ShowHint、Hint及Visible。

  TIPEdit的事件属性有:OnFieldChange、OnChange、 OnEnter以及OnExit。

  Clear方法:清空IP控件中的IP串。

  SetFieldFocus方法:设置IP控件的输入焦点。

  二、IP控件的实现

//文件名:IPEdit.PAS
    {~~~~~~~~~~~~~~~~~~~~~~~}
    // IP address edit control for Borland Delphi 5
    //  Implemented by Simon Liu (simon_liu@263.net)
    {~~~~~~~~~~~~~~~~~~~~~~~}
    unit IPEdit;
    interface
    uses Windows, Messages, SysUtils, Classes,
     Forms, Controls, ComCtrls, CommCtrl, DsgnIntf;

    type
      TFieldRange = record
        LowRange: Byte;
        HighRange: Byte;
      end;

      TFieldChangeEvent = procedure(Sender: TObject; 
        OldField, Value: Byte) of Object;

      //定义TAboutProperty属性编辑器
      TAboutProperty = class(TPropertyEditor)
      public
        procedure Edit; override;
        function GetAttributes: TPropertyAttributes;override;
        function GetValue: string; override;
      end;

      TIPEdit = class(TWinControl)
      private
        fAbout:TAboutProperty;
        FIP: LongWord;
        FFields:array[0..3] of Byte;
        FFieldRanges: array [0..3] of TFieldRange;
        FCreating: Boolean;
        FOnChange: TNotifyEvent;
        FOnEnter: TNotifyEvent;
        FOnExit: TNotifyEvent;
        FOnFieldChange: TFieldChangeEvent;
        procedure SetIP(Value: LongWord);
        function GetIP: LongWord;
        function  GetField(Index:Integer):Byte;
        procedure SetField(Index:Integer; B:Byte);
        function GetFieldRange(Field: Integer): 
        TFieldRange;
        procedure SetFieldRange(Field:integer; Value: 
          TFieldRange);
        procedure SetIPAddress;
        function GetBlank: Boolean;
        procedure WMNotifyFormat(var Message: TMessage);
         message WM_NOTIFYFORMAT;
        //处理IP控件的通知消息IPN_FIELDCHANGED
        procedure CNNotify(var Message: TWMNotify);
          message CN_NOTIFY;
        procedure CNCommand(var Message: TWMCommand);
          message CN_COMMAND;
        procedure WMSetFont(var Message: TWMSetFont);
          message WM_SETFONT;
      protected
     procedure CreateParams(var Params: TCreateParams); override;
        procedure CreateWnd; override;
        procedure DestroyWnd; override;
  public
     constructor Create(AOwner: TComponent); override;
        destructor Destroy; override;
        //清除IP控件中的IP串
        procedure Clear;
       //设置IP控件的输入焦点(field的有效取值为0..3)
      procedure SetFieldFocus(Field:Byte);
      published
        //判断IP控件的IP串是否为空
        property Blank: Boolean read GetBlank;
        //Field0到Field3分别为IP控件的4个部分的值
        property Field0: Byte index 0 read 
            GetField write SetField;
        property Field1: Byte index 1 read 
            GetField write SetField;
        property Field2: Byte index 2 read 
            GetField write SetField;
        property Field3: Byte index 3 read 
             GetField write SetField;
       //Field0Range到Field3Range
            限制IP控件各部分的取值的范围
        property Field0Range: TFieldRange index 0 read 
           GetFieldRange write SetFieldRange;
        property Field1Range: TFieldRange index 1 read 
           GetFieldRange write SetFieldRange;
        property Field2Range: TFieldRange index 2 read 
           GetFieldRange write SetFieldRange;
        property Field3Range: TFieldRange index 3 read 
           GetFieldRange write SetFieldRange;
        //IP地址值(32位整数LongWord)
        property IP: LongWord read GetIP write SetIP;
        //The About box
        property About:TAboutProperty read fAbout;
        //事件属性
        property OnChange: TNotifyEvent read FOnChange write
          FOnChange;
        property OnEnter: TNotifyEvent read FOnEnter write 
          FOnEnter;
        property OnExit: TNotifyEvent read FOnExit write
           FOnExit;
        property OnFieldChange: TFieldChangeEvent read
           FOnFieldChange 
        write FOnFieldChange;
       //以下属性继承自TWinControl控件
        property Enabled;
        property TabOrder;
        property TabStop;
        property ParentShowHint;
        property ShowHint;
        property Hint;
        property Visible;
      end;

    procedure Register;

    implementation

    {~~~~~TAboutProperty~~~~~~~~~~~}
    procedure TAboutProperty.Edit;
    begin
    Application.MessageBox(
      ‘TIPEdit for Delphi 5'#13
      +‘(C) 2000 by Simon Liu'#13
      +‘Email:simon_liu@263.net',
      ‘About TIPEdit',MB_ICONINFORMATION);
    end;

    function TAboutProperty.GetAttributes: TPropertyAttributes;
    begin
      Result := [paDialog, paReadOnly];
    end;

    function TAboutProperty.GetValue: string;
    begin
      Result := ‘(Simon)';
    end;

    {~TIPEdit~~~~~~~~~~~~~~~~~~}
    constructor TIPEdit.Create(AOwner: TComponent);
    var
      i: integer;
    begin
      //初始化ICC_INTERNET_CLASSES类控件
     CheckCommonControl(ICC_INTERNET_CLASSES);
      inherited Create(AOwner);
      for i:= 0 to 3 do
      begin
        FFieldRanges[i].LowRange:= 0;
        FFieldRanges[i].HighRange:= 255;
        FFields[i]:=0;
      end;
      FIP:=0;
      Height:= 25;
      Width:= 152;
      TabSTop:= True;
    end;

    procedure TIPEdit.DestroyWnd;
    begin
      inherited DestroyWnd
    end;

    destructor TIPEdit.Destroy;
    begin
      inherited Destroy;
    end;

    procedure TIPEdit.CreateParams(var Params: 
      TCreateParams);
    begin
      inherited CreateParams(Params);
      CreateSubClass(Params, WC_IPADDRESS);
      with Params do
      begin
      end;
    end;

    procedure TIPEdit.CreateWnd;
    begin
      FCreating := True;
      try
        inherited CreateWnd;
        SetIPAddress;
      finally
        FCreating := False;
      end;
    end;

    function TIPEdit.GetBlank: Boolean;
    begin
 Result:= Boolean(SendMessage(Handle, IPM_ISBLANK, 0, 0));
    end;

    procedure TIPEdit.Clear;
    begin
   SendMessage(Handle, IPM_CLEARADDRESS, 0, 0);
    end;

    procedure TIPEdit.SetFieldFocus(Field:Byte);
    begin
      SendMessage(Handle, IPM_SETFOCUS, Field, 0);
    end;

    function TIPEdit.GetFieldRange(Field: Integer): TFieldRange;
    begin
      Result:= FFieldRanges[Field];
    end;

procedure TIPEdit.SetFieldRange(Field: Integer; 
   Value: TFieldRange);
    begin
      if Value.LowRange > Value.HighRange then exit;
      if (FFieldRanges[Field].LowRange <> Value.LowRange) or
        (FFieldRanges[Field].HighRange <> Value.HighRange) then
      begin
        FFieldRanges[Field]:= Value;
        SendMessage(Handle, IPM_SETRANGE, Field,
  MakeIPRange(Value.LowRange, Value.HighRange));
      end;
    end;

    function TIPEdit.GetField(Index: Integer): Byte;
    begin
      if (Index>=0)and(Index<=3) then Result:=FFields[Index]
      else Result:=0;
    end;

    procedure TIPEdit.SetField(Index:Integer; B:Byte);
    begin
      if (FFields[Index] <> B)then
      begin
        FFields[Index]:=B;
        SetIPAddress;
      end;
    end;

    procedure TIPEdit.SetIPAddress;
    var
      i:LongWord;
    begin
  i:=MAKEIPADDRESS(FFields[0], FFields[1], FFields[2], 
       FFields[3]);
      SendMessage(Handle, IPM_SETADDRESS, 0, i);
      FIP:=i;
    end;

    procedure TIPEdit.SetIP(Value: LongWord);
    begin
      if (FIP <> Value) then
      begin
        FFields[0]:= First_IPAddress(Value);
        FFields[1]:= Second_IPAddress(Value);
        FFields[2]:= Third_IPAddress(Value);
        FFields[3]:= Fourth_IPAddress(Value);
        SetIPAddress;
      end;
    end;

    function TIPEdit.GetIP: LongWord;
    begin
    SendMessage(Handle, IPM_GETADDRESS, 0,Integer(@Result));
    end;

   procedure TIPEdit.WMSetFont(var Message: TWMSetFont);
    begin
    //不可以调用父控件的此方法
    //否则,控件不能正常工作
    end;

procedure TIPEdit.WMNotifyFormat(var Message:
      TMessage);
    begin
      with Message do
    Result := DefWindowProc(Handle, Msg, WParam, LParam);
    end;

    procedure TIPEdit.CNNotify(var Message: TWMNotify);
    var
      pNM: PNMIPAddress;
    begin
      with (Message.NMHdr)^ do
      begin
        case Code of
        IPN_FIELDCHANGED:
        begin
        pNM:=PNMIPADDRESS(Message.NMHdr);
        if (pNM^.iField>=0)and(pNM^.iField<=3) then
        FFields[pNM^.iField]:=pNM^.iValue;
        if Assigned(FOnFieldChange) then
       FOnFieldChange(self, pNM^.iField, pNM^.iValue);
        end;
        end;
      end;
    end;

  procedure TIPEdit.CNCommand(var Message: TWMCommand);
    begin
      case Message.NotifyCode of
        EN_CHANGE:
        begin
         if not FCreating then
         if Assigned(FOnChange) then FOnChange(self);
        end;
        EN_KILLFOCUS: if Assigned(FOnExit) then FOnExit(self);
        EN_SETFOCUS: if Assigned(FOnEnter) then FOnEnter(self);
      end;
    end;

    //注册TIPEdit控件以及TAboutProperty属性编辑器
    procedure Register;
    begin
      RegisterComponents(‘Simon', [TIPEdit]);
      RegisterPropertyEditor(typeInfo(TAboutProperty),
        TIPEdit, ‘ABOUT', TAboutProperty);
    end;
    end. 

使用Windows系统提供的IP控件

http://topic.csdn.net/t/20031225/09/2600578.html

本文是ccrun(老妖)根据偶然间看到的一篇文章略作修改而成。参考资料:

标题:在Delphi中使用IP控件

作者:西安交通大学9649#刘明华

在些对原作者的无私奉献表示感谢!如欲转载请保留完整版权信息。

如果这篇文章侵犯了您的版权,请来信告诉我们:info@ccrun.com

ccrun(老妖)(www.ccrun.com) 2003.10.29

在网络程序中,我们常常碰到需要用户输入IP地址的情况。然而C++ Builder并没有为我们提供可以用于输入IP串的控件,于是我们只好用TEdit控件(单行文本框)来接受用户输入的IP串。但是,使用TEdit来输入IP串并不是一个好的主意,因为处理起来非常不方便。事实上,在我们的身旁有一个专门用来输入IP串的Windows控件,就象网络链接属性中, Internet 协议 (TCP/IP) 属性中输入IP的控件。IP控件会拒绝非法的IP串(在每个部分只能输入0~255之间的数字);它让你可以轻松地获取控件中的IP串所对应的IP值(32位整数),这省去了IP串和IP值之间相互转换的麻烦;此外,你还能限制IP控件中所能输入的IP的范围。在本文中,我将向大家介绍如何在我们的C++ Builder程序中使用Windows的IP控件。

Windows中有两个非常重要的动态联结库:commctrl.dll和comctl32.dll,它们是Windows的自定义控制库(Windows Common Controls)。自定义控制库中包含了许多常用的Windows控件,如Statusbar,Coolbar,HotKey等;在C++ Builder中,这些控件大多数都已被包装成可视化控件了。在Microsoft推出Internet Explorer 3之后,自定义控制库中新增了一些控件,其中就包括Windows的IP控件(IP Address edit control)。

●初始化Windows自定义控制库●

Windows提供了两个API函数,InitCommonControls和InitCommonControlsEx,用来初始化自定义控制库。从名字我们不难看出这两个API函数的关系:后者是前者的增强。如果你希望在程序中使用IP控件,你必须用InitCommonControlsEx来完成对自定义控制库以及类的初始化。函数InitCommonControlsEx的原型如下:

typedef struct tagINITCOMMONCONTROLSEX {

DWORD dwSize; // size of this structure

DWORD dwICC; // flags indicating which classes to be initialized

} INITCOMMONCONTROLSEX, *LPINITCOMMONCONTROLSEX;

WINCOMMCTRLAPI BOOL WINAPI InitCommonControlsEx(LPINITCOMMONCONTROLSEX);

IP控件属于ICC_INTERNET_CLASSES类别的控件,如果要使用该控件,你应该在程序中包含如下的初始化代码:

TInitCommonControlsEx ICC;

ICC.dwSize = sizeof(TInitCommonControlsEx);

ICC.dwICC = ICC_INTERNET_CLASSES;

if(!InitCommonControlsEx(&ICC))

return; //初始化组件失败

●创建IP控件●

Windows API函数CreateWindow或者CreateWindowEx都可以用来创建一个IP控件实例。IP控件的窗口类名为 "SysIPAddress32 ",C++ Builder的commctrl.pas单元为其定义了一个符号常量WC_IPADDRESS。下面这条语句将在Form1上创建一个IP控件。

HWND hIpEdit = CreateWindow(WC_IPADDRESS,NULL,WS_CHILD|WS_VISIBLE,10,10,135,47,Handle,0,HInstance,NULL);

●使用IP控件●

在程序中,我们通过向IP控件发送消息来与它通讯。IP控件可以响应的消息有以下6个,这些消息及它们的含义见下表:

消息常量 消息值 作用 参数及返回值

IPM_CLEARADDRESS WM_USER+100 清除IP控件中的IP串 参数无

IPM_SETADDRESS WM_USER+101 设置IP控件的IP串 Lparam为32位的IP值

IPM_GETADDRESS WM_USER+102 获取IP控件中的IP串所对应的IP值(32位整数) Lparam为一个指向Integer变量的指针。返回值等于IP控件中非控的字段数目;获取到的IP值存放在lparam 所指向的Integer变量中。

IPM_SETRANGE WM_USER+103 设置IP控件4个部分的其中一个的IP取值范围 Wparam指明要设置取值范围的部分;lparam的低16位字为该字段的范围:高字节为上限,低字节为下限。

IPM_SETFOCUS WM_USER+104 设输入焦点 Wparam指明哪个部分获取焦点

IPM_ISBLANK WM_USER+105 IP串是否为空 参数无。返回值:若为空,返回非0;不为空,返回0

★㈠清空IP串(IPM_CLEARADDRESS)★

SendMessage(hIpEdit,IPM_CLEARADDRESS,0,0);

★㈡设置IP串(IPM_SETADDRESS)★

int nIP;

nIP=MAKEIPADDRESS(192,168,0,1);

SendMessage(hIpEdit,IPM_SETADDRESS,0,nIP);

此例将IP控件的内容设为 "192.168.0.1 ",其中MAKEIPADDRESS是一个Win32宏,定义在commctrl.h头文件中,它用来合成一个32位的IP值:

#define MAKEIPADDRESS(b1,b2,b3,b4)

((LPARAM)(((DWORD)(b1) < <24)+((DWORD)(b2) < <16)+((DWORD)(b3) < <8)+((DWORD)(b4))))

★㈢获取IP值(IPM_GETADDRESS)★

int nIP;

SendMessage(hIpEdit,IPM_GETADDRESS,0,int(&nIP));

//nIP++;

//SendMessage(hIpEdit,IPM_SETADDRESS,0,nIP); //将IP加1再赋给IP控件。

若想要获取IP控件中IP串所对应的IP值,你应该向IP控件发送IPM_GETADDRESS消息,并且需要把一个32位整数的地址作为SendMessage的最后一个参数。

★㈣设置取值范围(IPM_SETRANGE)★

SendMessage (hIpEdit, IPM_SETRANGE, 0, 200 < <8|100);

此语句将IP控件的第一部分的范围限制为100~200。在IPM_SETRANGE消息中,Wparam指明要设置的字段, 而lparam的低16位字为该字段的范围:高字节为上限,低字节为下限。

★㈤设置输入焦点(IPM_SETFOCUS)★

SendMessage(hIpEdit,IPM_SETFOCUS,3,0);

//将输入焦点设在IP控件的第四部分。

㈥判断IP串是否为空(IPM_ISBLANK)

if(!SendMessage(hIpEdit,IPM_ISBLANK,0,0))

{

//IP控件中的IP串为空

}

else

{

//IP控件中的IP串至少有一部分不是空的

}

●IP控件的通知消息●

当IP串被改动后或者输入焦点发生了转移,IP控件就会向它的父窗口发送通知消息IPN_FIELDCHANGED。在大多数情况下,我们都可以忽略此通知消息。以下是处理通知消息IPN_FIELDCHANGED的一个示例:

void __fastcall TForm1::WndProc(TMessage &Msg)

{

LPNMHDR p=(LPNMHDR)Msg.LParam;

if(Msg.Msg==WM_NOTIFY)

{

if(p-> code==IPN_FIELDCHANGED)

{

//处理IP控件的IPN_FIELDCHANGED通知消息

}

}

TForm::WndProc(Msg);

}

作者:cker

此控件简单封装了老妖所列的Common Control

tab键控件间切换,输入 <.> 则切换IP子域。

代码如下:

#include   <CommCtrl.hpp>
#include   <ComCtrls.hpp>

class   TIPAddress;

Word   __fastcall   MakeIPRange(Byte   Low,   Byte   High)
{
    return     Word((Word(High)   < <   8)   +   Word(Low));
}

unsigned   __fastcall   MakeIPAddress(Byte   b1,   Byte   b2,   Byte   b3,   Byte   b4)
{
    return     Word((Word(b1)   < <   24)+(Word(b2)   < <   16)+(Word(b3)   < <   8)+(Word(b4)));
}

Byte   __fastcall   First_IPAddress(unsigned   X)
{
    return     Byte((X   > >   24)   &   0x0FF);
}


Byte   __fastcall   Second_IPAddress(unsigned   X)
{
    return     Byte((X   > >   16)   &   0x0FF);
}


Byte   __fastcall   Third_IPAddress(unsigned   X)
{
    return     Byte((X   > >   8)   &   0x0FF);
}

Byte   __fastcall   Fourth_IPAddress(unsigned   X)
{
    return     Byte(X   &   0x0FF);
}

typedef   void   __fastcall   (__closure   *TIPAddressFieldChangeEvent)(TIPAddress*   Sender,   Byte   OldField,   Byte   Value);
typedef   void   __fastcall     (__closure   *TIPAddressChangeEvent)(TIPAddress*   Sender,   AnsiString   IPAddress);

class   TIPAddress   :   public   TWinControl
{
private:
        TIPAddressChangeEvent   FOnIPChange;
        TIPAddressFieldChangeEvent   FOnIPFieldChange;
        int   FMinIPAddress;
        int   FMaxIPAddress;
        Byte   FActiveField;
        bool   FAutoSize;
        void   __fastcall   CNNotify(TWMNotify   &Message);   //CN_NOTIFY;
        void   __fastcall   CNCommand(TWMCommand   &Message);   //CN_COMMAND;
protected:
        virtual   void   __fastcall   CreateParams(TCreateParams   &Params);
        AnsiString   __fastcall     GetMinIPAddress();
        AnsiString   __fastcall     GetMaxIPAddress();
        AnsiString   __fastcall     GetIPAddress();
        void   __fastcall   SetMinIPAddress(AnsiString   Value);
        void   __fastcall   SetMaxIPAddress(AnsiString   Value);
        void   __fastcall   SetIPAddress(AnsiString   Value);
        bool   __fastcall   GetEmpty();

        void   __fastcall   SetActiveField(Byte   Value);
        void   __fastcall   WndProc(TMessage   &Message);


BEGIN_MESSAGE_MAP
        VCL_MESSAGE_HANDLER(CN_NOTIFY,   TWMNotify,   CNNotify);
        VCL_MESSAGE_HANDLER(CN_COMMAND,   TWMCommand,   CNCommand);
END_MESSAGE_MAP(TWinControl);

public:
        virtual   __fastcall   TIPAddress(TComponent*   AOwner);
        AnsiString   __fastcall   IPToString(int   Ip);
        int   __fastcall   StringToIP(AnsiString   Value);
        void   __fastcall   Clear();
__published:
        __property   Byte   ActiveField   =   {read   =   FActiveField,   write   =   SetActiveField};
        __property   bool   Empty   =   {read   =   GetEmpty};
        __property   AnsiString   MinIPAddress   =   {read   =   GetMinIPAddress,   write   =   SetMinIPAddress};
        __property   AnsiString   MaxIPAddress   =   {read   =   GetMaxIPAddress,   write   =   SetMaxIPAddress};
        __property   AnsiString   IPAddress   =   {read   =   GetIPAddress,   write   =   SetIPAddress};
        __property   TIPAddressChangeEvent   OnIPChange   =   {read   =   FOnIPChange,   write   =   FOnIPChange};
        __property   TIPAddressFieldChangeEvent   OnIPFieldChange   =   {read   =   FOnIPFieldChange,   write   =   FOnIPFieldChange};

        __property   Font;
        __property   ParentColor;
        __property   ParentFont;
        __property   ParentShowHint;
        __property   PopupMenu;
        __property   ShowHint;
        __property   TabOrder;
        __property   TabStop;
        __property   Tag;
        __property   DragCursor;
        __property   DragMode;
        __property   HelpContext;

};
void   __fastcall   TIPAddress::WndProc(TMessage   &Message)
{     
TWinControl::WndProc(Message); } __fastcall TIPAddress::TIPAddress(TComponent* AOwner):TWinControl(AOwner) { if (NewStyleControls) ControlStyle < < csClickEvents < < csSetCaption < < csDoubleClicks < < csFixedHeight; else ControlStyle < < csClickEvents < < csSetCaption < < csDoubleClicks < < csFixedHeight < < csFramed; ParentColor = false; FAutoSize = true; Width = 100; Height = 25; TabStop = true; FMinIPAddress = 0; FMaxIPAddress = 0x0FFFFFFFF; FActiveField = 0; FOnIPChange = NULL; FOnIPFieldChange = NULL; } void __fastcall TIPAddress::CreateParams(TCreateParams &Params) { InitCommonControl(ICC_INTERNET_CLASSES); TWinControl::CreateParams(Params); CreateSubClass(Params, WC_IPADDRESS); } void __fastcall TIPAddress::CNCommand(TWMCommand &Message) //CN_COMMAND; { if ((Message.NotifyCode == EN_CHANGE) && OnIPChange) OnIPChange(this, IPAddress); } void __fastcall TIPAddress::CNNotify(TWMNotify &Message) //CN_NOTIFY; { switch(Message.NMHdr-> code) { case IPN_FIELDCHANGED : { FActiveField = (PNMIPAddress(Message.NMHdr))-> iField; if (OnIPFieldChange) { OnIPFieldChange(this, (PNMIPAddress(Message.NMHdr))-> iField, (PNMIPAddress(Message.NMHdr))-> iValue); } } break; } } AnsiString __fastcall TIPAddress::GetIPAddress() { int IP = 0; SendMessage(Handle, IPM_GETADDRESS, 0, (int)&IP); return IPToString(IP); } AnsiString __fastcall TIPAddress::GetMinIPAddress() { return IPToString(FMinIPAddress); } void __fastcall TIPAddress::SetMinIPAddress(AnsiString Value) { FMinIPAddress = StringToIP(Value); SendMessage(Handle, IPM_SETRANGE, 0, MakeIPRange(First_IPAddress(FMinIPAddress), First_IPAddress(FMaxIPAddress))); SendMessage(Handle, IPM_SETRANGE, 1, MakeIPRange(Second_IPAddress(FMinIPAddress), Second_IPAddress(FMaxIPAddress))); SendMessage(Handle, IPM_SETRANGE, 2, MakeIPRange(Third_IPAddress(FMinIPAddress), Third_IPAddress(FMaxIPAddress))); SendMessage(Handle, IPM_SETRANGE, 3, MakeIPRange(Fourth_IPAddress(FMinIPAddress), Fourth_IPAddress(FMaxIPAddress))); } AnsiString __fastcall TIPAddress::GetMaxIPAddress() { return IPToString(FMaxIPAddress); } void __fastcall TIPAddress::SetMaxIPAddress(AnsiString Value) { FMaxIPAddress = StringToIP(Value); SendMessage(Handle, IPM_SETRANGE, 0, MakeIPRange(First_IPAddress(FMinIPAddress), First_IPAddress(FMaxIPAddress))); SendMessage(Handle, IPM_SETRANGE, 1, MakeIPRange(Second_IPAddress(FMinIPAddress), Second_IPAddress(FMaxIPAddress))); SendMessage(Handle, IPM_SETRANGE, 2, MakeIPRange(Third_IPAddress(FMinIPAddress), Third_IPAddress(FMaxIPAddress))); SendMessage(Handle, IPM_SETRANGE, 3, MakeIPRange(Fourth_IPAddress(FMinIPAddress), Fourth_IPAddress(FMaxIPAddress))); } void __fastcall TIPAddress::SetIPAddress(AnsiString Value) { SendMessage(Handle, IPM_SETADDRESS, 0, StringToIP(Value)); } bool __fastcall TIPAddress::GetEmpty() { return (bool)(SendMessage(Handle, IPM_ISBLANK, 0, 0)); } void __fastcall TIPAddress::Clear() { SendMessage(Handle, IPM_CLEARADDRESS, 0, 0); } void __fastcall TIPAddress::SetActiveField(Byte Value) { if ( Value < 4 ) { SendMessage(Handle, IPM_SETFOCUS, WPARAM(Value), 0); FActiveField = Value; } } int __fastcall TIPAddress::StringToIP(AnsiString Value) { Byte B[4]; B[0]= 0; B[1]= 0; B[2]= 0; B[3]= 0; int Cnt = 0; int i = Value.Pos( ". "); AnsiString Str; while ((Value.Length() > 0) && ( Cnt < 4 )) { if (i == 0) i = Value.Length() + 1; Str = Value.SubString(1, i-1); B[Cnt] = StrToInt(Str); Value = Value.SubString(i+1, Value.Length()); i = Value.Pos( ". "); Cnt++; } return MakeIPAddress(B[0], B[1], B[2], B[3]); } AnsiString __fastcall TIPAddress::IPToString(int Ip) { AnsiString S; S.sprintf( "%d.%d.%d.%d ", First_IPAddress(Ip),Second_IPAddress(Ip),Third_IPAddress(Ip),Fourth_IPAddress(Ip)); return S; } //--------------------------------------------------------------------------- TIPAddress* ip ; __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { ip = new TIPAddress(this); ip-> Parent = this; } //---------------------------------------------------------------------------