我这种动态RadioButton的布尔值便是方法怎么错了? ( 积分: 100 )

  • 主题发起人 主题发起人 小笨笨的哥哥
  • 开始时间 开始时间

小笨笨的哥哥

Unregistered / Unconfirmed
GUEST, unregistred user!
我在一个Form1上放置了两个TGroupBox:GroupBox1,GroupBox2;三个TButton:Button1,Button2,Button3.一个TEdit:Edit1;

button1的作用是按Edit1.text输入的数动态产生一定数量的RadioButton按钮;Button2的作用是检查哪个 Radiobutton被选择了,然后动态产生一组CheckBox Button3的作用是关闭窗口。
主要代码如下,请高手指点:

定义全局变量
var
N,M:integer;
RadioButtonN:TRadioButton;
CheckBoxN:TCheckBox;

Button1的过程:

begin
M:=StrToInt(Edit1.Text);
N:=1;
while N<=M do
begin
RadioButtonN:=TRadioButton.create(GroupBox1);
RadioButtonN.Parent:=GroupBox1;
RadioButtonN.Caption:=IntToStr(N);
RadioButtonN.Top:=20*N;
RadioButtonN.Left:=20;
end
end;
Button2的过程是:
begin
N:=1;
while N<=M do
begin
if RadioButtonN.Checked=True then
begin
CheckBoxN:=TCheckBox.Create(GroupBox2);
CheckBoxN.Parent:=GroupBox2;
CheckBoxN.Caption:=IntToStr(N);
CheckBoxN.Top:=20*N;
CheckBoxN.Left:=20;
N:=M+1;
end
else
N:=N+1
end;

Button3的过程
begin
close;
end.

利用F7跟踪时发现,Button1的过程正常,假设产生了五个RadioButton,我选择RadioButton3 后,按下Button2按钮,可以执行if语句。但所有的判断都为False!do语句无法执行。如果把if条件改为:RadioButtonN.Checked=False,也就是说无论我是否点哪一个RadioButton,所有的RadioButtonN.Checked的布尔值都是False,请高手告诉我,我的那种表示方法怎么不对?.

请高手指点!
 
我在一个Form1上放置了两个TGroupBox:GroupBox1,GroupBox2;三个TButton:Button1,Button2,Button3.一个TEdit:Edit1;

button1的作用是按Edit1.text输入的数动态产生一定数量的RadioButton按钮;Button2的作用是检查哪个 Radiobutton被选择了,然后动态产生一组CheckBox Button3的作用是关闭窗口。
主要代码如下,请高手指点:

定义全局变量
var
N,M:integer;
RadioButtonN:TRadioButton;
CheckBoxN:TCheckBox;

Button1的过程:

begin
M:=StrToInt(Edit1.Text);
N:=1;
while N<=M do
begin
RadioButtonN:=TRadioButton.create(GroupBox1);
RadioButtonN.Parent:=GroupBox1;
RadioButtonN.Caption:=IntToStr(N);
RadioButtonN.Top:=20*N;
RadioButtonN.Left:=20;
end
end;
Button2的过程是:
begin
N:=1;
while N<=M do
begin
if RadioButtonN.Checked=True then
begin
CheckBoxN:=TCheckBox.Create(GroupBox2);
CheckBoxN.Parent:=GroupBox2;
CheckBoxN.Caption:=IntToStr(N);
CheckBoxN.Top:=20*N;
CheckBoxN.Left:=20;
N:=M+1;
end
else
N:=N+1
end;

Button3的过程
begin
close;
end.

利用F7跟踪时发现,Button1的过程正常,假设产生了五个RadioButton,我选择RadioButton3 后,按下Button2按钮,可以执行if语句。但所有的判断都为False!do语句无法执行。如果把if条件改为:RadioButtonN.Checked=False,也就是说无论我是否点哪一个RadioButton,所有的RadioButtonN.Checked的布尔值都是False,请高手告诉我,我的那种表示方法怎么不对?.

请高手指点!
 
把 RadioButton 变量放到数组A : array [n] of TRadioButton 中,用数组下标循环应该就可以了,在button2中:
begin
N:=1;
while N<=M do
begin
if A[n].Checked=True then
begin
CheckBoxN:=TCheckBox.Create(GroupBox2);
CheckBoxN.Parent:=GroupBox2;
CheckBoxN.Caption:=IntToStr(N);
CheckBoxN.Top:=20*N;
CheckBoxN.Left:=20;
N:=M+1;
end
else
N:=N+1
end;
 
if RadioButtonN.Checked=True then

怎么能这样用的呢 ,RadioButtonN , N 是什么,你是不是刚刚学编程?

你在这里不管是 RadioButton 还是 CheckBox, 都要 用动态数组保存,RadioButtonN 你以为是很多个RadioButton 吗,其实就是一个,最后建立的那一个!!!!

还有,也可以用 TobjectList,
 
谢谢,我终于明白了,radiobuttonN只是一个变量,在它所占的内存单元中只存储了最后一个的值!谢谢!
你说的很正确,我是刚开始学编程。

已经把分平分给了二位,别嫌少!
 
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, Contnrs, StdCtrls;

type
TForm1 = class(TForm)
Button1: TButton;
Edit1: TEdit;
GroupBox1: TGroupBox;
GroupBox2: TGroupBox;
Button2: TButton;
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
checkBoxList: TObjectList;
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
checkBoxList:=TObjectList.Create;
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
checkBoxList.Free
end;

procedure TForm1.Button1Click(Sender: TObject);
var
i: integer;
rbtn: TRadioButton;
begin
i:=1;
while i<= strtoint(edit1.Text) do
begin
rbtn:=TRadioButton.Create(self);
rbtn.Parent:=GroupBox1;
rbtn.Caption:=IntToStr(i);
rbtn.Top:=20*i;
rbtn.Left:=20;
checkBoxList.Add(rbtn);
inc(i);
end;
end;

procedure TForm1.Button2Click(Sender: TObject);
var
i: integer;
begin
for i:=0 to checkBoxList.Count-1 do
if TcheckBox(checkBoxList.Items).Checked then
with TCheckBox.Create(GroupBox2) do
begin
Parent:=GroupBox2;
Caption:=IntToStr(i+1);
Top:=20*(i+1);
Left:=20;
end;

end;

end.
 
后退
顶部