我想在DLL中写一个公用的查询窗体,让其他模块调用,请问1,在DLL中的窗体如何写
2,其他模块如何来调用我用的是DELPHI7
这里先谢谢大家!

解决方案 »

  1.   

    一样的写只是调用函数的时候要把创建窗体的过程写在里面其它模块调用的时候可以直接调用接口函数详情请参考"dll之窗体封装"
      

  2.   

    声明窗体类 DLL中最好包含 窗体初始化 释放的函数
      

  3.   

    何必做成DLL呢?直接定义一个独立的窗体单元做为基类,定义好共同的行为。其他地方要用的时候,自己继承一下,覆盖或是重载下相关的方法就搞定了。
      

  4.   

    多谢大家,现在正在dll的函数中创建窗体,然后准备在其他模块中来调用对于楼上的建议,我觉得应该是更好的方法,不过我的水平现在实在是有点菜,先做出个东西,然后再慢慢优化吧
      

  5.   

    对了,我在dll中创建窗体的函数老报错,语句是参考以前做的程序,怎么这里就不行了?
    function test:string;stdcall;
    begin
      try
        inherited;
        frmTEST := TfrmTEST.Create(self);
        frmTEST.ShowModal;
      finally
        frmTEST.Free;
      end;
      Result := frmTEST.str;
    end;错误提示如下:
    inherited这里的错误是:[Error] Pub.dpr(116): This form of method call only allowed in methods of derived types
    frmTEST := TfrmTEST.Create(self)这里也有错误:
    [Error] Pub.dpr(117): Undeclared identifier: 'self'frmTEST是我创建的窗体名
      

  6.   

    frmTEST := TfrmTEST.Create(self);
    改为   frmTEST := Tform.Create(self);
      

  7.   


    1.函数返回string类型时:
      动态库工程引用的第一个单元必须是sharemem;
      应用程序工程文件中第一个引用单元必须是sharemem;
      发布应用程序时,必须把borlandmem.dll一起发布;
    建议:使用字符串指针类(PChar)型作为返回类型;PCHAR是WINDOWS的标准数据类型。2.代码中存在的问题:
    function test:string;stdcall;
    begin
      try
        inherited;//这一句没有必要要了。
        //frmTEST := TfrmTEST.Create(self);//DLL工程与一般的窗体类型的工程不一样,
    //没有SELF指针,DLL只有一个APPLICATION对象,且与调用的应用程序的APPLICATION对象
    //是不一样的。在创建动态窗体时,你可以使用NIL就行了。
        frmTEST := TfrmTEST.Create(nil);
        if frmTEST.ShowModal=mrok then
           Result := frmTEST.str;//函数返回的控制应当放在这儿。
    //放在最后肯定会报内存访问错的。因为try  finally end 结构中,会先释放窗体,再访问窗体对象时,这个对象不存在了!
      finally
        frmTEST.Free;
      end;
      
    end;
      

  8.   

    谢谢,不过在编译的时候,这一句
    if frmTEST.ShowModal=mrok then中的mrok,系统说没有定义,是不是在uses的地方需要引用哪个单元?