你如果多研究一段时间VCL,就会发现这并不奇怪,把控件通过一系列的安装、注册的过程后,控件面板上会出现该控件的图标,这样你就可以通过Object Inspector在设计时使用该控件了,而如果你不做上面这些事件,控件同样可用,只不过不能在设计时使用,只能自己写了代码来控制其属性,Object Inspect的作用就是把所有的属性写到窗体文件中而不是单元文件中,从而省去了自己写代码的麻烦。

解决方案 »

  1.   

    错在
    MyShape := TShape.Create(AOwner);
    应为:MyShape := TShape.Create(self);
    这是因为你没有正确理解控件的Owner和Parent属性的原因;
    你可以比较以下代码:
    TForm1 = class(TForm)
      Shape1: TShape;
      Panel1: TPanel;
    end;
    TMyPanel = class(TPanel)
      Shape: TShape;
    end;
    var
      Form1: TForm1;
      myPanel: TMyPanel;
    你会发现其中:
    Form1.Shaep1.Owner := Form1;//即self
    Form1.Shape1.Parent := Form1;//即self
    Form1.Panel1.Owner := Form1;//
    Form1.Panel1.Parent := Form1;
    myPanel.Shape.Owner := myPanel;
    myPanel.Shape.Parent := myPanel;即:
      Panel1可以看作控件TForm1的一个子控件,其owner为form1;
      而Shape是MyPanel控件的子控件,其owner为MyPanel;TMyPael.Create(AOwner: TComponent);中的AOwner代表MyPanel的拥有者是Form1;
    而TShape.Create(AOwner);中的AOwner代表Shape的拥有者为MyPanel,所以要用self//即MyPanel
      

  2.   

    to Sachow(有助):
    没有搞明白你究竟要说些什么????
    我的TMyPanel是安装了的,可运行时出错,不安装则没有错!!!!to TommyTong(童童):
    非常感谢!
    我也知道错在哪里,也并不是我不正确理解控件的Owner和Parent属性,我真是要使Shape的拥有者(Owner)为Form1,因为只有这样,我可以在设计时随便调整Shape的位置。我怎么做为什么不行,能说出点道理来吗??????
    或着你能告诉我,怎样才能使Shape在设计时用鼠标随便移动吗???
                                        ^^^^^^
      

  3.   

    各位,你试一下可以发现,如果直接用delphi自带的元件,放一个TPanel,再在TPanel上放一个其他元件C,则该元件C的Owner为Form1,而不是TPanel。
    但我在我自己编的元件中这么用C(我代码中的Shape)设计的话,虽然Form1所在的单元正确包含了元件C所在的单元,可还是不行,似乎delphi在编译时认为没有元件C,所以把元件C所在的单元给去掉了!!!
      

  4.   

    我试过了,这种做法问题太多,你说的这个元件我已经做好了,而且安装正常,
    但是,把这个Form关掉,再打开,一个Shape变成了两个如果你这这些Shape
    统统删掉,再关闭这个Form,那么Access Violation,read address 00000000而且如果按Alt-F12切换的话,每做一次,就多出一个Shape出来,我这里做到了一共有3个
    Shape在Panel上,没有继续下去。要做这种动作,需要你去认真研究一下Delphi的流机制,即如何把一个Form存入到一个*.dfm文件中,
    建议你去看看TToolBar是怎么写的。
      

  5.   

    to BaldZhang(BaldZhang):
    我想TToolBar和Tpanel是一样的,他是设计时往上加控件的,和我的要求还是不一样。
    另外要象我那样建控件,并将两个都设成self在设计时shape是不响应鼠标事件的。
    我也遇到你说的问题了。另外,象TStatuBar,之类(用TCollection)的控件我知道怎么做。不知TGrid控件的随便改变列的宽,和我这个问题有没有关系。有谁知道点这方面的思路吗?
      

  6.   

    你所要求的性能,确实只用控件是比较难以实现的
    建议参考以下:
      1。DefineProperties(忘了在哪个类里面了,好象是TComponent)
      2。RTTI
      3。Delphi的Designer(TFormDesigner,IFormDesigner)
      4。这个Designer有个方法,叫做IsDesignMsg,找找看吧