動態創建組件問題
Var
  Xpnl:Tpanel;
  XbtnOkpnl:Tpanel;
  XDBgrid:TDBGrid;
XbtnOk:Tbitbtn;
Xpnl:= Tpanel.create(self);
With Xpnl do
Begin
Parent:=form1;
Align:=alCLient;
End;
XbtnOkpnl:= Tpanel.create(self);
With XbtnOkpnl do
 Begin
  Parent:=Xpnl;
Height:=41;
Align:=alTop;
End;
XbtnOk:=Tbitbtn.create(self);
With XbtnOk do
 Begin
 Parent:= XbtnOkpnl;
Height:=40;
Width:=150;
Left:=0;
Top:=0;
Caption:=’資料匯出’;
onClick=CustomXbtnOk;
End;
XDBgrid:=TDBGrid.create(self);
With XDBgrid do
Begin
  Parent:=Xpnl;
Align:=alClient;
Datasource;= //此處略
End;
Procedure CustomXbtnOk(Sender:Tobject)
Var
  I:integer;
Begin
  For i:=1 to Tpanel(Tbitbtn(sender).parent.parent).componentcount do
    If Tpanel(Tbitbtn(sender).parent.parent).components[i-1] is TDBGrid then
         …………………………………..
End;通過循環就是找不到類型為的TDBGrid組件,測試Xpnl的子組件數目顯示為零﹐怎么回事﹐我明明將XDBGrid的Parent屬性設置為Xpnl了。如何辦呢?還有﹐就是在動態創建組件的過程中﹐由于我沒有給組件起名字(因為我的程序中大量用動態創建的組件﹐在程序運行過程中要多次執行包含動態創建組件的代碼﹐一旦定了組件名字﹐在第二次執行時就會提示給定名字的組件已存在)﹐造成在程序運行中﹐想要引用動態創建的組件成為難題, 如在Procedure CustomXbtnOk(Sender:Tobject)中要引用之前創建的XDBgrid該怎么辦﹐代碼中動態創建的相同類型的組件有多個。有哪位大俠知道﹐請不吝賜教。

解决方案 »

  1.   

    通過循環就是找不到類型為的TDBGrid組件,測試Xpnl的子組件數目顯示為零
    Tbitbtn(sender).parent.parent取出来是Xpnl但是你要注意你的对象在创建的时候都是  xxx.create(self);  self 是指窗体
    所以你所有动态创建的控件是属于窗体的子控件,而不是Xpnl
      

  2.   

    Parent:=Xpnl;
    之后
        if AControl is TWinControl then
        begin
          ListAdd(FWinControls, AControl);
          ListAdd(FTabList, AControl);
        end else
          ListAdd(FControls, AControl);设置的时候会判断Xpnl是TWinControl还是其他的;
    如果是TWinControl会把它保留在FWinControls里
    否则会保存在FControls里,所以你可以这样去试试 For i:=1 to Tpanel(Tbitbtn(sender).parent.parent).ControlCount do
        If Tpanel(Tbitbtn(sender).parent.parent).Controls[i-1] is TDBGrid then
      

  3.   

    to chenzhuo(睡到自然醒) :謝謝你﹐我的問題已經解決了。