求教设计思路,该怎么处理

求教设计思路

Form上面动态创建80个panel,每个panel内部各有3个checkbox。
问题来了:checkbox的勾选顺序不确定,比如,我在第n个panel里勾选了2个checkbox,如何做到我在第m个panel里勾选checkbox时,判断出第n个panel里哪几个checkbox的checked为真


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


------解决思路----------------------
你在动态生成checkbox的时候给它们赋上名字,为'chkbox'+inttostr(i);并且位置上是i小的在前面或上面,这样根据名字不就能判断了吗
------解决思路----------------------
重点是你先要找到你需要判定的TPanel,然后找到在它里面的Checkbox,然后进行判定就可以了。
1。写一个类继承自TPanel,然后扩展出TCheckBox类型字段。在创建的时候,把创建好的checkbox关联到父控件上,也就是你的TPanel派生类上。
2.你要判断的那个TPanel自己能找到把,然后访问它的TCheckBox字段来判断是否选中就可以了。
楼主不知道能看明白不
------解决思路----------------------
1、声明机构体,有三个变量,分别表示CheckBox的Parent的名称,CheckBox的名称,以及选中状态。
2、创建一个列表,创建80*3个1中定义的结构体,每个结构体对应一个CheckBox。
3、CheckBox的OnClick中,从列表中找到对应的结构体,并把新的状态赋值。
4、写一个函数:GetState(sParentName: string; sCheckBoxName: string):boolean,根据Parent的名字和CheckBox的名字从2中创建的列表中获取对应的结构体,并获取CheckBox选中状态返回。
5、前提是你在动态创建控件时命名要有规律。
------解决思路----------------------
下面代码是用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序号