delphi7从表字段创建组件

时间:2013-06-19 03:56:33

标签: delphi

我想从表中在Delphi 7中的运行时创建组件(面板),但只有在字段值为>时才会创建。例如:
widht | p1 | p2 | p3 | p4 | p5 | p6 | p7 | .. | px |
1500 | 5 | 5 | 5 | 0 | 0 | 0 | 0 | .. | 0 | //创建3个面板
2700 | 5 | 5 | 5 | 6 | 6 | 0 | 0 | .. | 0 | //创建5个面板
.......

 private
{ Private declarations }
pn : array of TPanel;
..................................

procedure TForm1.Button1Click(Sender: TObject);
var i: integer;
oldpn: TComponent;
begin
table1.SetKey;
table1.FindNearest([form2.Edit2.Text]);
i:= table1.FieldCount;
SetLength(pn, i);
for i:= 1 to i-1 do
 begin
  oldpn:= Findcomponent('pn'+inttostr(i));
  oldpn.Free;
  pn[i]:= TPanel.Create(form1);
  pn[i].Parent := form1;
  pn[i].Caption := 'Panel' + inttostr(i);
  pn[i].Name := 'pn'+inttostr(i);
  pn[i].Height := table1.Fields[i].Value ;
  pn[i].Width := 500;
  pn[i].Color:=clGreen;
  pn[1].Top := form1.ClientHeight - pn[1].Height;
  if (i > 1) then pn[i].Top := pn[i-1].Top - pn[i].Height;
  pn[i].OnClick := pnClick;
 end;
end;

这段代码创建了面板,但适用于所有字段。我希望能够仅从值为>的字段声明'pn'数组; 0 ...
我试过了:
如果table1.Fields [i] .Value> 0然后
开始
我:= table1.FieldCount ....
但它不起作用。任何的想法?提前谢谢!

1 个答案:

答案 0 :(得分:1)

我会创建第二个“计数器”,它跟踪你在数组中实际设置的元素数量。我将数组设置为最大可能的长度(你现在的Table1.FieldCount)。然后,在遍历所有字段后,将数组的长度设置为“计数器”值。

类似的东西:

procedure TForm1.btn1Click(Sender: TObject);
var i: integer;
oldpn: TComponent;
count: Integer; // this keeps count of the number of panels you'll be creating
begin
  tbl1.SetKey;
  tbl1.FindNearest([form2.Edit2.Text]);
  i := tbl1.FieldCount;
  SetLength(pn, i);
  count := 0; // initialise count to 0
  for i := 1 to i - 1 do
    if tbl1.fields[1].value > 0 then
    begin
      oldpn := Findcomponent('pn' + inttostr(count));
      oldpn.Free;
      pn[count] := TPanel.Create(form1);
      pn[count].Parent := form1;
      pn[count].Caption := 'Panel' + inttostr(count);
      pn[count].Name := 'pn' + inttostr(count);
      pn[count].Height := tbl1.fields[count].value;
      pn[count].Width := 500;
      pn[count].Color := clGreen;
      pn[0].Top := form1.ClientHeight - pn[0].Height;
      if (count > 0) then
        pn[count].Top := pn[count - 1].Top - pn[count].Height;
      pn[count].OnClick := pnClick;
      inc(count);
    end;

  SetLength(pn, count); // re-adjust length of array
end;

可能有更好的方法来实现它,但这看起来很简单。

另外,您的行:

pn[1].Top := form1.ClientHeight - pn[1].Height;

您是否尝试将其设置为表单的底部?您可能最好将该行更改为(以及下一行)一个if语句,以防止每次循环循环时执行该行:

if (count = 0) then
  pn[0].Top := form1.ClientHeight - pn[0].Height;
else
  pn[count].Top := pn[count - 1].Top - pn[count].Height;