多个控件显示的问题,显示的速度很慢

EastBuBai 2003-12-12 01:33:05
我在做一个变电站的RTU设备的维护工具软件,我选择delphi做的

我用创建控件数组的方法创建了64个groupbox控件,并且在每个groupbox里还有两个label控件,有一个combobox控件来选择显示几个,有一个确定按钮,点击了确定之后就在窗体上有规则的显示出来(每行最多显示8个,超过8个分两行显示)。
1、为什么显示的太慢?
2、当第二次设置的比第一次少时,每一个都重新刷新一遍,怎么不使第二次设置的这几个不重新刷新,就从原来的基础上减去几个就可以了,如果第二次设置的比第一次的多呢,就在第一次的基础上加上几个就可以了。

怎么解决这两个问题,谢谢!!

private
{ Private declarations }
procedure P_Iniallmk;
procedure P_show;
procedure P_inimk(var lMKNum :integer);
procedure P_inipro(var lProNum:integer);
public
{ Public declarations }
end;

var
MainForm: TMainForm;
GrB_MK :array[1..64] of Tgroupbox;
Lbl_MKID :array[1..64] of Tlabel;
Lbl_MKType : array[1..64] of Tlabel;

lMKNum ,lProNum: integer;
cnsMKtopstart:longint;

implementation

uses about;

{$R *.dfm}

procedure TMainForm.FormCreate(Sender: TObject);

begin
pal_staset.Left :=88;
pal_staset.Top :=200;
P_IniallMK;
end;

procedure TMainForm.Pal_StationClick(Sender: TObject);
begin
pal_staset.Visible :=true;
pal_staset.BringToFront ;

end;

procedure TMainForm.BitBtn1Click(Sender: TObject);
var
i:integer;
begin
for i:=1 to 64 do
begin
grb_mk[i].Visible :=false;
end;
pal_staset.Visible :=false;
lbl_mknum.Caption :='模块数量: ' +cob_mknum.Text ;
lmknum:=strtoint(cob_mknum.Text );
lbl_gynum.Caption :='规约数量: ' + cob_gynum.Text ;
//MainForm.Refresh ;
P_show;
end;

procedure TMainForm.Lbl_MKNumClick(Sender: TObject);
begin
pal_staset.Visible :=true;
pal_staset.BringToFront ;
end;

procedure TMainForm.Lbl_GYNumClick(Sender: TObject);
begin
pal_staset.Visible :=true;
pal_staset.BringToFront ;
end;


procedure tmainform.P_Iniallmk ;
var
i:longint;

begin
for i:=1 to 64 do
begin
grb_mk[i]:=tgroupbox.Create(nil);
grB_MK[i].Height:=45;
grb_mk[i].Width :=62;
grb_mk[i].Name :='grb_mk' + inttostr(i);
grb_mk[i].Caption :='';
grb_mk[i].Color :=clmenu;
grb_mk[i].Parent :=mainform;
grb_mk[i].Visible:=false;

lbl_mkid[i]:=tlabel.Create(nil);
lbl_mkid[i].Height :=13;
lbl_mkid[i].Width := 62;
lbl_mkid[i].Top :=17;
lbl_mkid[i].Left :=4;
lbl_mkid[i].Name :='lbl_mkid'+inttostr(i);
lbl_mkid[i].Caption :=' ID: ' +inttostr(i);
lbl_mkid[i].Alignment:=tacenter;
lbl_mkid[i].Parent :=grb_mk[i];
lbl_mkid[i].Visible :=true;

lbl_mktype[i]:=tlabel.Create(nil);
lbl_mktype[i].Height :=13;
lbl_mktype[i].Width := 62;
lbl_mktype[i].Top := 31;
lbl_mktype[i].Left :=4;
lbl_mktype[i].Name :='lbl_mktype'+inttostr(i);
lbl_mktype[i].Caption :='';
lbl_mktype[i].Alignment :=tacenter;
lbl_mktype[i].Parent :=grb_mk[i];
lbl_mktype[i].Visible :=true;
end;
end;

procedure tmainform.P_inimk(var lmknum:integer) ;
var
i,j:integer;
lMKTopJG,lMKTopStart:integer;

const
lMKleftstart =240 ;
lMKleftJG =70 ;

begin

if (lmknum>0) and (lmknum<=64) then
begin
lMKTopJG:=98;
j:=(lmknum-1) div 8;
case j of
0:
begin
lMkTopStart := 275;
end;
1:
begin
lMkTopStart := 200;
lMkTopJG :=100 ;
end;
2:
begin
lMkTopStart := 175;
lMkTopJG :=100 ;
end;
3:
begin
lMkTopStart := 120;
lMkTopJG :=80;
end;
4:
begin
lMkTopStart := 100;
lMkTopJG :=70 ;
end;
5:
begin
lMkTopStart := 70;
lMkTopJG :=70 ;
end;
6:
begin
lMkTopStart :=70;
lMkTopJG :=60;
end;
7:
begin
lMkTopStart :=40;
lMkTopJG :=60 ;
end;
end;
for i:=1 to lmknum do
begin
grb_mk[i].Top :=lMkTopStart + (((i - 1) div 8) * lMkTopJG);
grb_mk[i].Left :=lMKleftstart + (((i - 1) Mod 8) * lMKleftJG);
grb_mk[i].Visible := true;
end;
end;

end;


procedure tmainform.P_show ;
begin
P_inimk(lMKNum);
P_inipro(lProNum);
end;

procedure TMainForm.FileSave1Execute(Sender: TObject);
begin
savedialog.InitialDir :=ExtractFilePath(paramstr(0))+'Station\';
savedialog.title:='保存';
SaveDialog.Execute;
end;

...全文
55 2 打赏 收藏 举报
写回复
2 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
hthunter 2004-01-10
2、把序号加到tag属性中去,需要减少时把tag大于某个值的Free(Destroy)掉就可以了
  • 打赏
  • 举报
回复
jpyc 2004-01-10
如果显示刷新太慢,一种可能是你的算法有问题,另一种可能是你的机子太烂,否则光显示几个控件不应该有问题
  • 打赏
  • 举报
回复
相关推荐
发帖
Delphi
加入

5067

社区成员

Delphi 开发及应用
申请成为版主
帖子事件
创建了帖子
2003-12-12 01:33
社区公告
暂无公告