一个窗体上有32个Label和Edit控件。它们visible的属性为False(均为隐藏)。取数据库的数据赋予Lable的Caption属性,并使之为可视,同时改变Edit的Visible的属性为可视(如果数据库中只有5条记录,那么Label和Edit从1开始只显示5个,其它的还为隐藏)。
为何在程序中label可以使现。
for i:=0 to ADOQadd.RecordCount -1 do
begin
frmComponent:= Components[i];
if frmComponent is TLabel then
  begin
   (frmComponent as TLabel).Visible:=True;
   (frmComponent as TLabel).Caption:=Trim(ADOQadd.FieldValues['account_hz'])+':';
  end;
end
而Edit就不行
frmComponent:= Components[i]; 
从i:=0开始就显示不出来,改为:frmComponent:= Components[33+i]后就可以,而且每打一次窗体Edit的显示顺序就发生变化(没有从Edit1顺序的把visible改为True),Label正常

解决方案 »

  1.   

    for i:=0 to aForm.ComponentCount-1 do
        begin
          if aForm.Components[i] is TEdit then
            begin
              TEdit(Components[i]).Enabled:=a;
            end;
          if aForm.Components[i] is TLabel then
            begin
              TLabel(Components[i]).Enabled:=a;
            end;
        end;
    自己再个循环
      

  2.   

    用aForm.ComponentCount-1的话窗体上Edit和Label就会全部显示出来。而且还要把录入的数据再写入到数据库中,那么怎样确定Edit中的数据写入那个字段。
      

  3.   

    if aForm.Components[i] is TLabel then
    或者
    if aForm.Components[i] is TEdit then 
    就可以分开TLable和TEdit。
      

  4.   

    我就是这样作的呀!
    if aForm.Components[i] is TEdit Then 如果i=0的话,它就显示不出来,i=34+i的话就可以。
      

  5.   

    代码如下:
    procedure TForm9.FormShow(Sender: TObject);
    var
      ADOQadd:TADOQuery;
      ADOgwgz:TADOQuery;
      frmComponent:TComponent;
      i:integer;
      year,month:string;
    begin
      ADOQadd:=TADOQuery.Create(self);
      ADOgwgz:=TADOQuery.Create(self);
      frmComponent:=TComponent.Create(owner);
      ADOgwgz.Connection:=MainForm.ADOConnection1;
      ADOQadd.Connection:=MainForm.ADOConnection1;
      year:=FormatDateTime('yyyy',Now);
      month:=FormatDateTime('mm',Now);
      MaskEdit2.Text:=year+'年'+month+'月';
      ADOQadd.Active:=False;
      ADOQadd.SQL.Clear;
      ADOQadd.SQL.Add('select * from '+TableName_rec+';');
      ADOQadd.Prepared;
      ADOQadd.Active:=True;
      ADOQadd.Open;
      ADOQadd.First;
      E_Count:=ADOQadd.RecordCount;
      for i:=0 to E_count do
         begin
          frmComponent:= Components[i];
          if frmComponent is TEdit then
            begin
              (frmComponent as TEdit).Visible:=True;
              (frmComponent as TEdit).Hint:=Trim(ADOQadd.FieldValues['account_colum']);
              IF Trim(ADOQadd.FieldValues['account_colum'])='gwgz' Then
                Begin
                  With ADOgwgz Do
                    Begin
                     SQL.Clear;
                     SQL.Add('Select post_level.level_money From post_level,worker');
                     SQL.Add(' Where worker.work_id="'+Temp_id+'" and post_level.post_class=worker.work_post');
                     SQL.Add(' And post_level.level_class=worker.work_level;');
                     Prepared;
                     Open;
                    End;
                    IF ADOgwgz.RecordCount > 0 Then
                      (frmComponent as TEdit).Text:=ADOgwgz.FieldValues['level_money']
                    Else
                      (frmComponent as TEdit).Text:=inttostr(i);
                    ADOgwgz.Close;
                End
              Else
               (frmComponent.Components[i] as TEdit).Text:=inttostr(i);
             End;
             if frmComponent is TLabel then
                begin
                 (frmComponent as TLabel).Visible:=True;
                 (frmComponent as TLabel).Caption:=Trim(ADOQadd.FieldValues['account_hz'])+':';
                end;
            ADOQadd.Next;
         End;
      frmComponent.Free;
    end;
      

  6.   

    看看这个对你有帮助!http://expert.csdn.net/Expert/topic/2611/2611370.xml?temp=.5052454
      

  7.   

    如果是一种类型的控件就没有问题。label可以使用,但edit控制起来比较复杂。不知那里有没有例子。