请教:继承一个 Edit 控件出现的问题(50分)

  • 主题发起人 主题发起人 iCANK
  • 开始时间 开始时间
I

iCANK

Unregistered / Unconfirmed
GUEST, unregistred user!
我想继承一个 Edit 控件 TEditExt,遇到了下面的问题:

1.我想控件放到窗口上,控件的 Text 属性为空,用下面的代码:

constructor TEditExt.Create(AOwner: TComponent);
begin
inherited;

Text := ''; //这里没起作用
end;

并没有起作用。不知道 Text 属性是不是不能为空。

2.我有这样的想法:TEditExt 有个 CanInputChar 的成员
private
FCanInputChar: array of char;
published
property CanInputChar: string
read GetCanInputChar
write SetCanInputChar;

SetCanInputChar 函数的功能是把 CanInputChar 里输入的字符串一个一个读入 FCanInputChar 的数组里。


procedure TEditExt.KeyPress(var Key: Char);
begin
inherited KeyPress(Key);
if not (Key in ['0'..'9', Chr(8)]) then //这里可以。
//if not (Key in FCanInputChar) then //但我想用 FCanInputChar 就不行了。
Key := #0;
.......
end;

上面这段程序应该怎么写呢?就是如果 Key 不在 FCanInputChar 这个数组里,Key := #0
 
procedure loaded;override;
procedure TTEditExt.loaded;
begin
inherited;
Text := '';
end;
 
2.
你的FCanInputChar是数组,['0'..'9', Chr(8)] 是集合,In得用集合,所以你的用法不对
 
继承loaded恐怕不行吧。 这样只有第二次打开上次的设计时才会将text清空, 第一次放的时候还会有字在里面的。
还不如继承setparent呢:
procedure SetParent(AParent: TWinControl); override;

procedure TEditExt.SetParent(AParent: TWinControl);
begin
inherited;
if not csLoading in ComponentState then
Text := '';
end;

不过我记得还有一种方法的, 好象是override哪个方法设置某个设计器开关。 忘了怎么做了。

听课...
 
谢谢。
Shuzi:
那应该怎么做呢?
假如 CanInputChar := '0123456789';
则 FCanInputChar := {0,1,2,3,4,5,6,7,8,9};
怎么样用 in 来判断呢?
如果不可以,应该怎么做才能实现呢?
 
你的FCanInputChar就定义为String得了,然后在KeyPress这样写:
type
TCanInputChar=set of char;

procedure TEditExt.KeyPress(var Key: Char);
function GetCanInputCharSet:TCanInputChar;
var i:Integer;
begin
Result:=[];
for i:=1 to Length(FCanInputChar) do
Include(Result,FCanInputChar);
end;
begin
inherited KeyPress(Key);
if not (Key in GetCanInputCharSet) then
.......
end
 
....
for i := 0 to high(FCanInputChar) do
if key = FCanInputChar then Exit;
Key := #0;

或者一种好看的方法:
if pos(key, CanInputChar)<=0 then Key := #0;
 
知道了,谢谢大家!
:)
 
后退
顶部