Anscheinend liefert der 'is' immer true, wenn die Referenz den passenden Typ hat, das lässt sich nachvollziehen.
Wenn Du aber den Code in dieser Form abänderst:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
stringList : TStringList;
obj : TObject;
control : TWinControl;
begin
stringList := (TStringList.Create);
obj := TObject(stringList);
if (obj is TWinControl)
then ShowMessage('True')
else ShowMessage('False');
obj := Button1;
if (obj is TWinControl)
then ShowMessage('True')
else ShowMessage('False');
end;
Wird zuerst eine Box mit "false" und dann eine mit "true" gezeigt, so wie man es auch erwarten würde.