首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将nil作为参数传递,以代替TComponent

将nil作为参数传递,以代替TComponent
EN

Stack Overflow用户
提问于 2011-03-24 21:25:40
回答 1查看 445关注 0票数 0

我遇到过一些代码,当它将nil传递给需要TComponent的构造函数时,会抛出异常(不支持EIntfCasterror强制转换),如下所示:

代码语言:javascript
复制
obj := SomeClass.Create(nil);

它所在的单元不包含表单,甚至TForm在调用其构造函数时也需要向其传递TComponent。如果存在任何东西,我应该传递什么来代替nil,或者有什么方法可以让它接受nil。

谢谢。

而且,我没有调用这个方法的源代码,否则我只会让它传递它有权访问的表单。

编辑:修复代码示例。

EDIT2:修复了代码示例,因为当我第一次编写它时,我有了第二个想法。

EDIT3:我也没有构造函数的代码。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-03-24 22:09:44

EIntfCastError与传入构造函数的所有者无关。这是因为您试图将一个接口转换为您认为它支持的另一个接口,而它实际上并不支持它。

代码语言:javascript
复制
MyNewInterface := MyInterface as IADifferentInterface;

您永远不会要求传入所有者,即使在创建TForm时也是如此。以下代码是完全合法的:

代码语言:javascript
复制
var
  MyForm: TForm1;
begin
  MyForm := TForm1.Create(nil);
  try
    MyForm.ShowModal;
  finally
    MyForm.Free;
  end
end;

这一点也是如此(尽管它相当愚蠢-但它说明了这一点):

代码语言:javascript
复制
implementation

var
  Button: TButton;

procedure TForm1.FormCreate(Sender: TObject);
begin
  Button := TButton.Create(nil);
  Button.Parent := Form1;
  Button.Left := 10;
  Button.Top := 10;
  Button.Caption := 'Button';
  Button.Name := 'MyDumbButton';
  Button.OnClick := TheButtonClick;
end;

procedure TForm1.TheButtonClick(Sender: TObject);
begin
  ShowMessage(TButton(Sender).Name + ' clicked');
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  Button.Free;
end;
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5419901

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档