小弟想做个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.
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.
解决方案 »
- 请大家讨论一下:socket通信和ftp通信的优点与缺点;说得好的给分
- 数组的容量
- !!!!!谁知道怎么用Raize 的按钮做出“气泡”的提示框!!!????
- 使用杂志上介绍的代码并发售自己的软件是否对该杂志或该文章作者构成侵权?
- FieldDefs.Add的问题
- rspt 协议的文件用什么软件下载?
- 白白送分,用ADO连接*.dbf的表,需要什么样的“OLE DB 提供者”?
- 请问把表的UpdataRecordTypes属性设为rtInserted,我怎么找不到啊请问,怎么设请详细说明我在线等待多谢
- project在代码编辑器里面怎么时隐时现的
- DELPHI与WORD的结合,实现。。。。。。。。。。。。。。。。。
- 多人开发服务器端,如何协作
- 关于VCD的左右声道问题
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;
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;
我的邮箱: [email protected]
[email protected]