代码之家  ›  专栏  ›  技术社区  ›  Svein Bringsli

如何根据框架子组件的属性设置框架的属性?

  •  0
  • Svein Bringsli  · 技术社区  · 14 年前

    我对这个问题的第一个版本可能是具体的,所以我将试着以更一般的方式提出:

    我有一个带组件的框架,假设它是一个TButton。在表单上放置框架之后,我更改了组件的一个属性,假设我将按钮上的标记设置为100。

    在frames的构造器中,我想做如下操作:

    constructor TMyFrame.Create(AOwner: TComponent);
    begin
      inherited;
    
      if Button1.Tag = 100
        then DoSomething
        else DoSomethingElse;
    end;
    

    我发现此时(在创建期间)按钮的标记仍然是0。有人能推荐另一种方法吗?

    在我们的应用程序中,有几个地方用户可以输入SQL语句。为了方便我们使用 SynEdit 组件。为此,我们创建了一个框架,其中包含一些扩展功能。

    有时我们需要数据感知版本(TDBSYnEdit),有时我们需要“常规”版本(TSynEdit)。我们通过在框架上使用pagecontrol来解决这个问题,并在设计时切换到正确的页面。标签是隐藏的,所以用户不知道会发生这种情况。

    问题是,有时我们的开发人员忘记在页面控件上设置正确的页面,或者意外地选择了错误的页面。

    我想通过在框架的Create事件中添加以下代码来解决这个问题

    if DBSQLMemo.DataField > ''
      then pcMemos.ActivePage := tsDataAware
      else pcMemos.ActivePage := tsNonDataAware;
    

    我的理论是,如果开发人员设置编辑器的datasource/datafield属性,那么框架应该在“数据感知模式”中使用,并且数据感知编辑器应该是可见的。事实证明,在创建时这些属性并没有设置。

    有人对我该如何解决这个问题有好的建议吗?

    3 回复  |  直到 14 年前
        1
  •  3
  •   norgepaul    14 年前

    重写“加载”过程怎么样?然后,当加载所有子组件时,扫描它们以查找所需的组件?

    例如

    interface
    
    ...
    protected
      procedure Loaded; override;
    ...
    
    implementation
    
    procedure Loaded;
    var
      i: Integer;
    begin
      inherited;
    
      for i := 0 to pred(Self.ComponentCount) do
        if Self.Components[i] is TSynEdit then
        begin
          // do something
        end;
    end;
    

    如果您需要的组件不是框架的直接子代,则需要扫描子代等。

        2
  •  0
  •   Uli Gerhardt    14 年前

    我将从框架中移除嵌入的SynEdit,并给框架一个属性 提到 到SynEdit实例。这样你就不会总是有一个无用的SynEdit实例,用户甚至可能决定使用一个你根本没想到的SynEdit派生程序。

        3
  •  0
  •   Uli Gerhardt    14 年前

    另一个想法是:用代码创建SynEdit,而不是用可视化的方法?(取决于您希望通过表单设计器对其进行多少更改。)然后可以删除PageControl,并且每帧只有一个编辑器实例。