用xxx.ControlCount和xxx.Conrols[]可以遍历指定的窗体或控件的子控件,然后对于取到的子控件obj,
可以用obj is TCheckBox之类的方法来判断是否为CheckBox,如果是的话就可以将它强制类型转换为TCheckBox之后来判断是否被选择了。

解决方案 »

  1.   

    你在动态生成checkbox的时候给它们赋上名字,为'chkbox'+inttostr(i);并且位置上是i小的在前面或上面,这样根据名字不就能判断了吗
      

  2.   

    to 2楼,勾选checkbox时不是按顺序选的,也可能先后面再前面。
    再补充描述一下,panel和其内的checkbox看做是一个多选题,怎样在做多选题时知道上一道多选题checkbox勾的哪几个?
      

  3.   

    to1楼,你的方法也是我目前能想到的方法,问题是难道要每一个ckeckbox点击事件都来次遍历判断吗?能不能只判断上一个点过的panel内ckeckbox的情况?
      

  4.   

    想到一个办法了,设置每个panel的tag,用一个变量记录当前点击checkbox的父控件也就是panel的tag,如果tag变了,则去遍历那个tag的panel进行判断,这样应该可行。
    还有其它方法吗?
      

  5.   

    重点是你先要找到你需要判定的TPanel,然后找到在它里面的Checkbox,然后进行判定就可以了。
    1。写一个类继承自TPanel,然后扩展出TCheckBox类型字段。在创建的时候,把创建好的checkbox关联到父控件上,也就是你的TPanel派生类上。
    2.你要判断的那个TPanel自己能找到把,然后访问它的TCheckBox字段来判断是否选中就可以了。
    楼主不知道能看明白不
      

  6.   

    另外,你题目的点击第n个Panel时候判断第m个TPanel的意思是什么啊?
    是判断上一次点击过的TPanel吗?
    如果是的话问题简单的多了,设置一个全局变量TPanel,FormCreate里初始化为nil
    在点击checkbox的时候就将checkbox.parent 存到全局变量里。这样不就可以很方便的判断了吗》
      

  7.   

    1、声明机构体,有三个变量,分别表示CheckBox的Parent的名称,CheckBox的名称,以及选中状态。
    2、创建一个列表,创建80*3个1中定义的结构体,每个结构体对应一个CheckBox。
    3、CheckBox的OnClick中,从列表中找到对应的结构体,并把新的状态赋值。
    4、写一个函数:GetState(sParentName: string; sCheckBoxName: string):boolean,根据Parent的名字和CheckBox的名字从2中创建的列表中获取对应的结构体,并获取CheckBox选中状态返回。
    5、前提是你在动态创建控件时命名要有规律。
      

  8.   

    你说的方法能理解,但是第一条超过我能力了,如果你有空帮我写一个我学习一下,如果比较忙也没关系,学习到了新思路,谢谢!第二条知道怎么做,就是遍历吧.
    ps:如果动态创建控件名name很有规律,能不能直接用控件名来操作呢,比如按'Panel'+inttostr(i)这样命名的,怎么才可以不遍历直接使用?
      

  9.   

    是判断上次点过的TPanel,你的理解和解答是对的.
      

  10.   

    记录上一次状态就行了。
    简单的就是记录上次点击是在哪个Panel 中...., 复杂一些就是将点击的过程全部记录下来,放进一个点击队列中。
      

  11.   

    TList,应该用过吧?很好用的东西
      

  12.   

    下面代码是用tag实现的:var
      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;
      

  13.   

    如果点击同一个panel内的checkbox还要判断上一次另外一个panel内的checkbox状态,将n修改为全局变量,
    FormCreate   n := -2;
    XCheckboxClick中
       if (BJ <> -1) and (n <> BJ) then  // 不是初始状态并且不是点击同一个panel内的checkbox
       begin
         n := BJ;
       end;
      

  14.   

    动态创建80个panel,每个panel内部各有3个checkbox
    并把它们赋值给对应的 控件数组
    并给每个控件设置不同的tag、相同的事件函数事件函数根据tag知道被操作的自己是谁
      

  15.   

    哦,还有个简单的问题,http://bbs.csdn.net/topics/390890518,这个能突破限制不?
      

  16.   

    用过,用TList管理控件能实现控件数组一样的功能吧.你说的结构体没用过