只能输入数字的控件SZEDIT(50分)

  • 主题发起人 主题发起人 wjshh
  • 开始时间 开始时间
W

wjshh

Unregistered / Unconfirmed
GUEST, unregistred user!
我做了一只能输入数字的控件SZEDIT,
现有几个问题希望大家帮助解决。
1.如何改变TEXT的默认值(在将控件放入窗体后,text的值为Edit1,如何改为0)。
2.如何对输入的数字进行格式化(即1,234,567.89)。在引用该值时可转化为FLOAT或INT类型。
3.如何控制光标在文本框中的位置。
 
inherited create;
 
参考如下控件
TEditN, TMEditN, TDBEditN

- First Author : Jose Maria Gias
- email : sigekom@arrakis.es
- Version : 2.4 Delphi 2-3-4
- Date : 08/04/1999
- Type : FreeWare
 
1.重构Text不行吗?
 
请说详细些。
 
public
property text read ... write .... defaule 0;
 
public
property text read ... write .... default 0;
 
1, constructor create中设置
2,分析字符串,把","去掉,然后再StrtoFloat, strtoint
 
1、在 Create 方法中这样设置:
inherited Create(AOwner);
ControlStyle := ControlStyle - [csSetCaption];
Text := '0';
2、在用户编辑时使用 FormatFloat 格式化他输入的数值,
3、SelStart 属性可以控制光标的位置。
 
bbkxjy:
在Change事件中使用 FormatFloat 格式化输入的数值会造成死循环。
能否给一个实例,谢谢。
 
是的,直接 Text := 'xx' 会死循环,试试这样修改 Text 行不行:

var
Str : string;
begin

Str := FormatFloat('00.00', StrToFloat(Text));//转换,这里的格式只是举例
Perform(WM_SETTEXT, 0, LongInt(PChar(Str)); //发消息设置 Text 属性
...
//做其它事情
end;
 
bbkxjy:
我在Change事件中使用我你说的方法可还死循环。
能否再给一个详细实例,谢谢
 
bbkxjy:
我在Change事件中使用了你说的方法可还是死循环。
是否不写在Change这里。
能否给一个详细实例,谢谢。
 
wjshh:
你应该重载TEdit 的 Change 成员过程,然后在这个重载的过程中加上上面的那段代码。

TSZEdit = Class(TEdit)
...
protected
procedure Change; override;
...
end;
...
implementation
...
procedure TSZEdit.Change;
var
Str : string;
begin

Str := FormatFloat('00.00', StrToFloat(Text));//转换,这里的格式只是举例
Perform(WM_SETTEXT, 0, LongInt(PChar(Str)); //发消息设置 Text 属性
...
//做其它事情
inherited Change;
end;

而不是在 SZEdit 的 Change 事件中写上面的代码。请再试试?
 
bbkxjy:
我试了不行,我的代码如下望帮助改一下谢谢。
unit Szedit1;
interface
uses
SysUtils, WinTypes, WinProcs, Messages, Classes, Graphics, Controls,
Forms, Dialogs, StdCtrls;

type
TSzedit = class(TEdit)
private

protected
procedure KeyPress(var Key: Char); override;
procedure Change; override;
Constructor Create(AOwner: TComponent); override;

public

published

end;

procedure Register;

implementation

Constructor TSZEdit.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
ControlStyle := ControlStyle - [csSetCaption];
Text := '0';
end;

procedure TSZEdit.Change;
var
Str : string;
begin
Str := FormatFloat('00.00', StrToFloat(Text));//转换,这里的格式只是举例
Perform(WM_SETTEXT, 0, LongInt(PChar(Str))); //发消息设置 Text 属性
inherited Change;
end;

procedure Register;
begin
RegisterComponents('Standard', [TSzedit]);
end;

procedure TSzedit.KeyPress(var Key: Char);
begin
if key=#8 then exit;
if not (key in['0'..'9']) then
begin
key:=#0;
MessageBeep(0);
end;
end;
end.
 
为什么不用dbedit,好象都满足你说的3点要求,而且是现成的
 
暂时只能用成员变量做标记来避免Change的重入:
TSzedit = class(TEdit)
private
FChanging: Boolean; //标记
protected
...
procedure Change; override;
...
end;

implememtation
...
procedure TSZEdit.Change;
var
Str : string;
Cur: Integer;
begin
if Not FChanging then
begin
FChanging := True;
Str := FormatFloat('00.00', StrToFloat(Text));
Perform(WM_SETTEXT, 0, LongInt(PChar(Str)));
FChanging := False;
inherited Change;
end;
end;
或者可以选择在 KeyDown 或 KeyPress 事件中格式化 Text,我查了一些实现类似功能的
Free 控件的代码,大多是在这两个事件中修改 Text 的。
有一点,Create 方法一般是 Public 的,你的是 Protected 的?
 
zgdtxf
我主要是想自己学着做。
dbedit那有?
 
谢谢大家的帮助
 
多人接受答案了。
 
后退
顶部