起步软件技术论坛-X3

 找回密码
 立即注册
搜索
查看: 1369|回复: 22

【搞定】通过代码创建控件这么慢正常吗?**

[复制链接]
发表于 2007-1-11 13:46:02 | 显示全部楼层 |阅读模式
我通过代码判断类型,然后创建相应的控件并设置了一些控件属性再显示在窗体上,可是却非常慢,当控件个数达到15个的时候,就要等1秒才能全部显示出来,这样正常吗?有没有什么更好的办法或者优化?(控件的类型只有TEdit、TDateEdit和TMemo3种)
回复

使用道具 举报

发表于 2007-1-11 14:05:58 | 显示全部楼层
肯定不应该这么慢的,要看看代码才行了
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-1-11 14:54:19 | 显示全部楼层
procedure TDocProperty.CreateComponentsArr(TypeID:String);   
var
lQuery:TQuery;
ArrCompHeight:Array of Integer;     //保存该组件数组每个组件的高度+间距
CompName,LabelName,MustFlag:String;
NowTop,i,j,LabelHeight:integer;
cEdit:TEdit;
cDateEdit:TDateEdit;
cMemo:TMemo;
cLabel:TLabel;
begin
   FreeComponentsArr;   
   CompName:='Comp';
   LabelName:='Label';
   i:=CompIndexBase;
   j:=LabelIndexBase; //Label名称后缀和初始索引值
   LabelHeight:=17;   //Label的高度+间距
   NowTop:=TopBase+LabelHeight;
   lQuery:=TQuery.Create(nil);
   try
      lQuery.ConnectionString:=cConnectionString;
      lQuery.CommandText:='SELECT FT_TypeField,FT_TypeFieldClass,FT_Must FROM FILETYPE'
                      +' WHERE FT_TypeID='''+TypeID+''' ORDER BY FT_FieldOrder';
      lQuery.Open;
      if not lQuery.IsEmpty then
      begin
      NowFieldCount:=lQuery.RecordCount;
      SetLength(ArrCompHeight,NowFieldCount);
      if (NowFieldCount=1) and
         lQuery.FieldByName('FT_TypeField').AsString.Equals('') then
      begin
         NowFieldCount:=0;
         Exit;
      end;
        While not lQuery.Eof do   
        begin
           if lQuery.FieldByName('FT_TypeFieldClass').AsString.Equals(DateField) then
           begin
              cDateEdit:=TDateEdit.Create(Self);
              cDateEdit.Name:=CompName+SysUtils.IntToStr(i);
              cDateEdit.ComponentIndex:=i;
              cDateEDit.Visible:=False;
              cDateEdit.Parent:=GroupBox3;
              cDateEdit.Top:=NowTop;
              cDateEdit.Left:=CompLeftBase;
              cDateEdit.Width:=CompWidth;
              cDateEdit.Ctl3D:=False;
              NowTop:=NowTop+cDateEdit.Height+Space+LabelHeight;
              ArrCompHeight:=cDateEdit.Height+Space;
           end else
           if lQuery.FieldByName('FT_TypeFieldClass').AsString.Equals(MemoField) then
           begin
              cMemo:=TMemo.Create(Self);
              cMemo.Name:=CompName+SysUtils.IntToStr(i);
              cMemo.ComponentIndex:=i;
              cMemo.Visible:=False;
              cMemo.Parent:=GroupBox3;
              cMemo.Text:='';
              cMemo.Top:=NowTop;
              cMemo.Left:=CompLeftBase;
              cMemo.Width:=CompWidth;
              cMemo.BorderStyle:=TFormBorderStyle.bsNone;
              cMemo.BevelInner:=TBevelCut.bvNone;
              cMemo.BevelKind:=TBevelKind.bkFlat;
              NowTop:=NowTop+cMemo.Height+Space+LabelHeight;
              ArrCompHeight:=cMemo.Height+Space;
           end else
           begin
              cEdit:=TEdit.Create(Self);
              cEdit.Name:=CompName+SysUtils.IntToStr(i);
              cEdit.ComponentIndex:=i;
              cEdit.Visible:=False;
              cEdit.Parent:=GroupBox3;
              cEdit.Text:='';
              cEdit.Top:=NowTop;
              cEdit.Left:=CompLeftBase;
              cEdit.Width:=CompWidth;
              cEdit.Ctl3D:=False;
              NowTop:=NowTop+cEdit.Height+Space+LabelHeight;
              ArrCompHeight:=cEdit.Height+Space;
           end;
           i:=i+1;
           lQuery.Next;
        end;
        NowTop:=TopBase;
        lQuery.First;
        While not lQuery.Eof do      //初始化Label控件数组
        begin
           cLabel:=TLabel.Create(Self);
           cLabel.Name:=LabelName+SysUtils.IntToStr(j);
           cLabel.ComponentIndex:=j;
           cLabel.Visible:=False;
           cLabel.Parent:=GroupBox3;
           cLabel.Top:=NowTop;
           cLabel.Left:=LabelLeftBase;
           if lQuery.FieldByName('FT_Must').AsString.Equals('1') then
           MustFlag:='  *'
           else
           MustFlag:='';
           cLabel.Caption:=lQuery.FieldByName('FT_TypeField').AsString+MustFlag;
           NowTop:=NowTop+cLabel.Height+Space+ArrCompHeight[j-LabelIndexBase];
           j:=j+1;
           lQuery.Next;
        end;

        for i:=0 to NowFieldCount-1 do        //全部创建完成后统一显示
        begin
           if (Components is TEdit) then
              (Components as TEdit).Visible:=True
           else if (Components is TDateEdit) then
                   (Components as TDateEdit).Visible:=True
           else if (Components is TMemo) then
                   (Components as TMemo).Visible:=True;
           if (Components[i+LabelIndexBase] is TLabel) then
              (Components[i+LabelIndexBase] as TLabel).Visible:=True;
        end;
        if NowTop>500 then
        begin
           GroupBox3.Height:=NowTop+89+20;  //89为最大控件TMemo的高度
        end else
        begin
           GroupBox3.Height:=524;
        end;
      end;
   finally
      lQuery.Free;
   end;
end;
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-1-11 14:55:41 | 显示全部楼层
谢谢阿朗大哥了
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-1-11 16:03:14 | 显示全部楼层
朗哥看到了吗?
回复 支持 反对

使用道具 举报

发表于 2007-1-11 16:09:28 | 显示全部楼层
1 动态生成的控件,不用对Name赋值,没有用
2 你对ComponentIndex赋值要干什么,如果是控制Tab顺序的话,请设置TabOrder属性
3 为什么每个控件都是创建时候设置Visible为False,最后再True,不要这样,这里用到了太多的is,这样比较影响速度
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-1-11 16:14:38 | 显示全部楼层
1.第一次这么用,不知道用不用指定名称,所以对name负值了。
2.我是想实现一个空间数组的效果,所以对ComponentIndex负值,然后通过这个INDEX值来取控件中的值
3.这个Visible为False也是我后来才加上的,因为速度太慢了,创建的时候会一直闪,所以这么做了
回复 支持 反对

使用道具 举报

发表于 2007-1-11 16:15:00 | 显示全部楼层
4 设置控件的left  top 最好用BoundsRect一次设置位置和高度宽度
回复 支持 反对

使用道具 举报

发表于 2007-1-11 16:16:45 | 显示全部楼层
看样子你是要动态生成一些控件,让用户输入内容的,如果是这样,可以用代码动态生成自定义数据集,然后用DataRecordView直接表现这个数据集就可以了,非常方便
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-1-11 16:21:48 | 显示全部楼层
不行啊,速度仍然是那样。我取消了对name 的负值,取消了对于Visible的负值,取消了有Is的for循环,仍然那样
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Justep Inc.

GMT+8, 2024-12-23 15:46 , Processed in 0.038054 second(s), 15 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表