Board logo

Subject: 不可视组件的Top和Left [Print This Page]

Author: sonicer    Time: 2010-4-16 18:03     Subject: 不可视组件的Top和Left

系统带的非可视组件放到窗体上后然后保存,下次再打开这个窗体,非可视组件就出现在上次放置的位置(废话了,这功能当然谁都知道)
这实际上意味着非可视组件也有位置属性保存起来了,实际上打开dfm文件,所有的组件都有left=xxx top=xxx的字样

非可视组件使用了一种特殊方式来保存这两个值,

我想问一下,如何在程序中读到这两个值?

谢谢
Author: zjy    Time: 2010-4-16 21:23     Subject: 从 Classes.pas 中可以找到:

procedure TComponent.ReadLeft(Reader: TReader);
begin
  LongRec(FDesignInfo).Lo := Reader.ReadInteger;
end;

procedure TComponent.ReadTop(Reader: TReader);
begin
  LongRec(FDesignInfo).Hi := Reader.ReadInteger;
end;

procedure TComponent.DefineProperties(Filer: TFiler);
var
  Ancestor: TComponent;
  Info: Longint;
begin
  Info := 0;
  Ancestor := TComponent(Filer.Ancestor);
  if Ancestor <> nil then Info := Ancestor.FDesignInfo;
  Filer.DefineProperty('Left', ReadLeft, WriteLeft,
    LongRec(FDesignInfo).Lo <> LongRec(Info).Lo);
  Filer.DefineProperty('Top', ReadTop, WriteTop,
    LongRec(FDesignInfo).Hi <> LongRec(Info).Hi);
end;

显然,DesignInfo 里面保存的就是你要的东西。
Author: sonicer    Time: 2010-4-17 17:29

这段代码当时走马观花,人懒,总以为有类似于object.left之类的方法来读取,没想到用这种办法
多谢领导




Welcome to CnPack Forum (http://bbs.cnpack.org/) Powered by Discuz! 5.0.0