如题即便是不用,把组件删除掉,只要USES那几个单元都出问题……分不多了,欢迎大家进来讨论,只要说出自己看法就行!!先谢过了~~

解决方案 »

  1.   

    Dll窗体内可以使用DBChart的,但不能同时有两个Dll使用DBChart,这是控件本身的问题。
      

  2.   

    偶只用了一个~~
    严格说一个都没用,因为偶把组件删除了,还是有问题,除非把USES里面的那几个单元
    也去掉才可以……
    楼上的可不可以帮帮偶,偶QQ:113602031
    谢谢……
      

  3.   

    既然没有,那就把Use里面的相关的东西删除掉。这样还不行吗?
      

  4.   

    你重来一次,不要改了,重新做DLL,看看可以不可以。
      

  5.   

    回xxmmmx(踢踏) :把USES里的东西删除,DBCHART就没法用了……回wudi_1982(Delphi & Vs.NET) :偶在项目里做,不行,偶又新建了个APP和DLL,
    DLL的窗体里别的啥都没有,就一个DBCHART,还是出问题~~郁闷死了~~~~   :(
      

  6.   

    靠,你要用DBChart啊,我以为你是不用它,所以东西都可以删掉,相信 wudi_1982(Delphi & Vs.NET)也是这么理解的。它提示什么错误?在别的Dll里面有没有用DBChart?
      

  7.   

    错误提示:
    “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了!!
      

  8.   

    xxmmmx(踢踏):哥们儿你QQ多少,偶加你一下,把程序发给你你看看好吗??
      

  9.   

    偶又发现了点:因为偶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窗体关闭的时候就会出问题!!
      

  10.   

    MDICHILD,这种东西,我一般不用。。帮你顶一下
      

  11.   

    我觉得不是DBChart的问题,而是动态链接库里调用MDI子窗体写法错误导致的。
    这儿有例子,你下载参考一下。
    http://www.2ccc.com/article.asp?articleid=563
      

  12.   

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

  13.   

    不是偶做的,这个例子只是以前好像见过,对初学Dll和MDI有些参考作用,所以提供给你参考。
    偶书看的少,所以不知道起什么作用,只知道Application和Screen是必须传进去的(这个例子可能简单点)。那个MainForm我都是传进去的。
    每个Dll我至少传4个参数:
        wHandle     : Integer;             //主程序的Handle
        pForm       : TForm;               //主程序的MainForm
        MainApp     : TApplication;        //主程序的Application
        MainScreen  : TScreen;             //主程序的Screen
      

  14.   

    汗~~xxmmmx(踢踏)谦虚了……
    Create后的参数,偶看刘艺的书说如果用nil可以少占用些资源,不过创建后要自己负责销毁!
    所以这个偶认为应该关系不大。
    不过上午偶也试了把MainForm传进去,问题依旧~~谢谢你的参与!!
    另外,EHLIB的打印控件,预览时在上述情况下也会出现问题!
    提示是不能复制一个TFONT,不知道有人注意过没有!
      

  15.   

    你所说的用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;
      

  16.   

    在mdi设计方式下用dll封装vcl组件会有些问题,这些问题的出现不仅限于dbchar,包括其他vcl组件.
    原因是dll和主控程序都有一个application和screen对象,在dll装入进程后,要用主控程序的application和screen对象替换dll中的相应对象,这即使这样,也只能解决部分问题,还有许多无法克服的困难.
    建议用bpl代替dll,bpl是面向对象的,整个bpl体系只有一个全局的application和screen,所有问题都会迎刀而解