这个问题的第一个版本可能是具体的,所以我会尝试以更一般的方式提问:
我有一个框架上有一个组件,让我们说它是一个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;
我的理论是,如果开发人员设置编辑器的数据源/数据域属性,则应在“数据感知模式”中使用框架,并且数据感知编辑器应该是可见的。事实证明,在创建时,这些属性没有设置。
有没有人对如何解决这个问题有一个很好的建议?
答案 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并且每帧只有一个编辑器实例。