有没有办法跳过从dfm创建的组件?
我有一个可视组件,有时我不想创建它。当然我可以手工创建组件,但由于组件有很多项目,这将是很多工作。
答案 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上该类的唯一组件。那是不现实的。
在我看来,最好的选择是: