Передача nil в качестве параметра вместо TComponent - PullRequest
0 голосов
/ 24 марта 2011

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

obj := SomeClass.Create(nil);

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

Спасибо.

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

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

EDIT2: исправлен пример кода, потому что у меня был второй пердеть мозг, когда я впервые написал его.

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

1 Ответ

2 голосов
/ 24 марта 2011

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;
...