如何改进Delphi框架的使用

Bri*_*ost 25 delphi components tframe

我在Delphi中使用了多年的框架,它们是VCL最强大的功能之一,但它们的标准使用似乎有一些风险,例如:

  1. 很容易意外地移动或编辑框架主机窗体上的框架子组件,而没有意识到你正在"调整"框架 - 我知道这不会影响原始框架代码,但它通常不是你想要的.

  2. 使用框架时,您仍然可以使用其子组件进行可视化编辑,即使该框架已有数年之久且不应触及.

所以我开始思考......

  1. 是否有一种"分组"组件的方式,使他们的位置"锁定"?这对完成的表格和框架都很有用.通常其他开发人员将代码返回给我,其中只有表单边界发生了变化,甚至他们也不打算进行任何更改.

  2. 有没有办法将框架及其组件转换为单个Delphi组件?如果是这样,框架内部构件将完全隐藏,其可用性将进一步增加.

我对任何想法感兴趣......

布莱恩.

Jer*_*ers 24

将帧注册为组件可以解决1.和2:

  1. 将该帧控件放在窗体或其他框架上时,框架上的组件将被锁定
  2. 你将获得一个可以直观设计的组件(实际上是:控件)

但是:有一些捕获(可以解决,见文章链接),其中最重要的是这一个:

当您将组件放在框架上,然后将该框架作为组件放在Delphi表单或框架上时,组件在结构窗格中可见.

问题是因为它们在结构窗格中可见,您可以删除它们,从而导致访问冲突.

解决这个问题的诀窍就是不要忘记'小树枝'.
我在DelphiLive 2009 期间从Ray Konopka那里学到了宝贵的一课.

由于课程非常有价值,我在其上写了一篇博文,详细描述了它.

关键部分是这一小段代码(博客文章中有更多细节):

procedure RegisterFramesAsComponents(const Page: string; const FrameClasses: array of TFrameClass);
var
  FrameClass: TFrameClass;
begin
  for FrameClass in FrameClasses do
  begin
    RegisterComponents(Page, [FrameClass]);
    RegisterSprigType(FrameClass, TComponentSprig);
  end;
end;
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助.

--jeroen


Joh*_*mas 18

是的,只需将它们注册为组件即可.:-)

正常设计您的框架,然后注册它.另外,请确保不要对不同的单元有不必要的依赖关系,因为在使用"组件"时这些依赖关系.您也可以添加published属性,以便稍后在Object Inspector中使用它们.例如,请参阅IDE生成的以下代码(另请参阅我的注释):

unit myUnit;

uses
 ...

type
  TmyComp = class(TFrame) //set your frame name to be the name your component 
    ToolBar1: TToolBar; //different components added in the form designer
    aliMain: TActionList;
    ...
  published //this section is added by hand
    property DataSource: TDataSource read FDataSource write SetDataSource; //some published properties added just for exemplification
    property DefFields: string read FDefFields write SetDefFields;
    ...
  end;


procedure Register; //added by hand

implementation

{$R *.DFM}

procedure Register;
begin
  RegisterComponents('MyFrames', [TmyComp]); //register the frame in the desired component category
end;
Run Code Online (Sandbox Code Playgroud)

在您选择的软件包中编译上面的内容,安装它并检查组件面板.:-)

HTH


Ple*_*rds 8

只是为了增加贡献,请注意,如果您转到Structure窗口并右键单击您选择的TFrame名称,然后单击Add to Palete菜单选项.这将使您的Frame中的组件成为一个组件,您不需要创建任何Register过程.;-)


Uli*_*rdt 6

我几乎总是在代码中创建框架实例.到目前为止,这对我来说很简单,也很有效.