Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/8.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 将nil作为参数而不是TComponent传递_Delphi_Components_Null_Delphi 6 - Fatal编程技术网

Delphi 将nil作为参数而不是TComponent传递

Delphi 将nil作为参数而不是TComponent传递,delphi,components,null,delphi-6,Delphi,Components,Null,Delphi 6,我遇到过一些代码,当它将nil传递给需要TComponent的构造函数时抛出异常(不支持EIntfCasterror Cast),如下所示: obj := SomeClass.Create(nil); 它所在的单元不包含表单,甚至在调用其构造函数时,TForm也需要向其传递TComponent。如果有什么东西存在,我应该通过什么来代替零,或者有没有办法让它接受零 多谢各位 另外,我没有调用这个方法的源代码,或者我只需要让它传递它可以访问的表单 编辑:修复了代码示例 EDIT2:修复了代码示例,

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

obj := SomeClass.Create(nil);
它所在的单元不包含表单,甚至在调用其构造函数时,TForm也需要向其传递TComponent。如果有什么东西存在,我应该通过什么来代替零,或者有没有办法让它接受零

多谢各位

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

编辑:修复了代码示例

EDIT2:修复了代码示例,因为我在第一次编写代码时又放了一个脑屁


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

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

MyNewInterface := MyInterface as IADifferentInterface;
即使在创建TForm时,也永远不需要传递所有者。以下代码完全合法:

var
  MyForm: TForm1;
begin
  MyForm := TForm1.Create(nil);
  try
    MyForm.ShowModal;
  finally
    MyForm.Free;
  end
end;
这也是(尽管它相当愚蠢——但它说明了这一点):


那不是构造器,那是演员阵容。你是说
SomeClass.Create(nil)
?那甚至不是Delphi代码您没有提供问题的准确情况。该异常不是由您发布的代码引起的。引发异常时,构造函数中的哪一行代码正在执行?您所描述的一般情况下不会发生,因此SomeClass的特定值很重要。请包含它。我也没有那个代码。@Rob,upvote,因为这是一个有趣的谜题:为什么将
nil
传递给构造函数会导致
EIntfCasterror
异常。为什么投否决票?吹毛求疵:我认为在将实例转换为接口时也可能发生EIntfCastError。@TOndrej,从技术上讲,您总是将接口转换为接口;当您将
TInterfacedObject作为ISomething调用时
实际上是在调用
IUnknown.QueryInterface
方法。@Cosmin,您比我快了。:)同意,但《面对面》的演员阵容并不明显,发生在“幕后”,所以我认为值得一提。一个行为良好的
TComponent
子代应该可以与Owner=nil一起工作,但我认为这不是一个要求。就其价值而言,我们是否确实知道
SomeClass
实际上是一个
t组件
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;