组合控件问题(100分)

  • 主题发起人 主题发起人 hzjzxp
  • 开始时间 开始时间
H

hzjzxp

Unregistered / Unconfirmed
GUEST, unregistred user!
我现在用到一个年月格式的编辑框一时没找到合适的控件,所以自己就写了个
用MaskEdit和UPDown组合,但是现在遇到一个问题就是我无法处理UPDown的Click事件
MaskEditEx = class(TMaskEdit)
private
FUpDown : TUpDown;
FOnUpDownClick: TUDClickEvent;
protected
public
constructor Create(AOwner: TComponent);
override;
destructor Destroy;
override;
published
property OnUpDownClick:TUDClickEvent read FOnUpDownClick write FOnUpDownClick;
end;

procedure Register;
implementation
{ MaskEditEx }
constructor MaskEditEx.Create(AOwner: TComponent);
begin
inherited;
FUpDown := TUpDown.Create(Self);
FUpDown.OnClick := FOnUpDownClick;
FUpDown.Parent := Self;
FUpDown.Align := alRight;
Self.EditMask := '!9999/99;1;_';
Self.Text := Copy(DateToStr(Now),1,7);
end;

destructor MaskEditEx.Destroy;
begin
FUpDown.Free;
inherited;
end;

我在写设计期间的OnUpDownClick代码,MaskEditEx里面的内容无有任何变化,请问大家有谁知道为什么?
 
晕 这样当然不行了,你看看from的dfm文件就知道了
运行后首先要创建控件,这时候会执行create部分,可是这时候你的FOnUpDownClick值仍然为nil啊,所以对应你控件里的TUpDown的onclick事件仍然没有对应的响应代码
在控件创建完毕后才会把你在设计阶段写的OnUpDownClick事件代码赋值给FOnUpDownClick;
这时候create过程已经执行完了,所以虽然你写了事件代码但是却没有赋值给TUpDown
你可以在控件里先写一个响应事件,然后在这个事件里再去响应设计阶段写的事件代码
修改如下:
type
MaskEditEx = class(TMaskEdit)
private
FUpDown : TUpDown;
FOnUpDownClick: TUDClickEvent;
procedure AUpDownClick(Sender: TObject;
Button: TUDBtnType);
protected
public
constructor Create(AOwner: TComponent);
override;
destructor Destroy;
override;
published
property OnUpDownClick:TUDClickEvent read FOnUpDownClick write FOnUpDownClick;
end;

//procedure Register;
implementation
{ MaskEditEx }
procedure MaskEditEx.AUpDownClick(Sender: TObject;
Button: TUDBtnType);
begin
if assigned(FOnUpDownClick) then
FOnUpDownClick(Sender,Button);
end;

constructor MaskEditEx.Create(AOwner: TComponent);
begin
inherited;
FUpDown := TUpDown.Create(Self);
FUpDown.OnClick := AUpDownClick;
FUpDown.Parent := Self;
FUpDown.Align := alRight;
Self.EditMask := '!9999/99;1;_';
Self.Text := Copy(DateToStr(Now),1,7);
end;

destructor MaskEditEx.Destroy;
begin
FUpDown.Free;
inherited;
end;
 
如果你觉得重写个事件不太好,也可以这样,效果是一样的,虽然麻烦点,不过我推荐你这样写
type
MaskEditEx = class(TMaskEdit)
private
FUpDown : TUpDown;
procedure SetUpDownClick(Value:TUDClickEvent);
function GetUpDownClick:TUDClickEvent;
protected
public
constructor Create(AOwner: TComponent);
override;
destructor Destroy;
override;
published
property OnUpDownClick:TUDClickEvent read GetUpDownClick write SetUpDownClick;
end;

procedure Register;
implementation
{ MaskEditEx }
function MaskEditEx.GetUpDownClick:TUDClickEvent;
begin
result:=FUpDown.OnClick;
end;

procedure MaskEditEx.SetUpDownClick(Value:TUDClickEvent);
begin
FUpDown.OnClick := Value;
end;

constructor MaskEditEx.Create(AOwner: TComponent);
begin
inherited;
FUpDown := TUpDown.Create(Self);
FUpDown.Parent := Self;
FUpDown.Align := alRight;
Self.EditMask := '!9999/99;1;_';
Self.Text := Copy(DateToStr(Now),1,7);
end;

destructor MaskEditEx.Destroy;
begin
FUpDown.Free;
inherited;
end;
 
非常感谢 hs-kill 的指导,看过你的回复后自己对VCL又有了更进一步的了解.
现在还有一个问题就是当我鼠标定位到编辑框内,UpDown就被遮住了,我知道应该是MaskEdit的WMSetFocus消息处理,但是不知道怎么才能让UpDown正常显示,请 hs-kill 再指导一下.
 
发个delphi 交流群:4654765
 
哦~~~~~那个不是被覆盖了而是你的edit获得焦点后回刷新edit的区域,而updown却没有刷新,只要是从TCustomEdit继承的控件都这样
其实VCL有现成的控件给你参考啊TSpinEdit,我建议你仔细看看他的源码
修改下Style就行了
type
MaskEditEx = class(TMaskEdit)
private
...
protected
procedure CreateParams(var Params: TCreateParams);
override;
public
...
published
...
end;

procedure MaskEditEx.CreateParams(var Params: TCreateParams);
begin
inherited CreateParams(Params);
Params.Style := Params.Style or ES_MULTILINE or WS_CLIPCHILDREN;
end;
 
非常感谢 hs-kill 的指导.全分奉上.[:D]
 
接受答案了.
 

Similar threads

I
回复
0
查看
527
import
I
I
回复
0
查看
682
import
I
I
回复
0
查看
573
import
I
I
回复
0
查看
632
import
I
后退
顶部