第一段
procedure TForm1.Button1Click(Sender: TObject);
begin
    ShowMessage( (Sender as TButton).Name );
    //Sender: TObject 表示 Sender 是 TObject型态
    //  TObject 无 Name 属性
    //ShowMessage( Sender.Name );    // error
end;
第二段
procedure TForm1.Timer1Timer(Sender: TObject);
 var
   X:Integer;
begin
  X:=Form1.ActiveControl.ComponentIndex;
  (Form1.Components[X] as TEdit).Color := clFuchsia;
  Label1.Caption:='共有 '+IntToStr(Form1.ComponentCount)+' 个组件';
  Label2.Caption := (Form1.ActiveControl as TObject).Name +
                     ' is '+ (Form1.ActiveControl as TObject).ClassName;
end;
第一段要转成TButton而使用name属性,第二段却转成TOjectect使用name,不解

解决方案 »

  1.   

    Label2.Caption := (Form1.ActiveControl as TObject).Name 
    --
    这个写法感觉有问题,TObject根本就没有Name这个属性嘛?这个直接写Form1.ActiveControl.Name就好了,ActiveControl本来就有这个属性不用做转换了,
      

  2.   

    第一段是在button控件的OnClick事件下写的代码,所以肯定是Tbutton第二段因为无法确定当前控件的类,所以用Tobject
      

  3.   

    第一段注释说Tobject无name属性才用的Tbutton,第二段转成Tobject为什么有name属性
      

  4.   

    第一个也不一定要用TButton,这些控制都是从TComponent继承下来的,TComponent有name这个属性,下面的也可以
      ShowMessage((Sender as TButton).Name);
      ShowMessage((Sender as TComponent).Name);
      ShowMessage(TComponent(Sender).Name);
      ShowMessage(TControl(Sender).Name);
      ShowMessage(TWinControl(Sender).Name);
    第二个,如果你写成TObject(Form1.ActiveControl).Name这样编译的时候就会报错的,但是比较奇怪的是AS居然不会报错,难道用AS编译器发现不匹配会自己纠正,这是什么什么书上写的啊,怎么会那样写啊