全部源码,LZ慢慢研究吧: 一: unit U_zwLabeledEdit; interface uses SysUtils, Classes, Controls, StdCtrls, ExtCtrls, Windows, Messages, Graphics; type TzwInputType = (itNormal, itNumberic, itMoney); TzwLabeledEdit = class(TLabeledEdit) private { Private declarations } FInputType: TzwInputType; FOnChangeEVT: TNotifyEvent; FOnExitEVT: TNotifyEvent; FOnEnterEVT: TNotifyEvent; FEnterColor, FExitColor: TColor; function getTrimEmpty: Boolean; function getTrimText: string; function getInputEmpty: Boolean; protected { Protected declarations } public constructor Create(Aowner: TComponent); override; procedure EVT_Onchange(sender: TObject); procedure EVT_OnExit(sender: TObject); procedure EVT_OnEnter(sender: TObject); { Public declarations } published property IsTrimEmpty: Boolean read getTrimEmpty; property InputIsEmpty: Boolean read getInputEmpty; property InputType: TzwInputType read FInputType write FInputType; property TrimText: string read getTrimText; property OnChangeEVT: TNotifyEvent read FOnChangeEVT write FOnChangeEVT; property OnExitEVT: TNotifyEvent read FOnExitEVT write FOnExitEVT; property OnEnterEVT: TNotifyEvent read FOnEnterEVT write FOnEnterEVT; property Color_Enter: TColor read FEnterColor write FEnterColor; property Color_Exit: TColor read FExitColor write FExitColor; { Published declarations } end; procedure Register; implementation procedure Register; begin RegisterComponents('zwPubComps', [TzwLabeledEdit]); end; { TzwLabeledEdit } function StrIsNumberic(str: string): Boolean; var tmp: Extended; begin Result := TryStrToFloat(str, tmp); end; function StrIsFenNumber(str: string; ACanBeNegative: Boolean): Boolean; begin Result := True; if StrIsNumberic(str) = False then Result := False else begin if not ACanBeNegative then begin if StrToFloat(str) < 0 then begin Result := False; Exit; end; end; try StrToInt64(FloatToStr(StrToFloat(str) * 100)); except on e: Exception do Result := False; end; end; end;constructor TzwLabeledEdit.Create(Aowner: TComponent); begin inherited; LabelPosition := lpLeft; Color_Enter := Color; Color_Exit := Color; OnChange := EVT_Onchange; if Tag >= 0 then begin OnExit := EVT_OnExit; OnEnter := EVT_OnEnter; end; end; procedure TzwLabeledEdit.EVT_Onchange(sender: TObject); var position: Integer; begin case FInputType of itNormal: ; itNumberic: begin with TLabeledEdit(sender) do begin if TrimText <> '' then begin position := Pos('.', Text); if position > 0 then begin Text := Copy(Text, 1, position + 2); SendMessage(Handle, EM_SETSEL, 10000, 10000); end; position := Pos('e', Text); if position > 0 then begin Text := Copy(Text, 1, Length(Text) - 1); SendMessage(Handle, EM_SETSEL, 10000, 10000); end; if not StrIsNumberic(Text) then begin Text := Copy(Text, 1, Length(Text) - 1); SendMessage(Handle, EM_SETSEL, 10000, 10000); end; end; end end; itMoney: begin with TLabeledEdit(sender) do begin if TrimText <> '' then begin position := Pos('.', Text); if position > 0 then begin Text := Copy(Text, 1, position + 2); SendMessage(Handle, EM_SETSEL, 10000, 10000); end; position := Pos('e', Text); if position > 0 then begin Text := Copy(Text, 1, Length(Text) - 1); SendMessage(Handle, EM_SETSEL, 10000, 10000); end; if not StrIsFenNumber(Text, False) then begin Text := Copy(Text, 1, Length(Text) - 1); SendMessage(Handle, EM_SETSEL, 10000, 10000); end; end; end; end;
end; if Assigned(FOnChangeEVT) then FOnChangeEVT(sender); end; procedure TzwLabeledEdit.EVT_OnEnter(sender: TObject); begin Color := FEnterColor; if Assigned(FOnEnterEVT) then FOnEnterEVT(sender); end; procedure TzwLabeledEdit.EVT_OnExit(sender: TObject); begin Color := FExitColor; if Assigned(FOnExitEVT) then FOnExitEVT(sender); end; function TzwLabeledEdit.getInputEmpty: Boolean; begin if TrimText = '' then begin Result := True; MessageBox(GetActiveWindow, PChar('请输入' + EditLabel.Caption), '提示', MB_ICONWARNING or MB_OK); try Self.SetFocus except Exit; end; end else Result := False; end; function TzwLabeledEdit.getTrimEmpty: Boolean; begin if TrimText = '' then Result := True else Result := False; end; function TzwLabeledEdit.getTrimText: string; begin Result := Trim(TLabeledEdit(Self).Text); end; end.
,给你写成了类,没有注册组件。如果想写组件,跟这个类大致思路基本上一样,找本书看看吧unit Unit1;interfaceuses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls;type
tmypanel = class(TPanel) //自定义的panel,包含两个按钮,当按钮点击的时候,显示按钮的名称和位置
public
bt : TButton;
le : TLabeledEdit;
procedure MybtnClick(sender : TObject);
constructor Create(AOwner: TComponent); override; end;
TForm1 = class(TForm)
Panel1: TPanel;
Button1: TButton;
Button2: TButton;
Button3: TButton;
LabeledEdit1: TLabeledEdit;
procedure FormCreate(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
public end;var
Form1: TForm1;
a : tmypanel;implementation{$R *.dfm}procedure TForm1.FormCreate(Sender: TObject);
beginend;{ tmypanel }constructor tmypanel.Create(AOwner: TComponent);
begin
inherited;
Self.Width := 500;
Self.Height := 300;
le := TLabeledEdit.Create(nil);
le.Parent := Self;
le.Left := 0;
le.Top := 100;
le.Width := 100;
le.EditLabel.Caption := '帐号';
le.Text := '1234'; bt := TButton.Create(nil);
bt.Parent := Self;
bt.Top := 100;
bt.Left := 130;
bt.Caption := '按钮';
bt.OnClick := MybtnClick;
end;procedure tmypanel.MybtnClick(sender: TObject);
begin ShowMessage(Format('帐号:%s',[Self.le.Text]) );
end;procedure TForm1.Button1Click(Sender: TObject);
begin
a := tmypanel.Create(nil);
a.Parent := Form1;
a.Left := 20;
a.Top := 20;
end;procedure TForm1.Button2Click(Sender: TObject);
begin
a.Free;
end;end.
一: unit U_zwLabeledEdit;
interface
uses
SysUtils, Classes, Controls, StdCtrls, ExtCtrls, Windows, Messages, Graphics;
type
TzwInputType = (itNormal, itNumberic, itMoney);
TzwLabeledEdit = class(TLabeledEdit)
private
{ Private declarations }
FInputType: TzwInputType;
FOnChangeEVT: TNotifyEvent;
FOnExitEVT: TNotifyEvent;
FOnEnterEVT: TNotifyEvent;
FEnterColor,
FExitColor: TColor;
function getTrimEmpty: Boolean;
function getTrimText: string;
function getInputEmpty: Boolean;
protected
{ Protected declarations }
public
constructor Create(Aowner: TComponent); override;
procedure EVT_Onchange(sender: TObject);
procedure EVT_OnExit(sender: TObject);
procedure EVT_OnEnter(sender: TObject);
{ Public declarations }
published
property IsTrimEmpty: Boolean read getTrimEmpty;
property InputIsEmpty: Boolean read getInputEmpty;
property InputType: TzwInputType read FInputType write FInputType;
property TrimText: string read getTrimText;
property OnChangeEVT: TNotifyEvent read FOnChangeEVT write FOnChangeEVT;
property OnExitEVT: TNotifyEvent read FOnExitEVT write FOnExitEVT;
property OnEnterEVT: TNotifyEvent read FOnEnterEVT write FOnEnterEVT;
property Color_Enter: TColor read FEnterColor write FEnterColor;
property Color_Exit: TColor read FExitColor write FExitColor;
{ Published declarations }
end;
procedure Register;
implementation
procedure Register;
begin
RegisterComponents('zwPubComps', [TzwLabeledEdit]);
end;
{ TzwLabeledEdit }
function StrIsNumberic(str: string): Boolean;
var
tmp: Extended;
begin
Result := TryStrToFloat(str, tmp);
end;
function StrIsFenNumber(str: string; ACanBeNegative: Boolean): Boolean;
begin
Result := True;
if StrIsNumberic(str) = False then
Result := False
else begin
if not ACanBeNegative then begin
if StrToFloat(str) < 0 then begin
Result := False;
Exit;
end;
end;
try
StrToInt64(FloatToStr(StrToFloat(str) * 100));
except
on e: Exception do
Result := False;
end;
end;
end;constructor TzwLabeledEdit.Create(Aowner: TComponent);
begin
inherited;
LabelPosition := lpLeft;
Color_Enter := Color;
Color_Exit := Color;
OnChange := EVT_Onchange;
if Tag >= 0 then begin
OnExit := EVT_OnExit;
OnEnter := EVT_OnEnter;
end;
end;
procedure TzwLabeledEdit.EVT_Onchange(sender: TObject);
var
position: Integer;
begin
case FInputType of
itNormal: ;
itNumberic: begin
with TLabeledEdit(sender) do begin
if TrimText <> '' then begin
position := Pos('.', Text);
if position > 0 then begin
Text := Copy(Text, 1, position + 2);
SendMessage(Handle, EM_SETSEL, 10000, 10000);
end;
position := Pos('e', Text);
if position > 0 then begin
Text := Copy(Text, 1, Length(Text) - 1);
SendMessage(Handle, EM_SETSEL, 10000, 10000);
end;
if not StrIsNumberic(Text) then begin
Text := Copy(Text, 1, Length(Text) - 1);
SendMessage(Handle, EM_SETSEL, 10000, 10000);
end;
end;
end
end;
itMoney: begin
with TLabeledEdit(sender) do begin
if TrimText <> '' then begin
position := Pos('.', Text);
if position > 0 then begin
Text := Copy(Text, 1, position + 2);
SendMessage(Handle, EM_SETSEL, 10000, 10000);
end;
position := Pos('e', Text);
if position > 0 then begin
Text := Copy(Text, 1, Length(Text) - 1);
SendMessage(Handle, EM_SETSEL, 10000, 10000);
end; if not StrIsFenNumber(Text, False) then begin
Text := Copy(Text, 1, Length(Text) - 1);
SendMessage(Handle, EM_SETSEL, 10000, 10000);
end;
end;
end;
end;
end;
if Assigned(FOnChangeEVT) then
FOnChangeEVT(sender);
end;
procedure TzwLabeledEdit.EVT_OnEnter(sender: TObject);
begin
Color := FEnterColor;
if Assigned(FOnEnterEVT) then
FOnEnterEVT(sender);
end;
procedure TzwLabeledEdit.EVT_OnExit(sender: TObject);
begin
Color := FExitColor;
if Assigned(FOnExitEVT) then
FOnExitEVT(sender);
end;
function TzwLabeledEdit.getInputEmpty: Boolean;
begin
if TrimText = '' then begin
Result := True;
MessageBox(GetActiveWindow, PChar('请输入' + EditLabel.Caption), '提示', MB_ICONWARNING or MB_OK);
try
Self.SetFocus
except
Exit;
end;
end
else
Result := False;
end;
function TzwLabeledEdit.getTrimEmpty: Boolean;
begin
if TrimText = '' then
Result := True
else
Result := False;
end;
function TzwLabeledEdit.getTrimText: string;
begin
Result := Trim(TLabeledEdit(Self).Text);
end;
end.