如何动态创建N个对象?(100分)

T

tomol

Unregistered / Unconfirmed
GUEST, unregistred user!
我想在一个窗口中动态创建N个TImage对象,并把每个TImage正常显示,我该如何作???
 
//FORM上放四个按钮 和一个Tpanel
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, Db, DBTables, ComCtrls, ExtCtrls;

type
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
Button3: TButton;
Button4: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
procedure Button4Click(Sender: TObject);

private
tempedit:tedit;
PageControl1:TPageControl;
panel1:tpanel;
procedure EditChange(Sender:TObject);//响应 EDIT 改变的事件声明
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;
a:array[1..10] of TTabSheet;
i:byte;
implementation

{$R *.DFM}

procedure TForm1.Button1Click(Sender: TObject);
begin
tempedit.Free ;
tempedit:=nil;
panel1.free;
panel1:=nil;
end;
//响应 EDIT 改变的事件
procedure tform1.EditChange(sender:tobject);
begin
showmessage('edit on change');
end;


procedure TForm1.Button2Click(Sender: TObject);
begin
panel1:=tpanel.Create (self);
panel1.Parent :=self;

tempedit:=tedit.Create (panel1);//把EDIT生成到panel1上而不是在form中。

with tempedit do
begin
left:=panel1.Left + 10;
top:=panel1.top+20;
tag:=1;
text:='在这儿改变一下看看' ;
tempedit.OnChange:=editchange;//指定 EDIT 改变的事件 到指定的处理过程中去
parent:=panel1;
tempedit.ParentWindow :=panel1.Handle ;
end;

end;


procedure TForm1.Button3Click(Sender: TObject);
begin
pagecontrol1:=tpagecontrol.Create (self);
pagecontrol1.Top :=100;
pagecontrol1.Parent :=self;

for i:=0 to 10 do
begin
a:=ttabsheet.Create(nil);
with a do
begin
pagecontrol:=pagecontrol1;
name:='a'+inttostr(i);
caption:= 'a'+inttostr(i);
end;
end;
end;

procedure TForm1.Button4Click(Sender: TObject);
begin
//for i:=0 to 10 do a.Destroy ;
for j:=form1.ComponentCount-1 downto 0 do
if (form1.Components[j] is ttabsheet) then form1.Components[j].Destroy ;
//and (form1.components[j].Name =('a'+inttostr(i))
pagecontrol1.free;
pagecontrol1:=nil;
end;

end.
 
创建就行了,用循环也行.
 
var
BmpArray: array of TImage;
begin
SetLength(BmpArray,200)

{动态创建图片}
for i:=1 to count do
begin
BmpArray:=TImage.Create(self);
BmpArray.parent:=self;
with BmpArray do
begin
left:=20;
width:=80;
height:=100;
Stretch:=true;
end;
if (i mod 5)=1 then //五幅图片显示一行
begin
BmpArray.Left:=20;
BmpArray.top:=IncTop+20;
inc(IncTop,120);
end
else
begin
if (i mod 5<>1) then
bmpArray.top:=BmpArray[i-1].top;
bmpArray.left:=bmpArray[i-1].left+bmpArray[i-1].width+20;
end;
BmpArray.picture.loadFromFile(ComboBox1.Items[i-1])
//载入图片
end;
end;
 
也就是说,动态创建的数量必须固定了
 
恩,同意楼上,用控件数组来做比较好
 
var
aImage : array of TImage;

procedure Form1.DrawImg(iN:integer);
const
iImgH = 15;
var
i, iTop : integer;
begin
iTop := 0;
SetLength(aImage, iN)
//要动态生成的Image数
for i := 0 to iN - 1 do
begin
aImage := TImage.Create(Self);
with aImage do
begin
Parent := Form1
//不可少
Align := alTop;
AutoSize := True;
Enabled := True;
Visible := True;
Left := 0;
Top := iTop;
iTop := iTop + iImgH;
Hint := IntToStr(i);
try
Picture.LoadFromFile('图片文件');
except
;
end;
OnClick := ImgClick;
end;
end;
end;

procedure Form1.ImgClick(Sender: TObject);
begin
showmessage((Sender as TImage).Hint);
end;

退出时记着Free掉
for i := Length(aImage) - 1 downto 0 do
aImage.Free;
 
数量不一定要固定的,你可以做个 TList 来 Keep 住你已经创建了的控件嘛
 
用动态数组也可以
 
TForm1 = class(TForm)
...
private
MyImgLst: TList;
...
function MyImage(X: Integer): TImage;

procedure TForm1.FormCreate(Sender: TObject);
begin
MyImgLst:= TList.Create;
...
end;
function TForm1.MyImage(X: Integer): TImage;
begin
if (X >= 0) and (X < MyImgLst.Count) then
Result:= TImage(MyImgLst[X])
else
Result:= nil;
end;
 
用一个Edit输入你的N
在Panel1 上输出N个TImage
Var
I:Integer;
Begin
For I:=0 To N-1 DO
Begin
With TImage.Create(Panel) Do
Begin
Parent:=Panel;
Left:=??//根据需要;
Top:=??//根据需要;
Width:=??//根据需要;
Height:=??//根据需要;
Stretch:=True/False;//根据需要;
Picture.LoadPictureFromFile('a.bmp');
End;
End;
End;
 
推荐用TList或者TStringList来管理,比数组好用.
 
顶部