想也想不明白的问题?

Ivan_pan 2003-08-26 06:54:11
我动态创建了一个MDIChildForm,然后通过点击一个Button在动态创建一个窗体(NomalForm),然后再NomalForm里读取MDIChildForm上的Label.caption,编译时没有错,但是到了运行时老是报错:说“Access Violation at address 006ABCB0 in module 'Me...'”
请问各位高手有没有遇到过这种情况,是什么问题,请知点?在线等待!
...全文
30 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
Ivan_pan 2003-08-26
  • 打赏
  • 举报
回复
谁告诉了,改了也不行!
lxpbuaa 2003-08-26
  • 打赏
  • 举报
回复
我考,楼上不是告诉了么?

—————————————————————————————————
宠辱不惊,看庭前花开花落,去留无意;毁誉由人,望天上云卷云舒,聚散任风。
—————————————————————————————————
Ivan_pan 2003-08-26
  • 打赏
  • 举报
回复
问题是这样的:
我动态创建了一个MDIChildForm(Frm_EditImport),然后通过点击一个Button在动态创建一个NomalForm(Frm_AddInImport),然后再Frm_AddInImport里读取Frm_EditImport上的Label.caption,编译时没有错,但是到了运行时老是报错:说“Access Violation at address 006ABCB0 in module 'Me...'”
现在我已经知道了问题所在:
我是这样创建Frm_EditImport的:
MyDataModule.ShowChildForm('ModifyRuku',TFrm_EditImport);

Function TMyDataModule.IsHoldPower(PowerName: string):Boolean;
begin
FuncQuery.Close;
FuncQuery.SQL.Text := 'SELECT Powers.PowerName, Roles.GroupID FROM Roles INNER JOIN Powers ON Roles.PowerID = Powers.PowerID where Powers.PowerName=:PowerName and Roles.GroupID=:GroupID';
FuncQuery.Parameters.ParamByName('PowerName').Value := PowerName;
FuncQuery.Parameters.ParamByName('GroupID').Value := CurGroupID;
FuncQuery.Open;
if FuncQuery.IsEmpty then
IsHoldPower := False
else
IsHoldPower := True;
end;

Procedure TMyDataModule.ShowChildForm(PowerName: string;FormClass: TFormClass);
var
ShowForm: TForm;//这里出错
begin
if IsHoldPower(PowerName) then
begin
ShowForm := FormClass.Create(Application);
Case ShowForm.FormStyle of
fsNormal: ShowForm.ShowModal;
fsMDIChild: ShowForm.Show;
end;
end
else
MessageDlg('你没有使用此模块的权限,请跟管理员联系!',mtWarning,[mbOk],0);
end;

在创建Frm_EditImport的时候我用了上面这个方法,就是通过IsHoldPower判断当前用户是否有权限使用该模块。如果有就创建,否则就提示用户没有权限。

如果我不用这个函数,直接创建:
Frm_EditImport := TFrm_EditImport.Create(Application);
Frm_EditImport.ShowModal;
的话就没问题,那问题就是出在:
var
ShowForm: TForm;//这里出错
应该怎样改呢?大家帮忙!
lxpbuaa 2003-08-26
  • 打赏
  • 举报
回复
将ShowChildForm的实现改为:
TMyDataModule.ShowChildForm(PowerName: string;FormClass: TFormClass; var Form: TForm);
begin
……
//ShowForm := FormClass.Create(Application);
改为:
Form := FormClass.Create(Application);
end;

调用它时,将Frm_EditImport传给参数Form。

—————————————————————————————————
宠辱不惊,看庭前花开花落,去留无意;毁誉由人,望天上云卷云舒,聚散任风。
—————————————————————————————————
franne 2003-08-26
  • 打赏
  • 举报
回复
创建ModalForm时最后要释放资源,free方法,
你能不能再把意思说清楚点,我还是\不完全理解你的意思,然后我在替你解决,大家可以商量,
Ivan_pan 2003-08-26
  • 打赏
  • 举报
回复
改为:
ShowForm := FormClass.Create(self);
不行!
我觉得应该是:
var
ShowForm: TForm;//这里出错
谁来改一下!
qianguob 2003-08-26
  • 打赏
  • 举报
回复
ShowForm := FormClass.Create(self);
Ivan_pan 2003-08-26
  • 打赏
  • 举报
回复
我知道我错在哪了:

Procedure TMyDataModule.ShowChildForm(PowerName: string;FormClass: TFormClass);
var
ShowForm: TForm;//这里出错
begin
if IsHoldPower(PowerName) then
begin
ShowForm := FormClass.Create(Application);
Case ShowForm.FormStyle of
fsNormal: ShowForm.ShowModal;
fsMDIChild: ShowForm.Show;
end;
end
else
MessageDlg('你没有使用此模块的权限,请跟管理员联系!',mtWarning,[mbOk],0);
end;

在创建Frm_EditImport的时候我用了上面这个方法,就是通过IsHoldPower判断当前用户是否有权限使用该模块。如果我不用这个函数,直接创建:
Frm_EditImport := TFrm_EditImport.Create(Application);
Frm_EditImport.ShowModal.
的话就没问题,那问题就是出在:
var
ShowForm: TForm;//这里出错
应该怎样改呢?大家帮忙!
wdsimon 2003-08-26
  • 打赏
  • 举报
回复
TFrm_AddInImport.Init;有这个事件吗,怎么我没找到(DELPHI6.0)
lxpbuaa 2003-08-26
  • 打赏
  • 举报
回复
编译时当然没有错,因为是运行时地址错误。

你搜索是否在Frm_EditImport没有创建之前执行了TFrm_AddInImport.Init。怎么没看到你创建Frm_EditImport的代码呢?

—————————————————————————————————
宠辱不惊,看庭前花开花落,去留无意;毁誉由人,望天上云卷云舒,聚散任风。
—————————————————————————————————
Ivan_pan 2003-08-26
  • 打赏
  • 举报
回复
都不行啊!大哥
wdsimon 2003-08-26
  • 打赏
  • 举报
回复
form的int事件时form上的控件并没有初始化,你把代码放在active事件试一下
Ivan_pan 2003-08-26
  • 打赏
  • 举报
回复
编译是没错的,不知道怎么回事运行时才出错,代码也不应该有错,就是弄不明白!
你们以上提的我都注意了,都是这样。我记得这段代码在一个星期之前是运行没错的,不知道怎么搞得,现在运行却出错了!我真是想不明白啊!
wdsimon 2003-08-26
  • 打赏
  • 举报
回复
看一下在NormalForm中有没有USES MDIChildForm单元
newnewworm 2003-08-26
  • 打赏
  • 举报
回复
无模式窗体的显示应该是show而不是showModal
bluenightsky 2003-08-26
  • 打赏
  • 举报
回复
不应该有什么错误阿
还有就是不要忘了 Frm_AddInImport;Free;
Ivan_pan 2003-08-26
  • 打赏
  • 举报
回复
MDIChildForm上的事件:
procedure TFrm_EditImport.AddClick(Sender: TObject);
begin
EditQuery.Filtered := True;
EditQuery.FilterGroup := fgpendingrecords;
if EditQuery.RecordCount <>0 then
begin
MessageDlg('由于此单部分数据已经改变,请先更新数据后再进行添加操作!',mtConfirmation, [mbYes], 0);
EditQuery.Filtered:=false;
exit;
end;
EditQuery.Filtered:=false;
Frm_AddInImport := TFrm_AddInImport.Create(Application);//创建一个NormalForm
Frm_AddInImport.ShowModal;
end;

NormalForm上的事件:
procedure TFrm_AddInImport.Init;
begin
DanHao.caption := Frm_EditImport.DanHao.caption;//第一句
.....
...
.
end;
就是第一句出错。
lxpbuaa 2003-08-26
  • 打赏
  • 举报
回复
一般都是因为你引用了nil对象的成员。贴出相应的代码吧。

—————————————————————————————————
宠辱不惊,看庭前花开花落,去留无意;毁誉由人,望天上云卷云舒,聚散任风。
—————————————————————————————————

5,388

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧