我有一个包含16个TCheckBox和32个TEditBox的表单。 每2个TEditBox能力取决于checkBox状态。 所以我使用的代码太长了:
//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;
谢谢。
答案 0 :(得分: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;
答案 1 :(得分: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;
答案 2 :(得分:1)
我强烈建议在这种情况下自己创建控件。在OnCreate事件处理程序中,调用TEdit.Create(Self)
,将对象引用存储在您自己管理的数据结构中,例如动态数组,在对象引用集合中设置Parent
,SetBounds
和eventhandler等属性,以及查找Sender
(可选取决于Tag
的值),这几乎总是比使用FindComponent
更高效。
增加奖励你可以轻松改变重复控件的数量(甚至在运行时使其动态化!)和dfm-code(嵌入到最终的可执行文件中)包含的几乎相同的重复数据。