只有最后添加的Delphi组件才能执行操作

时间:2013-12-07 17:51:16

标签: delphi delphi-7

我在Delphi中创建了自己的组件(就像一个可以移动的按钮),安装它。然后我从那里创建了一个新项目,并添加了一些新的我的组件元素。但只有最后一个添加才能移动!别人没有。为什么会这样?我怎么能解决它?

这是组件代码:

unit ModifiedButton;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls, ExtCtrls;


var Timer: TTimer;

type
  TSpeed = (Slow,Normal,Fast);
  TModifiedButton = class(TButton)
  private
    { Private declarations }
    FCount:integer;
    Velocity:integer;
    FSpeed:TSpeed;

  protected
    { Protected declarations }
    procedure Click;override;
    procedure Move(Vel:Integer);
    procedure OnTimer(Sender: TObject);
  public
    { Public declarations }
     procedure ShowCount;
  published
    { Published declarations }
     property Count:integer read FCount write FCount;
     property Speed: TSpeed read FSpeed write FSpeed;

     constructor Create(aowner:Tcomponent); override;

  end;

procedure Register;

implementation

procedure Register;
begin
  RegisterComponents('MyComponents', [TModifiedButton]);
end;

{ TModifiedButton }

procedure TModifiedButton.Click;
begin
  inherited Click;
  FCount:=FCount+1;
   if (Speed = Slow) then
    Velocity:=2;
   if (Speed = Normal) then
    Velocity:=10;
   if (Speed = Fast) then
    Velocity:= 20;
  Timer.Enabled:=True;


end;

constructor TModifiedButton.Create(aowner: Tcomponent);
begin
  inherited Create(aowner);
  Timer:=TTimer.Create(self);
  Timer.Enabled:=false;
  Timer.OnTimer:=OnTimer;
  Timer.Interval:=10;

end;

procedure TModifiedButton.Move(Vel: Integer);
begin
  Left:=Left + Vel;
end;

procedure TModifiedButton.OnTimer(Sender: TObject);
begin
  Move(Velocity);
end;

procedure TModifiedButton.ShowCount;
begin
  ShowMessage('You cliked '+ caption+' for '+inttostr(FCount)+' times');
end;

end

1 个答案:

答案 0 :(得分:8)

由于Timer是一个全局变量,因此您创建的每个新按钮都将覆盖前一个按钮的OnTimer事件处理程序。解决方案,使Timer成为TModifiedButton类的成员:

unit ModifiedButton;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls, ExtCtrls;

type
  TSpeed = (Slow,Normal,Fast);
  TModifiedButton = class(TButton)
  private
    { Private declarations }
    FCount:integer;
    Velocity:integer;
    FSpeed:TSpeed;
    Timer: TTimer;

  protected
    { Protected declarations }
    procedure Click;override;
    procedure Move(Vel:Integer);
    procedure OnTimer(Sender: TObject);
  public
    { Public declarations }
     procedure ShowCount;
  published
    { Published declarations }
     property Count:integer read FCount write FCount;
     property Speed: TSpeed read FSpeed write FSpeed;    
     constructor Create(aowner:Tcomponent); override;
     destructor Destroy; override;    
  end;

procedure Register;

implementation

{ TModifiedButton }

procedure TModifiedButton.Click;
begin
  inherited Click;
  FCount:=FCount+1;
  Case Speed of
    Slow   : Velocity:=2;
    Normal : Velocity:=10;
    Fast   : Velocity:= 20;
  end;
  Timer.Enabled:=True;
end;

procedure TModifiedButton.Move(Vel: Integer);
begin
  Left:=Left + Vel;
end;

procedure TModifiedButton.OnTimer(Sender: TObject);
begin
  Move(Velocity);
end;

procedure TModifiedButton.ShowCount;
begin
  ShowMessage(Format('You clicked %s for %d times', [Caption, FCount]));
end;

constructor TModifiedButton.Create(AOwner: Tcomponent);
begin
  inherited Create(AOwner);
  Timer := TTimer.Create(self);
  Timer.Enabled:=false;
  Timer.OnTimer:=OnTimer;
  Timer.Interval:=10;
end;

destructor Destroy;
begin
 Timer.Enabled := False;
 Timer.Free;
end;

procedure Register;
begin
  RegisterComponents('MyComponents', [TModifiedButton]);
end;

end.