小弟想做个ip地址控件,在from中调试通过,可封装成控件后,没有象windows的ip分格,请高手帮我看看,谢谢了,源代码如下:
unit ipaddress;interfaceuses
  Windows, Messages, Classes, Forms, Controls, StdCtrls, ExtCtrls,SysUtils,Dialogs;type
  Tipaddress = class(TBevel)
  private
    FIPAddress: Longint;
    HIPAddress: HWND;
    PrevWndProc: TWndMethod;
    Fipaddr : string;
    { Private declarations }
  protected
    { Protected declarations }
  public
    function getipaddress : string;
    procedure setipaddress(const value : string);
    constructor Create(Owner: TComponent); override;
    destructor destroy;override;
    procedure NewWindowProc(var Message: TMessage);
    { Public declarations }
  published
    property ipaddress : string read getipaddress  write setipaddress;
    { Published declarations }
  end;procedure Register;implementationuses CommCtrl;const
  IP_ADDRESS_ID: Longword = $0100;procedure Register;
begin
  RegisterComponents('Samples', [Tipaddress]);
end;
{ Tbevel1 }constructor Tipaddress.Create(Owner: TComponent);
var
  lpInitCtrls: TInitCommonControlsEx;
begin
  inherited;
  lpInitCtrls.dwSize := SizeOf(TInitCommonControlsEx);
  lpInitCtrls.dwICC  := ICC_INTERNET_CLASSES;
  if InitCommonControlsEx(lpInitCtrls) then
  begin
    PrevWndProc := WindowProc;     //我想我的问题出在这里
    WindowProc  := NewWindowProc;  //牛人看看,是不是这里的问题    HIPAddress := CreateWindowEx(WS_EX_LEFT, WC_IPADDRESS, nil,
      WS_CHILD + WS_VISIBLE + WS_BORDER + WS_TABSTOP,
      self.Left, self.Top, self.Width, self.Height,
      self.HIPAddress , IP_ADDRESS_ID, HInstance, nil);
    SendMessage(HIPAddress, IPM_SETFOCUS, 0, 0);
  end;
end;destructor Tipaddress.destroy;
begin
  inherited;
end;function Tipaddress.getipaddress: string;
begin
  result:=Fipaddr;
end;procedure Tipaddress.NewWindowProc(var Message: TMessage);
var
  nField: longint;
begin
  case Message.Msg of
      WM_NOTIFY:
      begin
        if PNMHDR(Ptr(Message.lParam)).idFrom = IP_ADDRESS_ID then
        begin
          case PNMIPAddress(ptr(Message.lParam)).hdr.code of
          IPN_FIELDCHANGED:
             begin
                if SendMessage(HIPAddress, IPM_ISBLANK, 0, 0) = 0 then
                  SendMessage(HIPAddress, IPM_GETADDRESS, 0, lParam(LPDWORD(@FIPAddress)));
             end;
          end;
        end;
      end;
      WM_COMMAND:
      begin
       if Message.WParamLo = IP_ADDRESS_ID then
       case Message.WParamHi of
         EN_SETFOCUS:
         begin
           nField := SendMessage(HIPAddress, IPM_GETADDRESS, 0,lParam(LPDWORD(@FIPAddress)));
           if nField = 4 then nField := 0;
           SendMessage(HIPAddress, IPM_SETFOCUS, wParam(nField), 0);
         end;
         EN_KILLFOCUS:
         begin
           if SendMessage(HIPAddress, IPM_ISBLANK, 0, 0) = 0 then
             SendMessage(HIPAddress, IPM_GETADDRESS, 0, lParam(LPDWORD(@FIPAddress)));
         end;
         EN_CHANGE:
         begin
         end;
      end;
    end;
  end;
  if Assigned(PrevWndProc) then PrevWndproc(Message);
end;procedure Tipaddress.setipaddress(const value: string);
var
  ip : Integer;
  s : cardinal;
  t : string;
begin
  t:='';
  SendMessage(HIPAddress,IPM_GETADDRESS,0,Integer(@ip));
  s:=FIRST_IPADDRESS(ip);
  t:=t+inttostr(s);
  s:=SECOND_IPADDRESS(ip);
  t:=t+'.'+inttostr(s);
  s:=THIRD_IPADDRESS(ip);
  t:=t+'.'+inttostr(s);
  s:=FOURTH_IPADDRESS(ip);
  t:=t+'.'+inttostr(s);
  Fipaddr:=value;
end;end.

解决方案 »

  1.   

    主要是把自己的控件放在form上时,在form上显示的是TBevel控件,而不是window的ip地址设置的那中形式(192.168.0.1),如把全部代码放在form正常,封装后就不行了,我想应该是windows消息发的不正确,请高手指点
      

  2.   

    不要在Create里创建,而在CreateParams里修改类名与属性就行了
    procedure TChIPAddress.CreateParams(var Params: TCreateParams);
    begin
      inherited CreateParams(Params);
      CreateSubClass(Params, WC_IPADDRESS);
      with Params do
      begin
        Style := Style or WS_CHILD;
        WindowClass.style := WindowClass.style and not (CS_HREDRAW or CS_VREDRAW);
      end;
    end;procedure TChIPAddress.CreateWnd;
    begin
      //  ClearEditControls;
      FChanging := True;
      try
        inherited CreateWnd;
        FRange.Change(-1);
        if FSaveBlank then
          ClearAddress
        else
        begin
          Perform(IPM_SETADDRESS, 0, FAddress);
          FAddressValues.Address := FAddress;
        end;
      finally
        FChanging := False;
      end;
    end;
      

  3.   

    原因在于:CreateWindowEx这条语句。这语句不应该在构造的时候调用。,应该在继承:CreateWindowHandle方法中调用这个方法。原因很简单,因为构造的时候窗体的句柄还没有创建,而CreateWindowHande是在创建句柄后调用的。
      

  4.   

    二位的意思我知道了,刚才改了一下,还是不正确,问题依旧,请二位再具体点好么 !!CreateWindowHandle怎么定义啊,小弟感谢不尽
      

  5.   

    protected
      procedure CreateWindowHandle(const Params: TCreateParams); override;
    ...................
    procedure Tipaddress.CreateWindowHandle(const Params: TCreateParams);
    begin
        HIPAddress := CreateWindowEx(WS_EX_LEFT, WC_IPADDRESS, nil,
          WS_CHILD + WS_VISIBLE + WS_BORDER + WS_TABSTOP,
          self.Left, self.Top, self.Width, self.Height,
          self.HIPAddress , IP_ADDRESS_ID, HInstance, nil);
        // 这里能不能设置焦点我不确定,如果还有错,你把下面这个设置焦点的语句屏蔽
        SendMessage(HIPAddress, IPM_SETFOCUS, 0, 0);
    //  以下是TWinControl的代码,你可以参考一下
    //    with Params do
    //    FHandle := CreateWindowEx(ExStyle, WinClassName, Caption, Style,
    //      X, Y, Width, Height, WndParent, 0, WindowClass.hInstance, Param);
    end;
      

  6.   

    我有IP地址控件,要不要给你一个
    我的邮箱: [email protected]
      

  7.   

    好啊,谢谢了
    [email protected]