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

时间:2010-11-26 14:00:48

标签: delphi frames

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

我有一个框架上有一个组件,让我们说它是一个TButton。在框架上放置框架后,我更改了组件的属性,假设我将按钮上的标签设置为100.

在框架的构造函数中,我想做这样的事情:

constructor TMyFrame.Create(AOwner: TComponent);
begin
  inherited;

  if Button1.Tag = 100
    then DoSomething
    else DoSomethingElse;
end;

我发现此时(创建期间)按钮的标记仍为0.有人可以推荐另一种方法吗?

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

有时我们需要数据感知版本(TDBSYnEdit),有时我们需要“常规”版本(TSynEdit)。我们通过在框架上进行页面控制来解决这个问题,并在设计时切换到正确的页面。选项卡已隐藏,因此用户不知道会发生这种情况。

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

我想通过将以下代码添加到框架

上的Create事件来解决此问题
if DBSQLMemo.DataField > ''
  then pcMemos.ActivePage := tsDataAware
  else pcMemos.ActivePage := tsNonDataAware;

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

有没有人对如何解决这个问题有一个很好的建议?

3 个答案:

答案 0 :(得分:3)

覆盖“已加载”程序怎么样?然后,当加载所有子组件时,扫描它们以找到您需要的组件吗?

e.g。

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;

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

答案 1 :(得分:0)

我会从框架中删除嵌入的SynEdit,而是将框架的属性引用添加到SynEdit实例。这样你并不总是有一个无用的SynEdit实例,用户甚至可能决定使用你甚至没想过的SynEdit衍生物。

答案 2 :(得分:0)

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