往DLL动态库函数传送对象时出错
在一个DLL项目中申明以下函数,这样对吗?
function fBool_ExistMDIForm(MainForm,MDIForm:TForm):Boolean;stdcall;
//MainForm为MDI主表单,MDIForm为MDI子表单
var
i:Integer;
begin
i:=0;
while i<MainForm.MDIChildCount do
begin
begin
if MainForm.MDIChildren[i].Name=MDIForm.Name then
break //如果找着同名的子表单则程序退出循环
else
i:=i+1;
end;
end; if MainForm.MDIChildren[i].Name=MDIForm.Name then
Result:=True //找到同名的表单返回真,否则退回假
else
Result:=False;
end;调用方式在MDI子表单的OnActivate代码中调用,Form1是MDI主表单名
if fBool_ExistMDIForm(Form1,self) then
begin
showmessage('已经运行了一个实例');
end;程序在运行时报错 Access violation at address 00281f0e in modul 'XXXXXX.DLL'. Read of address 00000008
在一个DLL项目中申明以下函数,这样对吗?
function fBool_ExistMDIForm(MainForm,MDIForm:TForm):Boolean;stdcall;
//MainForm为MDI主表单,MDIForm为MDI子表单
var
i:Integer;
begin
i:=0;
while i<MainForm.MDIChildCount do
begin
begin
if MainForm.MDIChildren[i].Name=MDIForm.Name then
break //如果找着同名的子表单则程序退出循环
else
i:=i+1;
end;
end; if MainForm.MDIChildren[i].Name=MDIForm.Name then
Result:=True //找到同名的表单返回真,否则退回假
else
Result:=False;
end;调用方式在MDI子表单的OnActivate代码中调用,Form1是MDI主表单名
if fBool_ExistMDIForm(Form1,self) then
begin
showmessage('已经运行了一个实例');
end;程序在运行时报错 Access violation at address 00281f0e in modul 'XXXXXX.DLL'. Read of address 00000008
解决方案 »
- TServerSocket,TClientSocket菜鸟问题
- DBGridEh新增一列可否实现其自动增1?
- 奇怪哟,keybd_event居然不能摸拟句点, 其它的都可以!
- 真不知怎么了,一个月内少了两辆自行车!!!我靠,还让不让人过呀!!!
- 如何改变控件的容器?
- 菜鸟提问:怎么把一个字符串插入到另一个字符串里去?
- 在应用程序中建立DataBase、Tables和定义 字段 的代码,谁有?
- !!!!!!!超级猛料主页即将关闭!!!!!!!
- 高兴放分!!200
- 怎么实现MediaPlayer循环播放?
- 关于SQL Server2000和Delphi做的数据库打包的问题
- 请教各位,如何用程序制作中文内容的PDF?
Result:=True //找到同名的表单返回真,否则退回假
else
Result:=False;
____________________
改成 i<mainform.mdichildcount then
result:=true
else
result:=false;
function fBool_ExistMDIForm(MainForm,MDIFormclassname : pchar):Boolean;stdcall;
var
i : integer;
begin
result := false;
for i := 0 to mainform.childcount - 1 do
//classname 代表类名
if mdichildren[i].classname = mdiformclassname then
begin
mdichildren[i].bringtofront;
result := true;
break;
end;
if not result then
begin
.... //创建窗体的语句
result := true;
end;
end;
在interface处声明一个变量:
interface
var
midform : tmdiform;
oldapp : tapplication;function fBool_ExistMDIForm(app:Tapplication;MDIFormclassname : pchar):Boolean;stdcall;
... //初始化部份,判断窗体是否存在
if not assigned(oldapp) then
begin
oldapp := application;
application := app;
end;
...
mdiform := tmidform.create(app.mainform); //修改createform的语句
...
end;