Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Delphi 如何基于框架子组件的属性设置框架的属性?_Delphi_Frames - Fatal编程技术网

Delphi 如何基于框架子组件的属性设置框架的属性?

Delphi 如何基于框架子组件的属性设置框架的属性?,delphi,frames,Delphi,Frames,我对这个问题的第一个版本可能过于具体,因此我将尝试以更一般的方式提问: 我有一个框架,上面有一个组件,假设它是一个按钮。在将框架放置在表单上之后,我更改了组件的属性,假设我将按钮上的标记设置为100 在框架的构造函数中,我想做如下操作: constructor TMyFrame.Create(AOwner: TComponent); begin inherited; if Button1.Tag = 100 then DoSomething else DoSomethi

我对这个问题的第一个版本可能过于具体,因此我将尝试以更一般的方式提问:

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

在框架的构造函数中,我想做如下操作:

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

  if Button1.Tag = 100
    then DoSomething
    else DoSomethingElse;
end;
我发现此时(在创建过程中)按钮的标记仍然是0。有人能推荐另一种方法吗

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

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

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

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

if DBSQLMemo.DataField > ''
  then pcMemos.ActivePage := tsDataAware
  else pcMemos.ActivePage := tsNonDataAware;
我的理论是,如果开发人员设置编辑器的datasource/datafield属性,那么框架应该在“数据感知模式”中使用,并且数据感知编辑器应该是可见的。事实证明,在创建时,这些属性没有设置

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

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

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

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

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

覆盖“已加载”过程如何?然后,在加载所有子组件后,扫描它们以查找所需的组件

e、 g

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

覆盖“加载”过程如何?然后,在加载所有子组件后,扫描它们以查找所需的组件

e、 g


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

框架的整个要点是具有嵌入式编辑器。当我创建一个用户应该能够输入一些SQL语句的新表单时,我想添加框架并(如果需要)设置数据源/字段。没错,如果“frame-edtor”没有留下太多功能,我的答案就没有多大用处了。:-)框架的全部要点是具有嵌入式编辑器。当我创建一个用户应该能够输入一些SQL语句的新表单时,我想添加框架并(如果需要)设置数据源/字段。没错,如果“frame-edtor”没有留下太多功能,我的答案就没有多大用处了。:-)这将否定使用框架的简单性。而且,问题是我在创建时不知道我需要什么。我想也许我把我原来的问题问得有点具体了。更一般地说,我需要知道在创建帧时驻留在帧上的组件的特定属性。PS:我很感激你的回答,但不幸的是,它们对我没有多大帮助。这会否定使用框架的简单性。而且,问题是我在创建时不知道我需要什么。我想也许我把我原来的问题问得有点具体了。更一般地说,我需要知道在创建帧时驻留在帧上的组件的特定属性。PS:我很感激你的回答,但不幸的是,它们对我帮助不大。据我所知,框架上没有加载过程。我想你可能误解了,或者我不是很清楚。代码应该以帧为单位,而不是以表单为单位。@Svein:试试看。在表单和框架中覆盖加载的
过程(是的,它也有一个),然后在这两个过程中设置断点并运行应用程序。好吧,我会倒霉的。成功了。忽略我之前的评论,原谅我的无知。非常感谢:-)据我所知,框架上没有加载过程。我想你可能误解了,或者我不是很清楚。代码应该以帧为单位,而不是以表单为单位。@Svein:试试看。在表单和框架中覆盖加载的
过程(是的,它也有一个),然后在这两个过程中设置断点并运行应用程序。好吧,我会倒霉的。成功了。忽略我之前的评论,原谅我的无知。非常感谢:-)
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;