待解决问题

【精华】类和对像第一讲中作业离问题结束时间还有237天20小时

学员:ntwuhaohao提问时间:2008-09-01 09:49:44

第一外作业我用c#重新把金教师代码编译了一下,错误提示确保没有无限递归或无限循环
//主窗体FrmMain
namespace FormToFrom
{
public partial class FrmMain : Form
{
FrmOther frmOther;


public FrmMain()
{
InitializeComponent();
frmOther = new FrmOther();
frmOther.Show();
}

//主窗体中显示的数值
public void SetValue(int value)
{
numericUpDown1.Value = value;
}
//把主窗体numericUpDown1值传给从窗体
private void numericUpDown1_ValueChanged(object sender, EventArgs e)
{
frmOther.WorkDownPercent =(int)numericUpDown1.Value;
}
}
}
//从窗体FrmOther
namespace FormToFrom
{
public partial class FrmOther : Form
{
FrmMain frmMain=new FrmMain () ;
public FrmOther()
{
InitializeComponent();
f
}

//从窗体属性
public int WorkDownPercent
{
get { return progressBar1.Value; }
set
{
progressBar1.Value = value;
lblInfo.Text =String.Format("{0}%",progressBar1.Value);
}
}
private void btnAdd_Click(object sender, EventArgs e)
{
ChangeProgressBarValue(true);
}
private void ChangeProgressBarValue(bool IsIncrease)
{
if (IsIncrease) //加法
{
if (progressBar1.Value >= 100)
{
progressBar1.Value = 0; //重新开始
}
else
{
progressBar1.Value += 2;
}
}
else //减值
{
if (progressBar1.Value == 0)
{
progressBar1.Value = 0; //不能再减了
}
else
{
progressBar1.Value -= 2;
}
}
lblInfo.Text=String.Format("{0}%",progressBar1.Value);
frmMain.SetValue(progressBar1.Value);
}
private void btnDelete_Click(object sender, EventArgs e)
{
ChangeProgressBarValue(false);
}
}
}
一点提外话:在WEB版绘图程序中,第一次装载正常,点了绘制按钮后,只有一个圆在面板上,无论递归次数,小圆数....如何变化只有一个圆

回答

回答人:金旭亮回答时间:2008-09-02 09:26:24
问题出在从窗体字段:
FrmMain frmMain=new FrmMain () ;它将在从窗体对象创建时自动创建一个主窗体。
看看主窗体构造函数:
public FrmMain()
{
InitializeComponent();
frmOther = new FrmOther();
frmOther.Show();
}
因此必然会出现无限递归。
解决方法:
从窗体字段:
FrmMain frmMain=null;
主窗体构造函数:
public FrmMain()
{
InitializeComponent();
frmOther = new FrmOther();
frmOther.frmMain=this;
frmOther.Show();
}
回答人:ntwuhaohao回答时间:2008-09-02 15:37:15
frmOther.frmMain=this; //这句是什么意思,不明白?
我觉得应该这样:
//主窗体
FrmOther frmOther;
public FrmMain() //主窗体构造函数
{
FrmMain frmMain;
InitializeComponent();
frmOther = new FrmOther();
frmOther=this.frmMain
frmOther.Show();
}
回答人:ntwuhaohao回答时间:2008-09-03 09:21:10
我现在以经调试出来,有几处不太明白
//从窗体
FrmMain frmMain=null ;
public FrmOther(FrmMain frm) //有参构造函数她有什么作用?
{
InitializeComponent();

frmMain = frm; //为什么要这样做?

}
回答人:polarstar (.NET学习顾问)回答时间:2008-09-03 09:55:18
1.先说一下出现无限循环的问题:
金老师已经找到了问题的所在和解决的方法了。
程序开始运行时已经运行了主窗体了,Application.Run(new frmMain())创建主窗体实例,这时frmMain的构造函数创建了一个子窗体frmOther = new FrmOther();,当你new子窗体的时候,就会执行下面代码(要知道这行代码是先于构造函数执行的):
FrmMain frmMain=new FrmMain () ;
而这行代码new时又会在构造函数创建子窗体frmOther = new FrmOther();,子子孙孙无穷溃也,就造成无限递归了。
2.为什么要用有参数的构造函数呢
通过子窗体public FrmOther(FrmMain frm)构造函数把主窗体第一次创建时的对象传给子窗体,就避免了不断创建(new)了,这样主窗体只有一个,子窗体也只有一个。
3.说点题外话。作为正式程序设计,一般不这样做,因为这样两个窗体依赖太强了,不符合设计的原则,可以在子窗体通过消息通知主窗体的方式来改善设计,这样不但能避免整个窗体传递,还可以避免子窗体误使用主窗体的资源。这点作为初学可以不做要求。
4.关于你的“WEB版绘图”的题外话
我不知道你的代码是怎样的,有没有做修改,所以无法回答。如果还没有解决你可以发份代码来看看:zhyuanshan@163.com
回答人:ntwuhaohao回答时间:2008-09-03 14:31:25
谢谢张大哥

我要回答

您还没有登录,请登录!