我的目的是这样的:首先自己手工加入了一个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;
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;
Form3 := TForm3.Create(self);
Form3.CreateCtl;
Form3.ShowModal;
Form3.Free;
TForm3 = class(TForm)
procedure FormCreate(Sender: TObject); //不要放在private中
private { Private declarations }
public
procedure CreateCtl;
{ Public declarations }
end;
//换成这个试试~~
LabelChange[j].Parent := Self;
你的form3在类的声明应该作为公共的,而非私有。
我还是出错啊:下面是我的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.
换成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;
LabelChange[j].Parent := Form3
此时form3尚未创建,肯定出错
将代码放到form3Show事件中!
来晚了,你把错误信息贴出来呗
来晚了,你把错误信息贴出来呗