控件制作的问题,附原码。望大家来看看

lastshrill 2001-05-11 09:34:00
我在网上找到一篇做IP地址输入的控件,改了一下,但运行时会影响我的主From
上的字体,和按钮的的大小,这该怎么办呢?
原码如下,望作者不告我侵权

//文件名:IPEdit.PAS

// IP address edit control for Borland Delphi 5


unit IPEDIT;
interface
uses Windows, Messages, SysUtils, Classes,
Forms, Controls, ComCtrls, CommCtrl;


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

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

TIPEdit = class(TWinControl)
private

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 GetIPText:string;

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
//property Font;


//判断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;
//IP地址值(32位整数LongWord)
property IPText: string read GetIPText;

//事件属性
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


{~~~~~~~~~~~~~~~~~~~~~~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;
end;
FIP:=0;
Height:= 22;
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;
var
i:LongWord;
begin
FCreating := True;
try
inherited CreateWnd;
i:=MAKEIPADDRESS(FFields[0], FFields[1], FFields[2], FFields[3]);
SendMessage(Handle, IPM_SETADDRESS, 0, i);
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
//不可以调用父控件的此方法
//否则,控件不能正常工作
inherited;
if NewStyleControls and
(GetWindowLong(Handle, GWL_STYLE) and ES_MULTILINE = 0) then
SendMessage(Handle, EM_SETMARGINS, EC_LEFTMARGIN or EC_RIGHTMARGIN, 0);
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
if pNM^.iValue in [0..255] then
FFields[pNM^.iField]:=pNM^.iValue
else MessageBeep(MB_ICONASTERISK);
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('IPEDIT', [TIPEdit]);
end;

function TIPEdit.GetIPText: string;
var
s:string;
begin
s:=inttostr(FFields[0])+'.'+inttostr(FFields[1])+'.'+inttostr(FFields[2])+'.'+inttostr(FFields[3]);
if s='0.0.0.0' then
result:=''
else result:=s;
end;

end.

实际上我就想得到IPText, 可不要别的功能.我初学做控件,原码我有点不懂,请将清楚
大伙们帮我试试

...全文
56 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
yicw 2001-05-11
  • 打赏
  • 举报
回复
我研究一下先
lastshrill 2001-05-11
  • 打赏
  • 举报
回复
CSDN没人能做控件吗?
lastshrill 2001-05-11
  • 打赏
  • 举报
回复
没有人看吗?
lastshrill 2001-05-11
  • 打赏
  • 举报
回复
to :yicw(无奈) 
有结果吗?
我刚在Delphi深度历险下了两个这样的控件,有一个和我的效果一样,另一个
编译出错,你可以看一下,先谢谢你

5,391

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧