消息关闭
    暂无新消息!
//改写DefineProperties虚方法,用以实现控件属性值的持久化。

procedure DefineProperties(Filer: TFiler); override;

procedure TMyTimer.DefineProperties(Filer: TFiler);

begin

inherited;

filer.DefineProperty('MyProperty',LoadProperty,StoreProperty,true);

//LoadProperty 和StoreProperty 是以函数为参数

end;

   // 在DefineProperties方法中需要一个写变量函数作为参数。

procedure StoreProperty(Writer:TWriter);

procedure TMyTimer.StoreProperty(Writer:TWriter);

begin

writer.WriteInteger(FInterval);

writer.WriteInteger(FResolution);

writer.WriteBoolean(FEnabled);

//持久化三个保护字段变量

end;

//在DefineProperties方法中需要一个读变量函数作为参数。

    procedure LoadProperty(Reader:TReader);

    procedure TMyTimer.LoadProperty(Reader:TReader);

begin

   FInterval:=reader.ReadInteger;

  FResolution:=reader.ReadInteger;

Fenabled:=reader.ReadBoolean;

hirestimer1.Interval:=FInterval;

hirestimer1.Resolution:=FResolution;

hirestimer1.Enabled:=FEnabled;

// 读取属性值

end;

// 当属性值改变时,修改HiResTimer1控件对应的属性值。

function TMyTimer.Get_Enabled: WordBool;

begin

  Result := FEnabled;

end;

procedure TMyTimer.Set_Enabled(Value: WordBool);

begin

  FEnabled := Value;

  hirestimer1.Enabled :=FEnabled;

//设置hirestimer1.Enabled  决定定时器是否工作。

 end;

function TMyTimer.Get_Interval: Integer;

begin

  result:=Finterval;

end;

function TMyTimer.Get_Resolution: Integer;

begin

  result:=Fresolution;

end;

 

procedure TMyTimer.Set_Interval(Value: Integer);

begin

  Finterval:=value;

  hirestimer1.Interval:=Finterval;

  // hirestimer1.Interval的作用和VB自带的Timer定时器Interval属性功能一致。

end;

procedure TMyTimer.Set_Resolution(Value: Integer);

begin

  Fresolution:=value;

  hirestimer1.Resolution:=Fresolution;

  // hirestimer1.Resolution 属性保证定时器的精度。数值越小精度越高。

end;

添加完属性后,还要在IMyTimerEvents中加入Ontimer事件,首先在私有段中定义一个TimerEvent 函数。然后在程序Initialize段中让HiResTimer1.OnTimer = TimerEvent;而在TimerEvent 事件中又调用FEvents.OnTimer,这样就能在Ontimer事件中捕获到HiResTimer1.OnTimer事件。程序实现如下所示:

procedure TMyTimer.Initialize;

begin

  inherited Initialize;

   HiResTimer1.OnTimer:=TimerEvent;

  end;

procedure TMyTimer.TimerEvent(Sender: TObject);

begin

  if FEvents <> nil then FEvents.OnTimer;

end;

4.因为我们要编写的是一个非可视Activex 控件,所以控件在用于VB等开发环境时还应具有如下特征即:控件在designtime 时尺寸应固定且可见,而在 runtime时不可见。以下代码即可实现尺寸固定:

constructor Create(AOwner: TComponent); override;

constructor TMyTimer.Create(AOwner: TComponent);

begin

  self.AutoSize:=true;

  inherited create(aowner);

  self.width:=32;

  self.height:=32;

  self.Constraints.MaxHeight:=32;

  self.Constraints.MaxWidth:=32;

  self.Constraints.MinHeight:=32;

  self.Constraints.MinWidth:=32;

 end;

下面这行代码即可实现ActiveX控件在designtime 时可见而runtime时不可见的功能。          

  TActiveFormFactory.Create(

    ComServer,

    TActiveFormControl,

    TMyTimer,

    Class_MyTimer,

    1,

   `97B151A-9D6F-4DCC-BAA8-E4B51D2DD68B}`

    OLEMISC_INVISIBLEATRUNTIME, //修改后

    //OLEMISC_SIMPLEFRAME or OLEMISC_ACTSLIKELABEL, 默认参数

    tmApartment);

2个回答