我想改写TEDIT组件,请高手帮忙!

骑牛上铂金 2010-12-21 09:24:51
我想从Tedit组件派生个子类,要实现的功能:每输入四位数后自动加一空格并只能输入数字 如:3080 5300 2202

要如何实现呀?
以前自己没写过控件,想学习学习!
...全文
187 16 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
dyf2001 2010-12-29
  • 打赏
  • 举报
回复
TMaskEdit就可以了,设置属性EditMask = 0000\ 0000\ 0000;1;_
阿发伯 2010-12-25
  • 打赏
  • 举报
回复
使用TMaskEdit试试:

MaskEdit1.EditMask := '0000 0000 0000;1;_';
lowery 2010-12-25
  • 打赏
  • 举报
回复
我是觉得这么一点小小的功能,没必要整理出一个控件,完全可以写一小段代码去处理掉就可以了,再说了,现在cx系列的控件,很多这种类似的组件,完全可以实现的功能,我们自己封装,耗费的时间可能会很多,不划算,出来的效果还未必很好,现有的三方插件,可以多利用一下,不过学学组件的制作也是一个有意思的事情,呵呵
lowery 2010-12-25
  • 打赏
  • 举报
回复
我写过一个把Edit变为只能输入数字的代码,在KeyPress里面,然后你在修改一下,比如
加入一个函数IsModeThree(***):Boolean,用来判断是否需要加空格。敲入key的时候,判断是不是length是不是整除3,要是,就加一个空格,以前去掉字母,只要数字的代码如下:
procedure Tu_ProSubfrm.cxProSubMoney1KeyPress(Sender: TObject;
var Key: Char);
function CheckSery:Boolean; //判断是否有权限修改经费
begin
Result := False;

end;
function GetSubStrCount(iChar,iText:string):Integer;
var
i,iNumber:Integer;
begin
iNumber := 0;
for i:=1 to Length(iText) do
begin
if iText[i]=iChar then
Inc(iNumber);
end;
Result := iNumber;
end;
begin
if (not CheckSery) and (iState=1) then
begin
MsgHint.ShowWarning('您没有权限修改已经落实好的经费计划');
Key := #0;
Exit
end else
case key of
'0':
begin
If Length(Trim(TcxTextEdit(Sender).Text))=0 then key := #0;
end;
'1'..'9':;
'.':
if GetSubStrCount('.',Trim(TcxTextEdit(Sender).Text))>0 then Key := #0;
#8,#13: ;
else key := #0;
end;
inherited KeyPress(key);
end;
骑牛上铂金 2010-12-24
  • 打赏
  • 举报
回复
自己搞了些代码,能实现每四位数字后自动添加一空格,请指教!
unit Ex_Edit;

interface
uses Messages,StdCtrls,Classes,SysUtils;
type TEx_Edit=class(TCustomEdit)
private
FIfChange:Boolean;
protected
procedure Change;override;
public
constructor Create(AOwner: TComponent);override;
published
property Text;
property Font;

end;
procedure Register;
implementation
procedure Register;
begin
Registercomponents('Nxl',[TEx_Edit]);
end;
{ TEx_Edit }

procedure TEx_Edit.Change;
var i:Integer; SrcText,DecText:String;
begin
if FIfChange then
begin
FIfChange:=False;
DecText:='';SrcText:=StringReplace(trim(Text),' ','',[rfReplaceAll]);
clear;
for I := 1 to Length(SrcText) do
if ((i mod 4)=0) then DecText:=DecText+SrcText[i]+' ' else DecText:=DecText+SrcText[i];
Text:=Trim(DecText);
SelStart:=Length(DecText);
FIfChange:=true;
end;

inherited Change;
end;

constructor TEx_Edit.Create(AOwner: TComponent);
begin
inherited;
FIfChange:=True;
end;

end.
xinghun61 2010-12-22
  • 打赏
  • 举报
回复
其实直接在OnKeyPress中就可以做到,判断Key参数是否有效,无效则设为#0。
不过,想封装到子类中,下面是一点点思路(未测试):
1. 从TCustomEdit继承,原因是在published中声明的属性会在属性编辑器中显示出来,而TEdit声明了太多没用的属性
2. 重写WMChar函数,其格式为procedure WMChar(var Message: TWMChar); message WM_CHAR;(这个是消息响应函数,可对输入的字符进行处理,在这里结合SelStart和SelLength来判断输入位置)
3. 如果输入无效,则将Message的CharCode设为#0,具体代码可模仿TWinControl的DoKeyPress函数来实现
4. 通过调用RegisterComponent函数,可以将这个类注册成组件,方便后续的使用
YLCN2010 2010-12-22
  • 打赏
  • 举报
回复
[Quote=引用楼主 n29882942 的回复:]
我想从Tedit组件派生个子类,要实现的功能:每输入四位数后自动加一空格并只能输入数字 如:3080 5300 2202

要如何实现呀?
以前自己没写过控件,想学习学习!
[/Quote]
这种功能差异性不是很大,没必要自己写控件,直接在相应的事件中处理下就可以了。
骑牛上铂金 2010-12-22
  • 打赏
  • 举报
回复
哪位仁兄能给出关键的代码呀,我想以控件的模式把两个功能封装起来,谢谢!
youcunzai 2010-12-22
  • 打赏
  • 举报
回复
还要考虑粘贴!还有拖放过来的信息
风之谷 2010-12-22
  • 打赏
  • 举报
回复
写学习些控件的话,结成customedit 的 text属性 的 onsettext(COnst value:String)事件

加入自己的代码就可以了
风之谷 2010-12-22
  • 打赏
  • 举报
回复
onchange事件里处理不是很好?

1234455645654645645;

代码里面处理成1234 4556 4567 4645 5645

onkeypress事件里只允许输入数字
骑牛上铂金 2010-12-22
  • 打赏
  • 举报
回复
主要是想学习下如何写控件
「已注销」 2010-12-22
  • 打赏
  • 举报
回复
我也觉得,直接判断change事件看看呢
亮剑_ 2010-12-21
  • 打赏
  • 举报
回复
至少得从TCustomEdit继承下来

5,928

社区成员

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

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