我是DELPHI新手,会的不多,现在接手维护老系统,只能修改程序内简单的SQL逻辑部分.现在需新增一模块,与现有的类似. 想复制模块后再做细微修改. (系统是采用 菜单项对应BPL文件执行)我拷贝了一个模块的文件(文件夹),打开工程另存为新名字,编译生成BPL包,
在执行程序框架中新建了菜单,建立了与新包的对应关系,程序执行时和原对应模块 冲突(新旧模块都可单独打开,
但先打开一个模块后,再另一个会显示找不到对应模块). 我知道这样做肯定有问题,
但不知如何解决!高手给我说一下,如果我复制一个模块(每个BPL 源程序都对应一个文件夹,若干表单/子表单:dfm,dcu,res,dpr,dpk,pas....),
任何功能都不改,只是生成不同名字的程序包,又能分别存在与不同的菜单下同时能运行,需要怎么在 DELPHI 中调整?
(文件夹内好多文件,不可能以一一替换改名吧(更名之后代码内若也有引用名岂不也要改? 汗!),应该有标准的做法吧?) 望路过高手不吝赐教!

解决方案 »

  1.   

    没怎么使用bpl方式关键是dpr吧
    另外,就看框架的实现了:是按什么定位模块、函数的
      

  2.   

    我觉得关键不在框架, 应该和框架没有关系吧(我想当然). 
    框架程序提供了 系统菜单 界面分布等 通用功能, 每个菜单项会执行到如下语句: pkname := 'PKlib\' + pkname;          //=== package path ===//
      try
        pkobject := Loadpackage(pkname);
        @CreateNewObject := GetprocAddress(pkobject, 'CreateObject');
        if integer(@CreateNewObject) < 0 then
          Mymessage('包加载失败!', 2)
        else
        begin
          CreateNewObject(userid);          //== test pass user ID, mybe OK ==//      //记录登录信息
          if pmenufile(TVmenu.selected.data)^.Important = 'Y' then
          begin
            hostname := GetHostName;
            ipaddress := NameToIP(hostname);
            sqlstr := 'insert into salary_security  (empno,name,logontime,logonunit,hostname,ipaddress) ' +
              'values(''' + userid + ''',''' + username + ''',getdate(), '+
              ' '''+pmenufile(TVmenu.selected.data)^.NodeName+''',''' + hostname + ''',''' + ipaddress + ''' )';
            MyExecSQL(sqlstr);
          end;
        end;
      except
        Mymessage('没有找到指定的模块,请重新下载系统文件!', 1);
      end; 现在出错位置应该在第一句   pkobject := Loadpackage(pkname);
    因为提示信息是 "没有找到指定的模块,请重新下载系统文件!"如果是进入系统第一次点击菜单项(比如A1),一切正常, 之后什么时候点击该项都正常;
    但如果再点击 与该模块对应的B1 (修改后的模块,1楼问题),此时将出上述错误提示,
    反过来先点B1 后点A1 一样, 只是换成 A1打不开.我觉的是有什么东西没有修改彻底.
      

  3.   

    是不是BPL包在加载后会有什么"特征串",而新模块的这个"特征串"因为没有彻底修改与原来的模块相同,结果导致加载冲突? 我是 在delphi中 工程另存为... 然后编译的, 还一定要把某一类文件(比如dpr,dfm...)改名或做一些特定处理才行吗?
      

  4.   

    我的懒人懒法,例如:
    我想把form1复制为一模一样的form2,然后对form2进行修改,步骤如下:
    1、分别复制unit1.dfm为unit2.dfm
              unit1.pas为unit2.pas
    2、用记事本分别打开:unit2.dfm,unit2.pas,替换所有的unit1为unit2,form1为form2
    3、在project--->add to project 将unit2加入project。
    3、打开form2修改即可。原码都有了,想生成啥就生成啥。
      

  5.   

    虽然没怎么用过bpl,但是记得它的引用是相当严格的,你复制后随便改个名字应该不行吧,建议参看delphi6开发人员指南中关于包contains和require的引用规范,例如一个包的单元不能列于另一个包的contains中,也不能列于另一个包单元的use子句中等等
      

  6.   

    babydog01 的想法我也想过, 也是最先想的,但改时就麻烦了: 源程序文件名居然有跟数据表名相同的(如考勤汇总,模块名和涉及的表名都是empOndutySummary),甚至字段名,我怕了,如果文件简单少,我逐个替换也没问题,问题是代码文件还挺复杂,来个全部替换会死人的! 呵呵! 另外funxu说的好像也有道理(我不懂,纯感觉). 
    没办法,看别人的程序,尤其是我不熟悉的语言,很头痛啊!
      

  7.   

    帮你写出来吧,至于还有没有记不住了
    1 一个包中的单元不能列于另一个包的contains中,也不能列于另一个包单元的use子句中
    2 一个包已经列于自己的contains子句中,不能同时列于自己的require子句中
    3 包不能放在自己的require下面,也不能放在其他require下有这个包的的包里面
      

  8.   

    谢谢funxu,感觉像是我遇到的问题的症结,我正试着学习Delphi, 按你说的我改下看看.同时也谢谢babydog01 的支持!帖子先结了.