首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > .NET >

动态生成控件、caption赋值疏失

2012-09-01 
动态生成控件、caption赋值出错。动态生成按钮控件。。。//一行4个,现在的问题是只要最后一个按钮数是四的倍数

动态生成控件、caption赋值出错。
动态生成按钮控件。。。//一行4个,现在的问题是只要最后一个按钮数是四的倍数取值就乱了。
单步调试时是正常的。。。
procedure TjobInfoForm.btnCreate();
var
  i:Integer;
  j:Integer;
  heights:Integer;
  widths:Integer;
  tops:Integer;
  num:Integer;
  row:Integer;
  isActivity:Boolean;

begin
  heights:=73;
  widths:=89;
  tops:=25;
  num:=0;
  isActivity:=True;
  with DataModule2.EmpQuery do
  begin
  First;
  SetLength(controlBtn,RecordCount);
  if RecordCount>4 then
  begin
  if RecordCount mod 4<>0 then //计算出一共要多少行控件组 4个/组
  row:=RecordCount div 4+1
  else row:=RecordCount div 4;
  while isActivity do
  begin
  for i:=0 to row-1 do
  begin
  if i=0 then tops:=25
  else
  tops:=i*(25+heights)+20;
  for j:=0 to 3 do
  begin
  if j=0 then
  begin
  controlBtn[num] := TsBitBtn.Create(nil);
  controlBtn[num].Parent := btnPanel;
  controlBtn[num].caption:=Fields.Fields[0].AsString;
  Next;
  controlBtn[num].height:=heights;
  controlBtn[num].width:=widths;
  controlBtn[num].left:=60;
  controlBtn[num].top:=tops;
  end

  else
  begin
  inc(num);
  if RecordCount=num+1 then
  begin
  isActivity:=false;
  num:=0;
  Break;
  end;
  controlBtn[num] := TsBitBtn.Create(nil);
  controlBtn[num].Parent := btnPanel;
  controlBtn[num].caption:=Fields.Fields[0].AsString;
  Next;
  controlBtn[num].height:=heights;
  controlBtn[num].width:=widths;
  controlBtn[num].left:=j*(20+widths)+60;
  controlBtn[num].top:=tops;
  end;
  end;

  end;
  end;
  end

  else
  begin
  while isActivity do
  begin
  for j:=0 to 3 do
  begin
  if j=0 then
  begin
  controlBtn[num] := TsBitBtn.Create(nil);
  controlBtn[num].Parent := btnPanel;
  controlBtn[num].caption:=Fields.Fields[0].AsString;
  Next;
  controlBtn[num].height:=heights;
  controlBtn[num].width:=widths;
  controlBtn[num].left:=60;
  controlBtn[num].top:=tops;
  end
  else
  begin
  inc(num);
  controlBtn[num] := TsBitBtn.Create(nil);
  controlBtn[num].Parent := btnPanel;
  controlBtn[num].caption:=Fields.Fields[0].AsString;
  Next;
  controlBtn[num].height:=heights;
  controlBtn[num].width:=widths;
  controlBtn[num].left:=j*(20+widths);
  controlBtn[num].top:=tops;
  if RecordCount=num+1 then
  begin
  isActivity:=false;
  num:=0;
  end;
  end;
  end;
  end;


  end;
  end;

end;


由于子窗体提交修改后要及时更新界面,控制界面的刷新代码如下。注:
timerResult是一个全局变量,jobInfo接收来自子窗体AjobInfoAdd的修改。
 
procedure TjobInfoForm.timerTimer(Sender: TObject);
begin
  if timerResult then
  begin
  destoryControl();
  treeViewCreate();
  btnCreate();
  timerResult:=False;
  end;
end;



下面是jobInfo控件释放代码:

procedure TjobInfoForm.destoryControl();
var
  i:integer;
begin
  Node1:=nil;
  tv1.Items.Clear;
  with DataModule2.EmpQuery do
  begin
  for i:=0 to RecordCount-1 do
  controlBtn[i].Free;
  Close;
  Open;
  end;
end;

jobInfoAdd窗体提交事件
procedure TjobInfoAddForm.enterBtnClick(Sender: TObject);
begin
  with DataModule2.tempQuery do
  begin
  SQL.Clear;
  ExecSQL();
  end;
  timerResult:=True;
  jobInfoAddForm.Close;
end;

[解决办法]
请试试用下面的代码代替你的同名过程:

Delphi(Pascal) code
procedure TjobInfoForm.btnCreate;//既然没参数,那对括号就省去也罢(过程定义的地方同时省去)const heights:Integer=73;      widths:Integer=89;      tops:Integer=25;var num:Integer;    row,col:Integer;begin  num:=0;  row:=0;  col:=0;  with DataModule2.EmpQuery do begin    SetLength(controlBtn,RecordCount);    First;    while not Eof do begin      controlBtn[num] := TsBitBtn.Create(nil);      controlBtn[num].Parent := btnPanel;      controlBtn[num].caption:=Fields.Fields[0].AsString;      controlBtn[num].height:=heights;      controlBtn[num].width:=widths;      controlBtn[num].left:=col*(20+widths)+60;;      controlBtn[num].top:=row*(tops+heights)+20;      inc(num);      inc(col);      if col>3 then begin        col:=0;        inc(row);      end;      Next;    end;  end;end; 

热点排行