帮我把代码优化一下(动态生成组件) ( 积分: 100 )

  • 主题发起人 主题发起人 雪狐狸
  • 开始时间 开始时间

雪狐狸

Unregistered / Unconfirmed
GUEST, unregistred user!
动态生成1000个Panel,但速度太慢。有没有什么方法使它创建得快些?
能否用多线程来实现它?
我的代码如下(不要见笑):
procedure Tmainform.Button1Click(Sender: TObject);
var
i,x,y:integer;
pan:array [0..1000] of TPanel;
begin
x:=1;
y:=100;
for i:=0 to 999 do
begin
pan:=TPanel.Create(Self);
pan.Parent:=Self;
pan.OnClick:=panClick; //“panClick”是一个自定义的事件
pan.Height:=20;
pan.Width:=30;
pan.Top:=y;
pan.Left:=(x)*30+1;
x:=x+1;
if x>30 then
begin
x:=1;
y:=y+20;
end;
pan.Caption:=inttostr(i);
pan.Update; //这行我记得还有别的语句可以代替
end;
end;
 
LockWindowUpdate(Self.Handle);
x:=1;
y:=100;
for i:=0 to 999 do
begin
pan:=TPanel.Create(Self);
pan.Parent:=Self;
pan.OnClick:=panClick; //“panClick”是一个自定义的事件
pan.Height:=20;
pan.Width:=30;
pan.Top:=y;
pan.Left:=(x)*30+1;
x:=x+1;
if x>30 then
begin
x:=1;
y:=y+20;
end;
pan.Caption:=inttostr(i);
//pan.Update;
end;
LockWindowUpdate(0);
 
这样更快
var
i,x,y:integer;
pan:array [0..1000] of TPanel;
c : Dword;
begin
c := GetTickCount;
LockWindowUpdate(Self.Handle);
x:=1;
y:=100;
for i:=0 to 999 do
begin
pan:=TPanel.Create(Self);
//pan.Parent:=Self;
pan.OnClick:=panClick; //“panClick”是一个自定义的事件
pan.Height:=20;
pan.Width:=30;
pan.Top:=y;
pan.Left:=(x)*30+1;
x:=x+1;
if x>30 then
begin
x:=1;
y:=y+20;
end;
pan.Caption:=inttostr(i);
//pan.Update; //这行我记得还有别的语句可以代替
end;
for i:=0 to 999 do
pan.Parent:=Self;
LockWindowUpdate(0);
c := GetTickCount - c;
Caption := IntToStr(c);
end;
 
还是慢啊
 
1秒钟1000个带句柄的组件,还要多快?
 
tMyTPanel = class(TPanel)
constructor Create(AOwner: TComponent; a, b, c, d: integer);
end;

procedure TForm1.Button1Click(Sender: TObject);
var
i, x, y, b, c : integer;
pan : array[0..1000] of TPanel;
list : tstringlist;
tp : tMyTPanel;
begin
b := GetTickCount;
LockWindowUpdate(Self.Handle);
x := 1;
y := 100;
list := tstringlist.Create;
for i := 0 to 999 do
begin
tp := tMyTPanel.Create(Self, 20, 30, y, (x * 30 + 1));
tp.Parent := Self;
x := x + 1;
if x > 30 then
begin
x := 1;
y := y + 20;
end;
tp.Caption := inttostr(i);
list.AddObject('', tp);
end;
LockWindowUpdate(0);
c := GetTickCount;
showmessage(FormatFloat('0.000', (c - b) / 1000) + '秒');
end;
constructor tMyTPanel.Create(AOwner: TComponent; a, b, c, d: integer);
begin
inherited Create(AOwner);
OnClick := nil; //“panClick”是一个自定义的事件
Height := a;
Width := b;
Top := c;
Left := d;
end;
也凑合
 
还是我改的最快,代码改自肥羊的代码,form上增加一个panle2,把动态创建的pan创建在panle2中显示,比改之前快70%左右,我的机器配置:C700,256M,Win2K,D5,改之前创建完一般在4.2″左右完成,改后一般在1.2″左右完成。

procedure TForm1.Button4Click(Sender: TObject);
var
i,x,y:integer;
pan:array [0..1000] of TPanel;
c : Dword;
begin
c := GetTickCount;
LockWindowUpdate(Self.Handle);
Panel2.Visible := false;
x:=1;
y:=100;
for i:=0 to 999 do
begin
pan:=TPanel.Create(Panel2);
//pan.Parent:=Self;
pan.OnClick:=Panel1Click; //“panClick”是一个自定义的事件
pan.Height:=20;
pan.Width:=30;
pan.Top:=y;
pan.Left:=(x)*30+1;
x:=x+1;
if x>30 then
begin
x:=1;
y:=y+20;
end;
pan.Caption:=inttostr(i);
//pan.Update; //这行我记得还有别的语句可以代替
end;
for i:=0 to 999 do
pan.Parent:=Panel2;//Self;
Panel2.Width := pan[29].Width + pan[29].Left + 50;
Panel2.Height := pan[999].Height + pan[999].Top + 50;
Panel2.Visible := true;
LockWindowUpdate(0);
c := GetTickCount - c;
ShowMessage(IntToStr(c));
end;
 
是设计有问题吧. 有这样的需求嘛?
 
我也看看,记得前几天也在做
 
确实加快了速度
 
我测了1000个,快多了
 
pan:=TPanel.Create(Self);
改成 pan:=TPanel.Create(nil);
App关闭后要记得free
 
开始创建前加如下语试试, 速度可能会提升好几十倍.我以前一个项目是这样做的.

self.DisableAlign
 
根据上面的经验,做出来了
http://www.softyes.com/bbs/ShowPost.asp?PageIndex=1&ThreadID=1134#1287

如何在房台格格中加下.label.text,就是名称中加上多行?
如下:
101
101房
12:00
 
panClick; //“panClick”是一个自定义的事件

如何传递点击的那一个pannel?
 
Sender 就是传的那个面板 强制转换一下就是了
 
softyes,你们还真的在开发这套系统呀.
 
早都做好了,只是看看界面优化
 
頂起。看看。
 
后退
顶部