ip地址控件创建问题
小弟想做个ip地址控件,在from中调试通过,可封装成控件后,没有象windows的ip分格,请高手帮我看看,谢谢了,源代码如下:
unit ipaddress;
interface
uses
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;
implementation
uses 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.