I := 1; S := 'Edit' + IntToStr(I);字符串是'Edit' 变量是I 控件名称是S
给你一个动态创建控件的例子,好好看看: unit Unit1;interfaceuses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, Menus, StdCtrls, ExtCtrls;type CRefType = class of Tcontrol; TForm1 = class(TForm) Panel1: TPanel; RadioRBtn: TRadioButton; MainMenu1: TMainMenu; File1: TMenuItem; New1: TMenuItem; Open1: TMenuItem; SaveAs1: TMenuItem; N1: TMenuItem; Exit1: TMenuItem; Help1: TMenuItem; About1: TMenuItem; ButtonRBtn: TRadioButton; LabelRBtn: TRadioButton; OpenDialog1: TOpenDialog; SaveDialog1: TSaveDialog; procedure FormCreate(Sender: TObject); procedure RadioRBtnClick(Sender: TObject); procedure ButtonRBtnClick(Sender: TObject); procedure LabelRBtnClick(Sender: TObject); procedure FormMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); procedure New1Click(Sender: TObject); procedure Open1Click(Sender: TObject); procedure SaveAs1Click(Sender: TObject); procedure Exit1Click(Sender: TObject); procedure About1Click(Sender: TObject); private { Private declarations } ClassRef : CRefType; Counter : Integer; public { Public declarations } end;var Form1: TForm1;implementation{$R *.dfm}procedure TForm1.FormCreate(Sender: TObject); begin RadioRbtn.Checked :=true; ClassRef := TRadioButton; Counter:=0; end;procedure TForm1.RadioRBtnClick(Sender: TObject); begin ClassRef := TRadioButton; end;procedure TForm1.ButtonRBtnClick(Sender: TObject); begin ClassRef:=TButton; end;procedure TForm1.LabelRBtnClick(Sender: TObject); begin ClassRef:=TLabel; end;procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); var MyObj:Tcontrol; Myname:String; begin MyObj:=ClassRef.Create(Self); MyObj.Parent :=Self; MyObj.Left :=x; Myobj.Top :=y; Inc(Counter); MyName := ClassRef.ClassName + IntToStr(Counter); Delete(MyName,1,1); MyObj.Name :=MyName; MyObj.Visible :=true; end;procedure TForm1.New1Click(Sender: TObject); var i:integer; begin for i:= ControlCount -1 downto 0 do if Controls[i].ClassName <> 'TPanel' then ConTrols[i].Free ; Counter:=0; end;procedure TForm1.Open1Click(Sender: TObject); var S:TFileStream; New:TComponent; begin if OpenDialog1.Execute then begin New1Click(self);{清除所有控件} s:= TFileStream.Create(OpenDialog1.FileName,fmopenRead ); try While s.position < S.Size do Begin New:=S.ReadComponent(nil); InsertControl(new as TControl); Inc(Counter); End; finally s.Free ; end; end; end;procedure TForm1.SaveAs1Click(Sender: TObject); var S:TFileStream; i:integer; begin if SaveDialog1.Execute then begin S:=TfileStream.Create(SaveDialog1.FileName ,fmOpenWrite or fmCreate); try for i:=0 to ControlCount -1 do Begin if Controls[i].ClassName <>'TPanel' then s.WriteComponent(Controls[i]); End; finally s.Free ; end; end; end;procedure TForm1.Exit1Click(Sender: TObject); begin close; end;procedure TForm1.About1Click(Sender: TObject); begin Application.MessageBox('动态创建控件举例!','帮助',mb_ok +MB_ICONINFORMATION ) end; initialization registerclasses([TRadioButton,TButton,TLabel]); end.
动态创建控件! 最好是控件数组! 如:MyEdit:array of TEdit; setlength(MyEdit,数组的大小);好了,直接这样调用:MyEdit(序号);
改正:不是MyEdit(序号),而是MyEdit[序号]。
procedure TForm1.Button1Click(Sender: TObject); const btnname='button'; var s : tbutton; i: integer; begin for i:= 3 to 22 do begin s:=TButton.create(Self); s.name:=btnname+inttostr(i); s.Parent:=Form1; s.left:=i*50; s.top:=i*20; s.visible:=true; //s.onclick:=button1click; end; end;
一个简单的例子:假设窗体上有10个Edit控件,Name为默认的Edit1、Edit2....Edit10; 现对它们批量赋值 for i:=1 to 10 do TEdit(FindComponent('Edit'+IntToStr(i))).Text:=IntToStr(i);其他控件操作只需把语句中的TEdit和'Edit'改为相应控件类名即可。
S := 'Edit' + IntToStr(I);字符串是'Edit'
变量是I
控件名称是S
unit Unit1;interfaceuses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, Menus, StdCtrls, ExtCtrls;type
CRefType = class of Tcontrol;
TForm1 = class(TForm)
Panel1: TPanel;
RadioRBtn: TRadioButton;
MainMenu1: TMainMenu;
File1: TMenuItem;
New1: TMenuItem;
Open1: TMenuItem;
SaveAs1: TMenuItem;
N1: TMenuItem;
Exit1: TMenuItem;
Help1: TMenuItem;
About1: TMenuItem;
ButtonRBtn: TRadioButton;
LabelRBtn: TRadioButton;
OpenDialog1: TOpenDialog;
SaveDialog1: TSaveDialog;
procedure FormCreate(Sender: TObject);
procedure RadioRBtnClick(Sender: TObject);
procedure ButtonRBtnClick(Sender: TObject);
procedure LabelRBtnClick(Sender: TObject);
procedure FormMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
procedure New1Click(Sender: TObject);
procedure Open1Click(Sender: TObject);
procedure SaveAs1Click(Sender: TObject);
procedure Exit1Click(Sender: TObject);
procedure About1Click(Sender: TObject);
private
{ Private declarations }
ClassRef : CRefType;
Counter : Integer;
public
{ Public declarations }
end;var
Form1: TForm1;implementation{$R *.dfm}procedure TForm1.FormCreate(Sender: TObject);
begin
RadioRbtn.Checked :=true;
ClassRef := TRadioButton;
Counter:=0;
end;procedure TForm1.RadioRBtnClick(Sender: TObject);
begin
ClassRef := TRadioButton;
end;procedure TForm1.ButtonRBtnClick(Sender: TObject);
begin
ClassRef:=TButton;
end;procedure TForm1.LabelRBtnClick(Sender: TObject);
begin
ClassRef:=TLabel;
end;procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
var
MyObj:Tcontrol;
Myname:String;
begin
MyObj:=ClassRef.Create(Self);
MyObj.Parent :=Self;
MyObj.Left :=x;
Myobj.Top :=y;
Inc(Counter);
MyName := ClassRef.ClassName + IntToStr(Counter);
Delete(MyName,1,1);
MyObj.Name :=MyName;
MyObj.Visible :=true;
end;procedure TForm1.New1Click(Sender: TObject);
var
i:integer;
begin
for i:= ControlCount -1 downto 0 do
if Controls[i].ClassName <> 'TPanel' then
ConTrols[i].Free ;
Counter:=0;
end;procedure TForm1.Open1Click(Sender: TObject);
var
S:TFileStream;
New:TComponent;
begin
if OpenDialog1.Execute then
begin
New1Click(self);{清除所有控件}
s:= TFileStream.Create(OpenDialog1.FileName,fmopenRead );
try
While s.position < S.Size do
Begin
New:=S.ReadComponent(nil);
InsertControl(new as TControl);
Inc(Counter);
End;
finally
s.Free ;
end;
end;
end;procedure TForm1.SaveAs1Click(Sender: TObject);
var
S:TFileStream;
i:integer;
begin
if SaveDialog1.Execute then
begin
S:=TfileStream.Create(SaveDialog1.FileName ,fmOpenWrite or fmCreate);
try
for i:=0 to ControlCount -1 do
Begin
if Controls[i].ClassName <>'TPanel' then
s.WriteComponent(Controls[i]);
End;
finally
s.Free ;
end;
end;
end;procedure TForm1.Exit1Click(Sender: TObject);
begin
close;
end;procedure TForm1.About1Click(Sender: TObject);
begin
Application.MessageBox('动态创建控件举例!','帮助',mb_ok +MB_ICONINFORMATION )
end;
initialization
registerclasses([TRadioButton,TButton,TLabel]);
end.
最好是控件数组!
如:MyEdit:array of TEdit;
setlength(MyEdit,数组的大小);好了,直接这样调用:MyEdit(序号);
const btnname='button';
var
s : tbutton;
i: integer;
begin
for i:= 3 to 22 do
begin
s:=TButton.create(Self);
s.name:=btnname+inttostr(i);
s.Parent:=Form1;
s.left:=i*50;
s.top:=i*20;
s.visible:=true;
//s.onclick:=button1click;
end;
end;
现对它们批量赋值
for i:=1 to 10 do
TEdit(FindComponent('Edit'+IntToStr(i))).Text:=IntToStr(i);其他控件操作只需把语句中的TEdit和'Edit'改为相应控件类名即可。
s.visible:=false;
为什么会出错呢?
i:integer;
s:string;
begin
I := 1;
S := 'Edit' + IntToStr(I);
S.visible:=false;
end;
为什么执行不了呢?
i:integer;
s:string;
begin
I := 1;
S := 'Edit' + IntToStr(I);
TEdit(FindComponent(S)).visible:=false;
end;楼主再试一试