动态生成控件问题,前面的帖子我都看了,还是没有解决问题,高手请进!!!没有人回答吗?我可以加分 (20分)

  • 主题发起人 主题发起人 huayf
  • 开始时间 开始时间
H

huayf

Unregistered / Unconfirmed
GUEST, unregistred user!
with ADOQuery2 do begin
......... //读表生成控件
while not Eof do begin
with Tcheckbox.Create(self) do begin
Parent := Panel1;
Caption := FieldByName('chck').Value;
Left := E;
E := E + 160;
Top := H + 35;
onclick:=CheckProc; //调用自定义过程
..........
procedure TForm2.CheckProc (Sender:TObject);
begin
改变动态生成的某个checkbox的checked的属性,该如何写?????
end;
 
你可以把建立一个TCheckBox类型的动态数组。
with Tcheckbox.Create(self) do begin
改为:CheckArr= TCheckBox.create(Self);
或是把NAME变为:DefCheck+intToStr(i);
然后用findcomponent去找。
 
请先申明变量名
Type
procedure CheckProc(Sender: TObject);
private
MyCheckbo:array [0..99] of TCheckbox;//变量多少你自己定,或者采用动态数组。

i:=0;
with ADOQuery2 do begin
......... //读表生成控件
while not Eof do begin
MyCheckbo[:=Tcheckbox.Create(self);
with MyCheckbo[ do begin
Parent := Panel1;
Caption := FieldByName('chck').Value;
Left := E;
E := E + 160;
Top := H + 35;
Tag :=i; //用于处理相应的过程
onclick:=CheckProc; //调用自定义过程
inc(i);
..........
procedure TForm2.CheckProc (Sender:TObject);
var i:integer;
begin
i:=TComponent(Sender).Tag;
MyCheckbo.Checked:=not MyCheckbo.Checked; // 改变动态生成的某个checkbox的checked的属性,该如何写?????
end;
 
while not Eof do begin
MyCheckbo[:=Tcheckbox.Create(self);
with MyCheckbo[ do begin
Parent := Panel1;
Caption := FieldByName('chck').Value;
Left := E;
E := E + 160;
Top := H + 35;
Tag :=i; //用于处理相应的过程
onclick:=CheckProc; //调用自定义过程
inc(i);
if Checked=true then begin
showmessage('ok');
with ADOQuery3 do begin
Close;
SQL.Text := Format('update answ set jilu=''true'' where name=%s and qst='''+FieldByName('chck').Value +'''',
[Quotedstr(DBCombobox1.Text)]);
showmessage(SQL.Text);
ExecSQL;
end;
end;
属性似乎没变???
 
选择checkbox提示 stack overflow;
 
procedure TForm2.CheckProc (Sender:TObject);
begin
改变动态生成的某个checkbox的checked的属性,该如何写?????
end;

你在那里面写的是
(Sender as CheckBox).Checked:=not (Sender as CheckBox).Checked吧?
呵呵,不要在它的OnClick时间里面写not CheckBox1.Checked,否则会出死循环,当然会堆栈溢出了。
使用绝对赋值可以。
(Sender as CheckBox).Checked:=True
或者
(Sender as CheckBox).Checked:=False
 
(Sender as CheckBox).Checked:=True
或者
(Sender as CheckBox).Checked:=False
可是这话本身就有些问题,语法通不过
 
草草写的,没有注意,缺了一个“T”,呵呵
(Sender as TCheckBox).Checked:=True
(Sender as TCheckBox).Checked:=False
还可以。
TCheckBox(Sender).Checked:=True
 
procedure TForm2.CheckProc (Sender:TObject);
begin
if (Sender as TCheckBox).Checked=false then begin
(Sender as Tcheckbox).Checked:=True ;
showmessage('ok');
with ADOQuery3 do begin
Close;
SQL.Text := Format('update answ set jilu=''true'' where name=%s and chck='''+(Sender as TCheckBox).Caption +'''',
[Quotedstr(DBCombobox1.Text)]);
showmessage(SQL.Text);
ExecSQL;
end ;
end
else (Sender as TCheckBox).Checked:=false;
//end;
end;
我这样写有什么错吗?为什么又是堆栈溢出???我 主要是想用户在操作时选取错了,可以重选
 
刚才敲了n多,可惜提交失败,只好重新挑大概写一下,你上面的代码,去掉对程序影响
的,如下:
procedure TForm2.CheckProc(Sender: TObject);
begin
if (Sender as TCheckBox).Checked = false then
begin
(Sender as Tcheckbox).Checked := True;
end
else
(Sender as TCheckBox).Checked := false;
end;
可以分析一下逻辑,如果初始checkBox为False,点击一下变成了True,然后
1、执行时间,如果为True ,将其改为False;如果为False,则改为True
2、步骤1的更改,导致再次产生CheckProc事件,再次执行1。
所以程序就一直在这个函数里面循环,堆栈不溢出在怪。
注意:在这种情况下,要根据情况对CheckBox直接赋值,要求赋值后再次产生的事件
不再次产生赋值事件。
或者对CheckBox产生的事件进行屏蔽。
推荐使用前者。

或者举例:

procedure TForm2.CheckProc(Sender: TObject);
begin
(Sender as TCheckBox).OnClick:=nil;

if (Sender as TCheckBox).Checked = false then
begin
(Sender as Tcheckbox).Checked := True;
end
else
(Sender as TCheckBox).Checked := false;

(Sender as TCheckBox).OnClick:=CheckProc;
end;
 
后退
顶部