zoukankan      html  css  js  c++  java
  • 为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; } //---------------------------------------------------------------------------
  • 相关阅读:
    cf C. Vasya and Robot
    zoj 3805 Machine
    cf B. Vasya and Public Transport
    cf D. Queue
    cf C. Find Maximum
    cf B. Two Heaps
    cf C. Jeff and Rounding
    cf B. Jeff and Periods
    cf A. Jeff and Digits
    I Think I Need a Houseboat
  • 原文地址:https://www.cnblogs.com/chulia20002001/p/1852639.html
Copyright © 2011-2022 走看看