我的目的是这样的:首先自己手工加入了一个TFORM,然后我想在这个TFORM创建的时候动态的出现我的控件(控件的个数是不一定的),下面的代码始终不能通过,但我将这个代码假如最原始的窗口(就是FORM1)就可以出现没问题,但我加入FORM3(就是我想动态出现的那个就不行了)
procedure TForm3.CreateCtl;
var i,j :integer;
Begin
i := Form1.Table.FieldCount;SetLength(EditChange,i);
SetLength(LabelChange,i);
for j := 0 to i-1 do
begin
LabelChange[j] := Tlabel.Create(self);//EditChange : Array of TEdit;
                                      // LabelChange : Array of TLabel;
LabelChange[j].Parent := Form3;//这句会出错,如果删除可以运行但不能显示我的控件了
LabelChange[j].Name := Form1.Table.Fields[j].FieldName;
LabelChange[j].Caption := Form1.Table.Fields[j].FieldName;
LabelChange[j].SetBounds(176,168+j*49,81,17);
EditChange[j] := TEdit.Create(Form3);
EditChange[j].Parent := Form3;
EditChange[j].Name := 'Edit' + inttostr(j);
EditChange[j].SetBounds(176+81,168+j*49,89,21);
EditChange[j].Text := Form1.Table.FieldByName(Form1.Table.Fields[j].FieldName).AsString;end;
end;procedure TForm3.FormCreate(Sender: TObject);
begin
CreateCtl;end;

解决方案 »

  1.   

    你不必将CreateCtl放在FormCreate中嘛,比如可以在创建/显示Form3的时候这样写
      Form3 := TForm3.Create(self);
      Form3.CreateCtl;
      Form3.ShowModal;
      Form3.Free;
      

  2.   

    另外你说的会出错的那句我这里不出错,你也可以这样试试
      TForm3 = class(TForm)
        procedure FormCreate(Sender: TObject);  //不要放在private中
      private    { Private declarations }
      public
        procedure CreateCtl;
        { Public declarations }
      end;
      

  3.   

    答案同 wweijie(林黛玉) 
      

  4.   

    LabelChange[j].Parent := Form3;//这句会出错,如果删除可以运行但不能显示我的控件了
    //换成这个试试~~
    LabelChange[j].Parent := Self;
      

  5.   

    同意一楼的,
    你的form3在类的声明应该作为公共的,而非私有。
      

  6.   

    [Error] Unit2.pas(34): Incompatible types: 'TWidgetControl' and 'TForm2'
    我还是出错啊:下面是我的UNIT2的代码,请问有问题没(这个错误我在不同的计算机上都有)
    unit Unit2;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs,QStdCtrls,QControls;type
      TForm2 = class(TForm)
      private
        { Private declarations }
        CtlNum :integer;
        EditChange : Array of TEdit;
        LabelChange : Array of TLabel;
      public
        { Public declarations }
         procedure CreateCtl;
      end;var
      Form2: TForm2;implementation{$R *.dfm}
    procedure TForm2.CreateCtl;
    var i,j :integer;
    begin
    SetLength(EditChange,2);
    for j := 0 to 1 do
    begin
    EditChange[j] := TEdit.Create(self);
    EditChange[j].Parent := Form2;
    EditChange[j].Name := 'Edit' + inttostr(j);
    EditChange[j].SetBounds(176+81,168+j*49,89,21);
    EditChange[j].Show;
    end;
    end;
    end.
      

  7.   

    怎么引用了QStdCtrls,QControls这两个单元?~~
    换成StdCtrls单元~~procedure TForm1.CreateCtl;
    var
      J: Integer;
    begin
      SetLength(EditChange, 2);
      for J := Low(EditChange) to High(EditChange) do begin
        EditChange[J] := TEdit.Create(Self);
        EditChange[J].Parent := Self;
        EditChange[J].Name := 'Edit' + IntToStr(J);
        EditChange[J].SetBounds(176 + 81, 168 + J * 49, 89, 21);
      end;
    end;
      

  8.   

    我换了的,但是还是不行EditChange[J].Parent := Self;
      

  9.   

    你在form3create中:
    LabelChange[j].Parent := Form3
    此时form3尚未创建,肯定出错
    将代码放到form3Show事件中!
      

  10.   

    怎么也不应该用Self啊
    来晚了,你把错误信息贴出来呗
      

  11.   

    怎么也不应该用Self啊
    来晚了,你把错误信息贴出来呗