【问题标题】:Passing nil as a parameter in place of a TComponent传递 nil 作为参数代替 TComponent
【发布时间】:2011-07-22 03:38:23
【问题描述】:

当将 nil 传递给期望 TComponent 的构造函数时,我遇到了一些引发异常(不支持 EIntfCasterror Cast)的代码,如下所示:

obj := SomeClass.Create(nil);

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

谢谢。

另外,我没有调用这个方法的源代码,或者我只会让它传递它可以访问的表单。

编辑:修正了代码示例。

EDIT2:修正了代码示例,因为我第一次写它时有第二个脑袋放屁。

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

【问题讨论】:

  • 那不是构造函数,那是强制转换。你的意思是SomeClass.Create(nil)
  • 那甚至不是 Delphi 代码。 ;-)
  • 您没有提供问题的准确描述。该异常不是由您发布的代码引起的。引发异常时,构造函数 inside 正在执行哪一行代码?您所描述的一般不会发生,因此 SomeClass 的具体值很重要。请包括它。
  • 我也没有那个代码。
  • @Rob,赞成,因为这是一个有趣的谜题:为什么将 nil 传递给构造函数会导致 EIntfCasterror 异常。为什么投反对票?

标签: delphi components null delphi-6


【解决方案1】:

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

MyNewInterface := MyInterface as IADifferentInterface;

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

var
  MyForm: TForm1;
begin
  MyForm := TForm1.Create(nil);
  try
    MyForm.ShowModal;
  finally
    MyForm.Free;
  end
end;

就是这样(虽然它很愚蠢 - 但它说明了这一点):

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;

【讨论】:

  • 挑剔:我认为 EIntfCastError 也可能在将实例转换为接口时发生。
  • @TOndrej,从技术上讲,您总是将接口转换为接口;当您调用TInterfacedObject as ISomething 时,您实际上是在调用IUnknown.QueryInterface 方法。
  • @Cosmin,你打败了我。 :)
  • 同意,但 IInterface(或 IUnknown)的演员表并不明显,发生在“幕后”,所以我认为值得一提。
  • +1。一个表现良好的TComponent 后代应该可以在 Owner=nil 下正常工作,但我认为这不是必需的。对于它的价值,我们确定SomeClass实际上是TComponent吗?
猜你喜欢
  • 2014-07-22
  • 1970-01-01
  • 2022-11-08
  • 2016-12-29
  • 2010-12-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多