从dfm

时间:2017-11-17 09:45:07

标签: delphi

有没有办法跳过从dfm创建的组件?

我有一个可视组件,有时我不想创建它。当然我可以手工创建组件,但由于组件有很多项目,这将是很多工作。

2 个答案:

答案 0 :(得分:8)

实际上 是一种实现此目的的方法。这是一个跳过特定类的组件的示例。

向表单中添加两个类似于以下内容的事件处理程序:

procedure TForm224.DoCreateComponent(Reader: TReader; ComponentClass: TComponentClass; var Component: TComponent);
begin
  if ComponentClass = <whatever component class shall be skipped> then begin
    Abort;
  end;
end;

procedure TForm224.DoReaderError(Reader: TReader; const Message: string; var Handled: Boolean);
begin
  Handled := True;
end;

然后以这种方式覆盖表单的ReadState()方法:

procedure TForm224.ReadState(Reader: TReader);
begin
  Reader.OnError := DoReaderError;
  Reader.OnCreateComponent := DoCreateComponent;
  inherited;
  Reader.OnError := nil;
  Reader.OnCreateComponent := nil;
end;

如果该组件类有多个实例,并且您需要检查单个实例,则可以使用TReader.OnSetName事件:

procedure TForm224.ReadState(Reader: TReader);
begin
  ...
  Reader.OnSetName := DoSetName;
  inherited;
  Reader.OnSetName := nil;
  ...
end;

procedure TForm224.DoSetName(Reader: TReader; Component: TComponent; var Name: string);
begin
  if Name = <instance name> then begin
    Abort;
  end;
end;

答案 1 :(得分:6)

  

有没有办法跳过从dfm创建的组件?

在我看来,没有干净的方法可以做到这一点。我认为您正在寻找可以使用表单设计器应用的方法。

Uwe的答案显示了一种基于代码的方法确实可以满足您的要求,但我个人认为它在实际应用中过于笨重。此外,Uwe的回答要求可选组件是for上该类的唯一组件。那是不现实的。

在我看来,最好的选择是:

  1. 让组件作为.dfm流媒体的一部分自动创建,然后将其销毁或在运行时隐藏它。
  2. 可选择在运行时创建组件。