Passing nil as a parameter in place of a TComponent

后端 未结 1 1986
闹比i
闹比i 2021-01-28 02:32

I\'ve come across some code that\'s throwing an exception (EIntfCasterror Cast not supported) when it passes nil to a constructor expecting a TComponent, like so:



        
相关标签:
1条回答
  • 2021-01-28 03:10

    EIntfCastError has nothing to do with the Owner passed in the constructor. It's because you try to cast an interface to another interface you think it supports when it doesn't in fact support it.

    MyNewInterface := MyInterface as IADifferentInterface;
    

    You're never ever required to pass in Owner, even when creating a TForm. The following code is perfectly legal:

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

    So is this (although it's pretty dumb - it illustrates the point, though):

    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;
    
    0 讨论(0)
提交回复
热议问题