Delphi自带的SpinEdit控件太丑了,自己写一个替换它

原创 2004年10月28日 15:03:00

unit UpDownEdit;<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

 

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.

 

 

 

Delphi中注册自定义控件

Delphi提供了丰富的VCL组件供编程人员使用,同时还允许编程人员根据实际需要进行自定义组件的编写。 组件的代码编写和我们平常写的类很相似,但也有几点不同,一个是需要从TComponent类继...
  • lwsas1
  • lwsas1
  • 2014年08月01日 17:04
  • 1506

DELPHI下自定义包的作用,开发以及包文件的安装配置位置

From:http://www.cnblogs.com/dingjie/articles/199136.html 充分发挥包的作用 本章要点: n        为何要用包 n...
  • ksrsoft
  • ksrsoft
  • 2013年06月23日 09:38
  • 1413

DELPHI 中 Window 消息大全使用详解

Window 消息大全使用详解 导读:    Delphi是Borland公司的一种面向对象的可视化软件开发工具。 Delphi集中了Visual C++和Visual Basic两者的优点:...
  • zang141588761
  • zang141588761
  • 2016年05月19日 08:53
  • 1894

Delphi如何检测Form的移动和调整尺寸事件

http://delphi.about.com/od/adptips2005/qt/formmovenotify.htm
  • MaxWoods
  • MaxWoods
  • 2014年05月19日 20:46
  • 3356

Delphi中实现可以更改大小的对话框

关键字:Dialog、对话框、resizable1、问题的提出问题来自Stanley_Xu,希望得到只有关闭按钮(还可以有帮助),左上也没有程序的图标并且能够更改窗口大小的对话框。VCL中为TForm...
  • CathyEagle
  • CathyEagle
  • 2005年04月11日 13:33
  • 9524

Windows窗体原理及控件重绘技巧

之前有学MFC的同学告诉我觉得Windows的控件重绘难以理解,就算重绘成功了还是有些地方不明白,我觉得可能很多人都有这样的问题,在这里我从Windows窗体的最基本原理来讲解,如果你有类似的疑惑希望...
  • zxxSsdsd
  • zxxSsdsd
  • 2015年10月16日 11:03
  • 911

Delphi7简单DirectUI界面源码

界面效果 源码下载: http://download.csdn.net/detail/cometnet/5687875 unit CometSkin; interface uses ...
  • CometNet
  • CometNet
  • 2013年07月02日 18:07
  • 35951

spinEdit 限制只能输入非负值

private void spinEdit1_EditValueChanging(object sender, DevExpress.XtraEditors.Controls.ChangingEven...
  • maozhu_yimi
  • maozhu_yimi
  • 2011年08月12日 14:16
  • 2703

Delphi组件属性

Delphi组件属性作者:邹飞E-mail:zouf.tech@ATechSoft.comHomepage:http://www.atechsoft.com/people/zouf/注:本文讨论对于D...
  • zoufeiyy
  • zoufeiyy
  • 2003年11月09日 22:55
  • 1506

Delphi自定义部件开发(4)

创建图形部件  图形控制是一类简单的部件。因为纯图形部件从不需要得到键盘焦点,所以它没有也不要窗口句柄。包含图形控制的应用程序用户仍然可以用鼠标操作控制,但没有键盘界面。   在本例中提供的图形部...
  • lee576
  • lee576
  • 2008年04月10日 14:43
  • 710
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Delphi自带的SpinEdit控件太丑了,自己写一个替换它
举报原因:
原因补充:

(最多只允许输入30个字)