Передача 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;