Передача nil в качестве параметра вместо TComponent

Я встречал некоторый код, который выдает исключение (EIntfCasterror Cast не поддерживается), когда он передает nil конструктору, ожидающему TComponent, например:

obj := SomeClass.Create(nil);

Модуль, в котором он находится, не содержит формы, и даже TForm требует, чтобы TComponent передавался ему, когда вы вызываете его конструктор. Что я должен передать вместо нуля, если что-то существует или есть способ заставить его принять ноль.

Спасибо.

Кроме того, у меня нет исходного кода, который вызывает метод, в котором он находится, или я бы просто передал форму, к которой он имеет доступ.

РЕДАКТИРОВАТЬ: Исправлен пример кода.

РЕДАКТИРОВАТЬ 2: Исправлен пример кода, потому что у меня был второй пердеть мозг, когда я впервые написал его.

EDIT3: у меня нет кода для конструктора тоже.

1 ответ

Решение

EIntfCastError не имеет ничего общего с владельцем, переданным в конструкторе. Это потому, что вы пытаетесь привести интерфейс к другому интерфейсу, который, как вы думаете, он поддерживает, хотя на самом деле он его не поддерживает.

MyNewInterface := MyInterface as IADifferentInterface;

Вам никогда не требуется передавать владельца, даже при создании 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;
Другие вопросы по тегам