unit UpDownEdit;
interface
uses
Windows, SysUtils, Classes, Controls, StdCtrls, ComCtrls, Messages;
type
TUpDownEdit =
class(TCustomControl)
private
{ Private declarations }
UpDown: TUpDown;
Edit: TEdit;
FMin: Integer;
FMax: Integer;
FOnChange: TNotifyEvent;
FPosition: Integer;
procedure WMSize(
var Msg: TWMSize);
message wm_Size;
procedure SetMax(
const Value: Integer);
procedure SetMin(
const Value: Integer);
procedure EditChange(Sender: TObject);
procedure EditKeyPress(Sender: TObject;
var Key: Char);
procedure UpDownClick(Sender: TObject; Button: TUDBtnType);
procedure SetPosition(
const Value: Integer);
protected
{ Protected declarations }
public
{ Public declarations }
constructor Create(AOwner: TComponent);
override;
destructor Destroy;
override;
published
{ Published declarations }
property Max: Integer
read FMax
write SetMax;
property Min: Integer
read FMin
write SetMin;
property Position: Integer
read FPosition
write SetPosition;
property OnChange: TNotifyEvent
read FOnChange
write FOnChange;
end;
procedure Register;
implementation
procedure Register;
begin
RegisterComponents('Standard', [TUpDownEdit]);
end;
{ TUpDownEdit }
constructor TUpDownEdit.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
SetBounds(0, 0, 57, 21);
Edit := TEdit.Create(Self);
Edit.Left := 0;
Edit.Top := 0;
Edit.Width := 40;
Edit.Align := alLeft;
Edit.Parent := self;
Edit.Text := '0';
// SetWindowLong(Edit.Handle, GWL_STYLE, GetWindowLong(Edit.Handle, GWL_STYLE) or ES_NUMBER);
UpDown := TUpDown.Create(self);
UpDown.Height := Height;
//20;
UpDown.Width := 14;
UpDown.Left := Edit.Width + 1;
UpDown.Parent := self;
FMin := 0;
FMax := 100;
Edit.OnChange := EditChange;
Edit.OnKeyPress := EditKeyPress;
UpDown.OnClick := UpDownClick;
end;
destructor TUpDownEdit.Destroy;
begin
Edit.Free;
UpDown.Free;
inherited;
end;
procedure TUpDownEdit.EditChange(Sender: TObject);
begin
UpDown.Position := StrToIntDef(Edit.Text, 0);
FPosition := UpDown.Position;
if Assigned(FOnChange)
then
FOnChange(Self);
end;
procedure TUpDownEdit.EditKeyPress(Sender: TObject;
var Key: Char);
var
s:
set of char;
i: integer;
Str, Text:
string;
begin
s := [#8, '0'..'9'];
if Key = #8
then exit;
if not (Key
in s)
then
begin
Key := #0;
Exit;
end;
//控制輸入數字的大小
if TEdit(Sender).SelLength > 0
then
begin
Text := TEdit(Sender).Text;
Str := Copy(Text, 1, TEdit(Sender).SelStart - 1)
+ Key +
Copy(Text, TEdit(Sender).SelStart + TEdit(Sender).SelLength + 1, Length(Text));
i := StrToInt(Str);
if i > FMax
then
begin
Key := #0;
Exit;
end;
end
else
if StrToInt(TEdit(Sender).Text + Key) > FMax
then
begin
Key := #0;
Exit;
end
else
if StrToInt(TEdit(Sender).Text + Key) < FMin
then
begin
Key := #0;
Exit;
end;
end;
procedure TUpDownEdit.SetMax(
const Value: Integer);
begin
FMax := Value;
UpDown.Max := FMax;
if StrToIntDef(Edit.Text, 0) > FMax
then
begin
UpDown.Position := FMax;
Edit.Text := IntToStr(FMax);
FPosition := UpDown.Position;
end;
end;
procedure TUpDownEdit.SetMin(
const Value: Integer);
begin
FMin := Value;
UpDown.Min := FMin;
if StrToIntDef(Edit.Text, 0) < FMin
then
begin
UpDown.Position := FMin;
Edit.Text := IntToStr(FMin);
FPosition := UpDown.Position;
if Assigned(FOnChange)
then
FOnChange(Self);
end;
end;
procedure TUpDownEdit.SetPosition(
const Value: Integer);
begin
if (Value >= FMin)
or (Value <= FMax)
then
begin
FPosition := Value;
UpDown.Position := FPosition;
Edit.Text := IntToStr(FPosition);
if Assigned(FOnChange)
then
FOnChange(Self);
end;
end;
procedure TUpDownEdit.UpDownClick(Sender: TObject; Button: TUDBtnType);
begin
if Max = 0
then
begin
Max := 100;
UpDown.Max := Max;
end;
UpDown.Min := Min;
Edit.Text := IntToStr(UpDown.Position);
Edit.SetFocus;
Edit.SelectAll;
if Assigned(FOnChange)
then
FOnChange(Self);
FPosition := UpDown.Position;
end;
procedure TUpDownEdit.WMSize(
var Msg: TWMSize);
begin
Edit.Width := Width - 15;
UpDown.Left := Edit.Width + 1;
UpDown.Height := Height;
inherited;
end;
end.