谁帮我解决 windows日志错误问题(200分)

  • 主题发起人 主题发起人 大器晚成
  • 开始时间 开始时间

大器晚成

Unregistered / Unconfirmed
GUEST, unregistred user!
最近用嵌套窗体,老出现如下错误对话框:“xx.exe 产生了错误,会被windows关闭。你需要重新启动程序。(回车换行)正在创建错误日志。”并有个“确定”或“取消”按纽。无论你确定或取消,程序自动关闭,正在保存的数据丢失。有时会出现“无效的窗体句柄”的提示框。
我的主窗体上有个pagecontrol控件,其他窗体都加载到控件的page上。我怀疑此类错误跟控件焦点或句柄有关。是否跟windows系统本身有关呢?
以上错误是不定时的,无法调试。请高手指点。
 
多数是你代码的问题
有些代码不要写在窗体的OnCreate事件里
 
应该是代码问题
 
调试是可以通过的。测试100遍也许都没问题,偶尔出现。我怀疑是delphi 自身的bug。如果不用嵌套窗体,不会出现任何问题。
 
基本上是Delphi自身Bug的可能性为0.00000000000000000001%
建议LZ不要在D上纠缠而应该多查查代码方面的问题:资源的创建、释放是否可靠?
 
to szhcracker:
你说的情况我反复查过自身代码,没查出问题(并不代表没问题)。我想知道的是为什么是偶尔出现,而不是每次都出现呢?有没有人遇到过类似的问题?请不吝赐教。
 
如果操作系统没有什么问题的话,可以查查.dll文件的问题。
我已前动态调用一个自己写的dll文件时有过这种情况,后来修改了释放dll的代码就好了
 
各位大虾都说是代码问题。现将部分代码贴出,望予指点:
(以下GPageCtl为TcxPageControl控件)
function CreateForm(AName:string;Sender:TComponent):TForm;
begin
result := nil;
//-------------------------------------基础资料
if AName='备份数据' then
result:= TBackupData.Create(Sender);
if AName='用户管理' then
result:=TfrmUsermnt.Create(Sender);
//......
end;
function FindSheet(ACaption:string):integer;
var
i:integer;
begin
result:=-1;
for i:=0 to GPageCtl.PageCount-1 do begin
if GPageCtl.Pages.Caption=Acaption then begin
result:=i;
break;
end;
end;
end;
function FindForm(ACaption:string;Aactive:boolean=false):TForm;
var
index:integer;
begin
index:=FindSheet(Acaption);
if index>-1 then begin
if Aactive then GPageCtl.ActivePageIndex:=index;
index:=strtointDef(GPageCtl.Pages[index].hint,0);
result:=Tform(Findcontrol(index));
end else result:=nil;
end;
function NewForm(Acaption:string;AnewName:string='';;Apurview:integer=0):Tform;
var
newPage:TcxTabSheet;
frm:Tform;
begin
if AnewName='' then AnewName:=Acaption;
result:=FindForm(AnewName,true);

if result<>nil then exit;

newPage:=TcxTabSheet.Create(GPageCtl);
//creatForm
frm:=createForm(Acaption,newPage,0);
if frm=nil then begin
newPage.Free;
exit;
end;
//newsheet
newPage.PageControl:=GPageCtl;
newPage.Caption:=AnewName;

//creatForm
frm.parent:=newpage;
newPage.Hint:=inttostr(frm.Handle);//在hint中保存frm的handle,以便查找
frm.Name:='F'+newPage.Hint;
frm.Tag:=Apurview;
GPageCtl.Visible:=true;
GPageCtl.ActivePage:=newPage;
frm.Visible:=true;
result:=frm;
end;
//关闭当前sheet
procedure PopFormClose;
begin
with GPageCtl do begin
if PageCount>0 then
ActivePage.free;
Visible:=PageCount>0;
end;
end;
 
简单的办法:不要用TcxPageControl,就用D自己的PageControl试试。
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
D
回复
0
查看
1K
DelphiTeacher的专栏
D
后退
顶部