大家帮忙看看,DLL的窗体内怎么不能使用DBCHART??

newfang 2006-05-06 04:10:53
如题

即便是不用,把组件删除掉,只要USES那几个单元都出问题……

分不多了,欢迎大家进来讨论,只要说出自己看法就行!!

先谢过了~~
...全文
318 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
仙侣步惊云 2006-05-09
  • 打赏
  • 举报
回复
在mdi设计方式下用dll封装vcl组件会有些问题,这些问题的出现不仅限于dbchar,包括其他vcl组件.
原因是dll和主控程序都有一个application和screen对象,在dll装入进程后,要用主控程序的application和screen对象替换dll中的相应对象,这即使这样,也只能解决部分问题,还有许多无法克服的困难.
建议用bpl代替dll,bpl是面向对象的,整个bpl体系只有一个全局的application和screen,所有问题都会迎刀而解
踢踏 2006-05-09
  • 打赏
  • 举报
回复
你所说的用Nil参数来创建窗体,在某些情况下是不可以的,至少你Dll里创建的第一个窗体肯定要使用Application参数来创建,要不然,以后麻烦可大了。
Dll里创建窗体有用的是这两个参数
MainApp : TApplication; //主程序的Application
MainScreen : TScreen; //主程序的Screen

另外两个参数是有另外特殊的用途,也许你用不到,可以不管他。

供参考:
var
Child: TFQueryInvoice;
begin
Child:=nil;
Application := MainApp;
DLLScr := MainScreen;
try
Application.CreateForm(TFQueryInvoice,Child);
Child.Show();
except
Child.Free();
end;
end;

var
Child: TFMainChart;
begin
Application := MainApp;
DLLScr := MainScreen;
Application.CreateForm(TFMainChart,Child);
try
Child.ShowModal;
finally
Child.Free;
end;
end;

newfang 2006-05-09
  • 打赏
  • 举报
回复
谢谢楼上各位!!
学到不少东西……
踢踏 2006-05-08
  • 打赏
  • 举报
回复
不是偶做的,这个例子只是以前好像见过,对初学Dll和MDI有些参考作用,所以提供给你参考。
偶书看的少,所以不知道起什么作用,只知道Application和Screen是必须传进去的(这个例子可能简单点)。那个MainForm我都是传进去的。
每个Dll我至少传4个参数:
wHandle : Integer; //主程序的Handle
pForm : TForm; //主程序的MainForm
MainApp : TApplication; //主程序的Application
MainScreen : TScreen; //主程序的Screen


newfang 2006-05-08
  • 打赏
  • 举报
回复
To xxmmmx(踢踏) :看了你说的代码,不知道是不是你做的,有几点疑问:
1.偶不理解
MyParentForm: TForm;
MyParentApplication: TApplication; 这两个变量在例子中起的什么作用?
2.在调用MDI窗体时只传递了APPLICATION,而没有传递SCREEN,
这样主窗体的MDIChildCount估计不会改变!你又怎么处理这个问题呢?

谢谢!!!
踢踏 2006-05-08
  • 打赏
  • 举报
回复
我觉得不是DBChart的问题,而是动态链接库里调用MDI子窗体写法错误导致的。
这儿有例子,你下载参考一下。
http://www.2ccc.com/article.asp?articleid=563
FCU 2006-05-08
  • 打赏
  • 举报
回复
UP
newfang 2006-05-08
  • 打赏
  • 举报
回复
真的没有解决办法了吗?? :(
不求答案,大家只要说出自己的看法见解就行!!!
分不够再开贴!!
newfang 2006-05-08
  • 打赏
  • 举报
回复
汗~~xxmmmx(踢踏)谦虚了……
Create后的参数,偶看刘艺的书说如果用nil可以少占用些资源,不过创建后要自己负责销毁!
所以这个偶认为应该关系不大。
不过上午偶也试了把MainForm传进去,问题依旧~~

谢谢你的参与!!
另外,EHLIB的打印控件,预览时在上述情况下也会出现问题!
提示是不能复制一个TFONT,不知道有人注意过没有!
wudi_1982 2006-05-07
  • 打赏
  • 举报
回复
MDICHILD,这种东西,我一般不用。。帮你顶一下
蓝色光芒 2006-05-07
  • 打赏
  • 举报
回复
帮顶,嘿嘿
newfang 2006-05-07
  • 打赏
  • 举报
回复
偶又发现了点:因为偶DLL的窗体是MDICHILD,所以主程序在传递参数的时候把SCREEN也传递过去了,在DLL里面有这样的代码:
var
DllApp: TApplication;
// DllScr: TScreen;


{$R *.res}

procedure MyDllHandle(iReaSon: Integer);
begin
if iReaSon = 0 then
begin
Application := DllApp;
// Screen := DllScr;
end;
if iReaSon = 1 then
begin
DllApp := Application;
// DllScr := Screen;
end;
end;

exports ShowForm;

begin
DllProc := @MyDllHandle;
end.

在出口函数里:
procedure ShowForm(Scr: TScreen;App: TApplication;ADOC: TADOConnection);
begin
// Screen := Scr;
Application := App;
with TForm1.Create(nil) do
begin
try
Showmodal;
finally
Free;
end;
end;
end;

现在如果我照上面的“//”,把传递的SCREEN都屏蔽了,程序就可以运行,
如果把//放开,在DLL窗体关闭的时候就会出问题!!
newfang 2006-05-07
  • 打赏
  • 举报
回复
xxmmmx(踢踏):哥们儿你QQ多少,偶加你一下,把程序发给你你看看好吗??
newfang 2006-05-07
  • 打赏
  • 举报
回复
错误提示:
“Project c:\……\Project1.exe raised too many consecutive exceptions
'access violation at 0x06f836a2 : read of address 0x07044638' process stopped.
uses step or run to continue.
别的DLL里没有 ,现在就这一个DLL了!!
踢踏 2006-05-07
  • 打赏
  • 举报
回复
靠,你要用DBChart啊,我以为你是不用它,所以东西都可以删掉,相信 wudi_1982(Delphi & Vs.NET)也是这么理解的。

它提示什么错误?在别的Dll里面有没有用DBChart?
newfang 2006-05-07
  • 打赏
  • 举报
回复
回xxmmmx(踢踏) :把USES里的东西删除,DBCHART就没法用了……

回wudi_1982(Delphi & Vs.NET) :偶在项目里做,不行,偶又新建了个APP和DLL,
DLL的窗体里别的啥都没有,就一个DBCHART,还是出问题~~

郁闷死了~~~~ :(
wudi_1982 2006-05-06
  • 打赏
  • 举报
回复
你重来一次,不要改了,重新做DLL,看看可以不可以。
踢踏 2006-05-06
  • 打赏
  • 举报
回复
既然没有,那就把Use里面的相关的东西删除掉。这样还不行吗?
newfang 2006-05-06
  • 打赏
  • 举报
回复
偶只用了一个~~
严格说一个都没用,因为偶把组件删除了,还是有问题,除非把USES里面的那几个单元
也去掉才可以……
楼上的可不可以帮帮偶,偶QQ:113602031
谢谢……
踢踏 2006-05-06
  • 打赏
  • 举报
回复
Dll窗体内可以使用DBChart的,但不能同时有两个Dll使用DBChart,这是控件本身的问题。

5,388

社区成员

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

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