用xxx.ControlCount和xxx.Conrols[]可以遍历指定的窗体或控件的子控件,然后对于取到的子控件obj,
可以用obj is TCheckBox之类的方法来判断是否为CheckBox,如果是的话就可以将它强制类型转换为TCheckBox之后来判断是否被选择了。
可以用obj is TCheckBox之类的方法来判断是否为CheckBox,如果是的话就可以将它强制类型转换为TCheckBox之后来判断是否被选择了。
解决方案 »
- 2010环境下,加解密的方法用不了了,请高手帮忙
- 有关delphi 窗体 foucs 设置的问题,高手来帮帮~~!
- 怎样实现在GRID中的行合并问题?
- EDIT中输入金额的问题,HELP
- ISAPI 程序在 Win2003 下的 IIS6.0 中无法运行!
- 调查(来者有分):现在用delphi做分布式系统,真正用MIDAS的多吗?或者大家都在用什么做分布式系统?
- 如何拦截滚动条消息
- 请教画心形的算法!
- <<<< 花啦啦的500分没人动心吗?哈哈哈的笑话没人想看吗?
- 抢分问题,快…………请帮帮我,关于TreeView的Imagelist的问题
- delphi 7 画面可以合成一体吗
- 谁能推荐一个有三种可选状态的控件!
再补充描述一下,panel和其内的checkbox看做是一个多选题,怎样在做多选题时知道上一道多选题checkbox勾的哪几个?
还有其它方法吗?
1。写一个类继承自TPanel,然后扩展出TCheckBox类型字段。在创建的时候,把创建好的checkbox关联到父控件上,也就是你的TPanel派生类上。
2.你要判断的那个TPanel自己能找到把,然后访问它的TCheckBox字段来判断是否选中就可以了。
楼主不知道能看明白不
是判断上一次点击过的TPanel吗?
如果是的话问题简单的多了,设置一个全局变量TPanel,FormCreate里初始化为nil
在点击checkbox的时候就将checkbox.parent 存到全局变量里。这样不就可以很方便的判断了吗》
2、创建一个列表,创建80*3个1中定义的结构体,每个结构体对应一个CheckBox。
3、CheckBox的OnClick中,从列表中找到对应的结构体,并把新的状态赋值。
4、写一个函数:GetState(sParentName: string; sCheckBoxName: string):boolean,根据Parent的名字和CheckBox的名字从2中创建的列表中获取对应的结构体,并获取CheckBox选中状态返回。
5、前提是你在动态创建控件时命名要有规律。
ps:如果动态创建控件名name很有规律,能不能直接用控件名来操作呢,比如按'Panel'+inttostr(i)这样命名的,怎么才可以不遍历直接使用?
简单的就是记录上次点击是在哪个Panel 中...., 复杂一些就是将点击的过程全部记录下来,放进一个点击队列中。
Form1: TForm1;
XPanel: array of TPanel;
XCheckbox: array of TCheckbox;
BJ : integer;
implementation{$R *.dfm}procedure TForm1.FormCreate(Sender: TObject);
var
i,j,k : integer;
begin
k:= 0;
j := 0;
BJ := -1;
SetLength(XPanel,80);
SetLength(XCheckbox,240); for i := 0 to 80 -1 do
begin
XPanel[i] := TPanel.Create(Self);
XPanel[i].Parent := Form1;
XPanel[i].Top := 22 + k * 100 ;
XPanel[i].Left := 15 + 200*j;
XPanel[i].Height := 100;
XPanel[i].Width := 200;
k := k+1;
if (i+1) mod 10 = 0 then
begin
k := 0;
j := j + 1;
end;
end; k := 0;
j := 0;
i := 0;
for i := 0 to 240 -1 do
begin
XCheckbox[i] := TCheckbox.Create(Self);
XCheckbox[i].Parent := XPanel[j];
XCheckbox[i].Top := 8 + k * 25 ;
XCheckbox[i].Left := 5 ;
XCheckbox[i].Height := 25;
XCheckbox[i].Width := 150;
XCheckbox[i].Caption := '请选择';
XCheckbox[i].Checked := False;
XCheckbox[i].Tag := j*1000 + i; //因为是240个
XCheckbox[i].OnClick := XCheckboxClick;
k := k+1;
if (i+1) mod 3 = 0 then
begin
k := 0;
j := j + 1;
end;
end;end;
procedure TForm1.XCheckboxClick(Sender: TObject);
var
i,j,n,x,b : integer;
p,c : integer;
IsCheck : Boolean;
str : string;
begin
n := BJ; //你要查找的Panel序号
b := 0;
if n <> -1 then
begin
for j := (n*1000 + n*3) to (n*1000 + n*3 +2) do
begin
for x := 0 to 240-1 do
begin
if j = XCheckbox[x].Tag then
begin
str := BoolToStr(XCheckbox[x].Checked);
showmessage(str);
//memo.lines.add 或者其他的控件记录
b := b+1; //共三个
end;
end;
end;
end; if sender is TCheckbox then
begin
i := (sender as TCheckbox).tag;
p := i div 1000;
BJ := p; //这里记录本次点击的panel序号
c := i mod 1000;
IsCheck := XCheckbox[c].Checked;
showmessage('本次你选择的是 Panel序号:' + inttostr(p) + ' Checkbox序号:' + inttostr(c) + ' 选择状态:' + BoolToStr(IsCheck));
end;
end;
FormCreate n := -2;
XCheckboxClick中
if (BJ <> -1) and (n <> BJ) then // 不是初始状态并且不是点击同一个panel内的checkbox
begin
n := BJ;
end;
并把它们赋值给对应的 控件数组
并给每个控件设置不同的tag、相同的事件函数事件函数根据tag知道被操作的自己是谁