繁体   English   中英

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

[英]How do I set properties of a frame based on properties of its child components?

我的第一个问题可能是针对具体问题的,因此我将尝试以更一般的方式提出:

我有一个带有组件的框架,可以说它是一个TButton。 将框架放在窗体上之后,我更改了组件的属性,假设我将按钮上的标签设置为100。

在框架的构造函数中,我想执行以下操作:

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; 

我的理论是,如果开发人员设置了编辑器的数据源/数据字段属性,则框架应在“数据感知模式”下使用,并且数据感知编辑器应可见。 事实证明,在创建时未设置这些属性。

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

如何覆盖“已加载”过程? 然后,在所有子组件加载完毕后,对其进行扫描以查找所需的组件?

例如

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;

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

我将从框架中删除嵌入式SynEdit,而是为框架提供引用 SynEdit实例的属性。 这样,您就不会总是有一个无用的SynEdit实例,并且用户甚至可能决定使用您从未想到的SynEdit派生类。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM