有谁写过这样的控件没?(100分)

  • 主题发起人 主题发起人 外来天客
  • 开始时间 开始时间

外来天客

Unregistered / Unconfirmed
GUEST, unregistred user!
"自动关闭按钮"(就是到计时后,自动关闭它的父窗口)

单独实现这个功能已经做到到了.
现在想把它做成一个组件.. 但里面有好些方法不知道怎么写..请高手帮下忙,如果您写过关于类似的组件,能不能把源码贴出来,或直接把它发给我(liuweiming504@163.com)
先谢了!!!
 
直接用timer多 好
 
哎..如果那样的话..我就没必要发帖子了.
 
4年前用 vfp 写过一个,用 delphi 没写过(因为不需要用到)。
前段时间在哪看到有这样的文章的,百度搜索到的,你应该也能搜索得到。
 
没做过,不过,我的设计思想肯定是对的
1、从Tbutton继承,得到一个新类名TimerButton
2、TimerButton中集成(请使用组合设计模式)一个Timmer,其激活方法和时间你自己定,这不是关键
3、计时器事件里,就一直向上找
var
btn: TButton;
parentForm: TForm;
-------------------------------
parentForm := nil;
while (parentForm = nil) do
begin
if Self.Parent is TForm then
begin
parentForm := Self.Parent as TForm;
Break;
end;
end;
if parentForm = nil then
raise Exception.CreateFmt('该按钮不在任何窗体之上:%0:s', [btn.Name]);
4、接下来的就不用说啦,最终的一句代码写上就OK了
5、注册你的控件
 
哈..这个我已经完成了,自己简单的写了下..功能也还实现了..现在贴出来!
注: 你可对这个组件进行任意修改,但很诚恳的希望能把你修改后的东西,送我一份,相互学习,才会有进步! 谢谢!(liuweiming504@163.com)

unit AutoCloseButton;

interface

uses
SysUtils, Classes, StdCtrls,Messages,Windows;

const
M_TIMER=1; //定时器的名字
type
TAutoCloseButton = class(TButton)
private
{ Private declarations }
strCaption:string;
iTickTime:integer; //间隔时间(秒)
bAutoClose:boolean;
FHandle:HWND;
procedure SetAutoClose(value:boolean);
procedure SetTickTime(value: integer);
procedure Timer(var Msg:TWMTIMER);message WM_TIMER;
protected
{ Protected declarations }
public
{ Public declarations }
constructor Create(AOwer:TComponent);override;
destructor Destroy;override;
published
{ Published declarations }
Property AutoClose: boolean read bAutoClose write SetAutoClose default false;
Property TickTime: integer read iTickTime write SetTickTime default 10;
end;

procedure Register;

implementation

procedure Register;
begin
RegisterComponents('Welkin', [TAutoCloseButton]);
end;

{ TAutoCloseButton }

constructor TAutoCloseButton.Create(AOwer: TComponent);
begin
inherited Create(AOwer);
iTickTime:=10;
bAutoClose:=false;
end;

destructor TAutoCloseButton.Destroy;
begin
if FHandle<>0 then
KillTimer (FHandle,M_TIMER) ; //销毁定时器
inherited;
end;

procedure TAutoCloseButton.SetAutoClose(value:boolean);
begin
bAutoClose:=value;
if bAutoClose then
begin
//创建一个定时器
FHandle:=Self.Handle;
SetTimer(FHandle,M_TIMER,1000, nil);
strCaption:=Self.Caption;
end
else
begin
KillTimer(FHandle, M_TIMER);
FHandle:=0;
end;
end;

procedure TAutoCloseButton.SetTickTime(value: integer);
begin
if value>=0 then
iTickTime:=value
else
iTickTime:=1;
end;

procedure TAutoCloseButton.Timer(var Msg: TWMTIMER);
begin
//捕获定时器消息
if bAutoClose then
begin
Self.Caption:=strCaption+'('+IntToStr(iTickTime)+')';
if iTickTime<=0 then
begin
KillTimer (FHandle,M_TIMER) ; //销毁定时器
SendMessage(Self.Parent.Handle,WM_CLOSE,0,0);
end;
Dec(iTickTime);
end;
end;

end.
 
强,我就是在win的消息上不大在行
 
给你一个建议吧,启用自动关闭时,在上面显示倒计时,just like BTCommet
 
上面那个控件代码就是实现这个功能呀~~
 
http://www.2ccc.com/article.asp?articleid=1125
 
多人接受答案了。
 
后退
顶部