3

我有一个包含 16 个 TCheckBox 和 32 个 TEditBox 的表单。每 2 个 TEditBox 启用能力取决于复选框状态。所以我使用这个太长的代码:

//T1
procedure TOFAddForm.T1Click(Sender: TObject); 
begin
     Q1.Enabled:=T1.Checked;
     P1.Enabled:=T1.Checked; 
     Q1.OnChange(Sender);
end;

.  
.
.

//T16
procedure TOFAddForm.T16Click(Sender: TObject); 
begin
     Q16.Enabled:=T16.Checked;
     P16.Enabled:=T16.Checked;
     Q1.OnChange(Sender);
end;`

我使用了这段代码,但没有任何反应:

procedure TOFAddForm.T1Click(Sender: TObject);
var Q, P: TEdit;
begin
     with  Sender as TCheckBox do begin
           Q.Name:='Q'+copy(Name,1,2);
           P.Name:='P'+Copy(Name,1,2);
           Q.Enabled:=Checked;
           P.Enabled:=Checked;
     end;
     Q1.OnChange(Sender);
end;

谢谢你。

4

3 回答 3

9

如果所有复选框和编辑的名称一致,则可以将此 OnClick 事件添加到所有复选框:

procedure TOFAddForm.TClick(Sender: TObject);
var 
  C: TCheckBox;
  Q, P: TEdit;
  N: string;
begin
  C := Sender as TCheckBox;
  N := Copy(C.Name, 2, Length(C.Name));
  Q := FindComponent('Q' + N) as TEdit;
  P := FindComponent('P' + N) as TEdit;
  Q.Enabled := C.Checked;
  P.Enabled := C.Checked;
  Q.OnChange(Sender);
end;
于 2011-10-01T08:59:59.000 回答
3

我建议您将TEdit指针存储到数组中,然后将该TCheckBox.Tag属性用作数组的索引,例如:

var
  Edits: array[0..15, 0..1] of TEdit;

procedure TOFAddForm.FormCreate(Sender: TObject);
var
  K: Integer;
begin
  for k := 0 to 15 do
  begin
    Edits[k, 0] := FindComponent('Q' + IntToStr(k+1)) as TEdit;
    Edits[k, 1] := FindComponent('P' + IntToStr(k+1)) as TEdit;
    (FindComponent('T' + IntToStr(k+1)) as TCheckBox).Tag := k;
end;

procedure TOFAddForm.T1Click(Sender: TObject);
begin
  with Sender as TCheckBox do
  begin
    Edits[Tag, 0].Enabled := Checked;
    Edits[Tag, 1].Enabled := Checked;
    Edits[Tag, 0].OnChange(Sender);
  end;
end;
于 2011-10-02T02:41:27.430 回答
1

在这种情况下,我强烈建议您自己创建控件。在 OnCreate 事件处理程序中,调用TEdit.Create(Self),将对象引用存储在您自己管理的数据结构中,例如动态数组,设置属性如和事件处理程序ParentSetBoundsSender在对象引用集合中查找(可选地取决于 的值Tag) ,这几乎总是比使用FindComponent.

额外的好处是您可以轻松地更改重复控件的数量(甚至在运行时使其动态化!)并且 dfm 代码(嵌入到最终可执行文件中)包含更少几乎相同的重复数据。

于 2011-10-03T16:57:07.060 回答