在activexform中打开一个新窗口时,始终出错 ( 积分: 100 )

  • 主题发起人 主题发起人 badwood
  • 开始时间 开始时间
B

badwood

Unregistered / Unconfirmed
GUEST, unregistred user!
在activexform中建了一个新form,然后用如下代码打开
with tform1.create(self) do
begin
try
showmodal;
finally
free;
end;
end


但始终出错,类似
DAX Error
---------------------------
Access violation at address 04D134EA in module 'dxrbgb.ocx'. Read of address 00000000.
—————————————

如果不用showmodal ,用show则可以打开,但不能用free了。
请问一下原因
 
在activexform中建了一个新form,然后用如下代码打开
with tform1.create(self) do
begin
try
showmodal;
finally
free;
end;
end


但始终出错,类似
DAX Error
---------------------------
Access violation at address 04D134EA in module 'dxrbgb.ocx'. Read of address 00000000.
—————————————

如果不用showmodal ,用show则可以打开,但不能用free了。
请问一下原因
 
showmodal在activex下面不能使用(在dll中也有些怪毛病),关键是showmodal的机理与show有很大不同,一般用show时设置formstyle为fsstayontop,在onclose事件中free也可以得到类似效果
 
badwood,
在我编写ActiveX和Dll的经历中,从来没有碰到你说的情况,Form的ShowModal从来都是没问题的。
我估计你的代码是在with的使用上出了问题,你不妨改成这样试试:
form1 := tform1.create(self);
try
form1.showmodal;
finally
form1.free;
end;
在我的程序代码中一般都不用with语句的,因为程序里很多莫名其妙的问题经常都是with语句造成的,而且用了with语句后程序的调试变得麻烦了。
 
一般来讲,With只会影响人的阅读和理解,不会对编译和执行带来问题,除非写的人自己都搞不清。
你的问题一看提示就是访问了一个已经销毁了内存的指针,也就是说,在你那个TForm1的内部已经执行了内存销毁,因此和外面那个Free有冲突!
其二,要注意你那个TForm1.Create(Self)的那个Self参数!这个参数为这个form指定了一个Owner,从理论上将,构件释放内存时会负责自己所属的对象。
 
DAX Error错误一步都发送在ActiveForm里面,下面是我转的Borland网站上的补救做法,我曾经碰到过一次这样的问题,采用了Borland的办法也解决不了,后来检查出来问题是自己代码的问题,你说Show没有问题,其实ShowModal也是没有问题的,问题就在你的Free上面,窗口析构的时候有些东西没有被正确释放,所以才会出现那样的问题,不烦把tform1的代码贴上来看看如何,先测一下下面的做法(把Activex.pas拷贝到当前目录,然后做如下的修改)

----------------转自网络
下面是一段关于DAX Error错误的修改资料(borland的网站)

when using Internet Explorer in Wink2, WinXp, ActiveForm or ActiveX control raise

DAX error : access violation at address 000

reason :

delphi's ocx use same parking window procedure.

one ocx must use individual parking window proc.

fix error.

edit delphi VCL source routine in axctrls.pas

and compile axctrls.pas

copy axctrls.dcu to lib directory.

axctrls.pas

function ParkingWindow: HWND


var

TempClass: TWndClass


ParkingName : String


begin

Result := xParkingWindow


if Result <> 0 then Exit


// fix Dax error : accessviolation (win2k, win xp)

ParkingName := 'DAXParkingWindow_' + Format('%p', [@ParkingWindowProc])


FillChar(TempClass, sizeof(TempClass), 0)


if not GetClassInfo(HInstance, PChar(ParkingName), TempClass) then // fix Dax error : accessviolation (win2k, win xp)

begin

TempClass.hInstance := HInstance


TempClass.lpfnWndProc := @ParkingWindowProc


TempClass.lpszClassName := PChar(ParkingName)
// fix Dax error : accessviolation (win2k, win xp)

if Windows.RegisterClass(TempClass) = 0 then

raise EOutOfResources.Create(SWindowClass)


end


xParkingWindow := CreateWindowEx(WS_EX_TOOLWINDOW, TempClass.lpszClassName, nil,

WS_POPUP, GetSystemMetrics(SM_CXSCREEN) div 2,

GetSystemMetrics(SM_CYSCREEN) div 2, 0, 0, 0, 0, HInstance, nil)


SetWindowPos(xParkingWindow, 0, 0, 0, 0, 0, SWP_NOACTIVATE or SWP_NOREDRAW

or SWP_NOZORDER or SWP_SHOWWINDOW)


Result := xParkingWindow


end;
 
偶以前也遇到过类似的问题,我记得是free的地方不对,很久了不记得了
 
关注,我也遇到类似问题
借楼主宝地一同讨论
第一次打开包含控件页面时,显示正常
但关闭该页面,重新打开时就会报内存错,
只有重启IE才能使控件第一次显示正常
这个情况只有在特定环境下出现,感觉跟操作环境有关
因为在其他同事的机器上都是好的,现在整个公司就两台机器出现这种情况
望高手指教
 
Create(nil)
 
chenybin的答案基本正确,DAX错误是这样子解决的,但不彻底,我以前看前人的处理,需要将下面的代码注释掉:
function ParkingWindow: HWND


var

TempClass: TWndClass


ParkingName : String


begin

Result := xParkingWindow


//if Result <> 0 then Exit
//就是这里,不然,还是会出现DAX错误!

// fix Dax error : accessviolation (win2k, win xp)

ParkingName := 'DAXParkingWindow_' + Format('%p', [@ParkingWindowProc])


FillChar(TempClass, sizeof(TempClass), 0)


if not GetClassInfo(HInstance, PChar(ParkingName), TempClass) then // fix Dax error : accessviolation (win2k, win xp)

begin

TempClass.hInstance := HInstance


TempClass.lpfnWndProc := @ParkingWindowProc


TempClass.lpszClassName := PChar(ParkingName)
// fix Dax error : accessviolation (win2k, win xp)

if Windows.RegisterClass(TempClass) = 0 then

raise EOutOfResources.Create(SWindowClass)


end


xParkingWindow := CreateWindowEx(WS_EX_TOOLWINDOW, TempClass.lpszClassName, nil,

WS_POPUP, GetSystemMetrics(SM_CXSCREEN) div 2,

GetSystemMetrics(SM_CYSCREEN) div 2, 0, 0, 0, 0, HInstance, nil)


SetWindowPos(xParkingWindow, 0, 0, 0, 0, 0, SWP_NOACTIVATE or SWP_NOREDRAW

or SWP_NOZORDER or SWP_SHOWWINDOW)


Result := xParkingWindow


end


一般是有两个DELPHI写的Activex控件在同一个IE进程的时候,会出现上述错误。
上面的办法不是很好,但确实可以彻底解决这个问题!
 
楼上的兄弟,你贴的是Borland官方的解决办法,这个办法我以前用过,不是放之四海皆准的,后来还是发现是因为有东西没释放,看楼主运气了[:)]
 
form1 := tform1.create(self);
try
form1.showmodal;
finally
form1.free;
end;
 
后退
顶部