delphi 操作TFrame类中的控件改变属性时出现的很奇怪的问题
这个Tframe类被嵌在主窗体中,然后通过这个frame窗体中的一个按钮showmodule了另外一个form窗体作为数据新增的窗体,我是要在数据保存完毕以后关闭这个fo...
这个Tframe类被嵌在主窗体中,然后通过这个frame窗体中的一个按钮showmodule了另外一个form窗体作为数据新增的窗体,我是要在数据保存完毕以后关闭这个form窗体并且刷新frame窗体中的grid控件中的数据和一些控件属性,但是我很奇怪的发现单纯的过程和函数都可以正常执行,但是只要是含有修改frame窗体中控件属性的代码只要一执行就会报错,完全搞不清楚是怎么回事:
弹出form的按钮过程:
procedure Temployeemanagefm.addbtClick(Sender: TObject);
begin
employeemssageform:=Temployeemssageform.Create(self);
employeemssageform_unit.savestate:=false;
employeemssageform.ShowModal;
end;
form窗口关闭的时候执行的语句:
procedure Temployeemssageform.FormClose(Sender: TObject;
var Action: TCloseAction);
begin
employeemanagefm.StateEpBt.Caption:='查看离职员工';
end;
就上面这样的一行代码都无法执行,会报错
哪位达人能为在下解一下惑呢。。。? 展开
弹出form的按钮过程:
procedure Temployeemanagefm.addbtClick(Sender: TObject);
begin
employeemssageform:=Temployeemssageform.Create(self);
employeemssageform_unit.savestate:=false;
employeemssageform.ShowModal;
end;
form窗口关闭的时候执行的语句:
procedure Temployeemssageform.FormClose(Sender: TObject;
var Action: TCloseAction);
begin
employeemanagefm.StateEpBt.Caption:='查看离职员工';
end;
就上面这样的一行代码都无法执行,会报错
哪位达人能为在下解一下惑呢。。。? 展开
2个回答
展开全部
这样子在两个窗体间用窗体对象的名称相互访问就很不规范,代码不好维护。这种模态窗体,一般要从工程选项的“自动建立窗体”中移除,并把窗体单元中Delphi自动定义的窗体变量删除,在窗体单元中自定义一个全局函数或过程,把窗体变量的定义、窗体的创建、调用、销毁等代码全部写在全局函数或过程中,与主窗体的数据传递通过该全局函数或过程的参数来完成。
追问
我感觉您说的这个问题也不是绝对的吧,如果需要执行的代码太多的话我我肯定会用函数和过程来封装,但是就这么两行代码,我也另外写一个过程貌似有点画蛇添足的嫌疑了。。。
另外您后面说的这些又是为什么呢?感觉是为了减少程序的体积。。。请原谅我的无知。。。能否详细告知这样做的意义和用处?
追答
当然什么问题都没有绝对的,也可以说这只是一个程序员的习惯或风格问题。各人看问题的观念不一样,对问题的感受也就不一样。这种做法也不是我创造出来的,我也是从别处学来的。我觉得这样做很好,所以我编程时通常都这样做。至于你怎么做,完全在于你对问题的看法。不过要说的是,这种做法并不能减少程序的体积。要问这样做的意义是什么,那完全是靠自己悟出来的。给个极其简单的例子(本来觉得没必要,还是放上),如果你感悟不到其中的意义,那就没有什么可说的了。
展开全部
显示的错误意思是访问了无效的内存地址,那应该是FormClose过程中 employeemanagefm 参数错误,可能是创建Temployeemanagefm窗体时并没有初始化变量employeemanagefm, 建议在 Temployeemssageform 中添加外部窗体引用,然后传入窗体,如
procedure Temployeemanagefm.addbtClick(Sender: TObject);
begin
employeemssageform:=Temployeemssageform.Create(self);//按种创建方式也可以使用owner
employeemssageform_unit.savestate:=false;
employeemssageform.Femployeemanagefm := self; //添加的成员Femployeemanagefm
employeemssageform.ShowModal;
end;
procedure Temployeemssageform.FormClose(Sender: TObject;
var Action: TCloseAction);
begin
Femployeemanagefm.StateEpBt.Caption:='查看离职员工'; //使用成员Femployeemanagefm
end;
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询