有关Delphi6新增的TRecall类及其子类的一个使用问题,为什么会这样呢?(10分)

  • 主题发起人 主题发起人 Archerfl
  • 开始时间 开始时间
A

Archerfl

Unregistered / Unconfirmed
GUEST, unregistred user!
我的代码如下:
procedure TForm1.Button3Click(Sender: TObject);
var
FontRecall : TFontRecall;
begin
FontRecall := TFontRecall.Create( Canvas.Font );
try
Canvas.Font.Size := 16;
Canvas.TextOut(5,5,'Hello World');
Canvas.Font.Assign(FontRecall.Reference);
if Canvas.Font.Size = 16 then
ShowMessage('16')
else
ShowMessage(IntToStr(Canvas.Font.Size));
finally
FontRecall.Free;
end;
if Canvas.Font.Size = 16 then
ShowMessage('16')
else
ShowMessage(IntToStr(Canvas.Font.Size));
end;
代码中声明了一个TFontRecall类型的实例FontRecall,初始想法是让它记住改变窗体画布的
字体特性前该特性的状态(初始情况下Canvas.Font.Size = 8),然而在这一句Canvas.Font.Assign(FontRecall.Reference);
之后的ShowMessage中显示为16,显然这一句并没有获复初始值8,然后在try..finally..end.
块后再测试发现ShowMessage确显示为初始值8啦!
但是,我看了一下TRecall的源码封装情况,发现它提供出来的一个属性Reference仅对于的是
它最初引用且希望保存其值的那个对象而言,那么当你修改Canvas.Font.Size值时Reference也
会跟着改变,所以第一次测试时显示16当属正常,但为什么在第二次中显示确为初始值8呢?难
道是这一句FontRecall.Free。可是这一句又怎么会影响到当前Canvas.Font.Size的特性值呢?
望各位高手指点!谢!
 
当你创建TFontRecall的实例时,
FontRecall := TFontRecall.Create( Canvas.Font );
FontRecall会自动保存Canvas.Font 的初始值。
你第一次的showmessage显示的是已经更改过的Canvas.Font ,当然为16
第二次的showmessage有点复杂:当FongRecall.free时,它把他所关联的Font对象更新到原来的
状态,此时当然为8.即使你不加Canvas.Font.Assign(FontRecall.Reference);这句话也是一样的
记注:FontRecall在Create时,FontRecall会自动保存他所关联的Font对象(Create的参数)的初始值。
 
我明白啦,感谢yfdciom,十分送上!
 

Similar threads

S
回复
0
查看
1K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
900
SUNSTONE的Delphi笔记
S
S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
后退
顶部