本人想做一个像DELPHI本身一样的窗体设计器,能把我们设计好的界面保存到数据库里,到时程序运行时直接从数据库里读出这些数据来创建表单和里面的控件。这个应怎么做呀,我没什么思路,还有请问那位有RIIT方面的资料可不可以传一份给我,我会很感激的,必有重谢呀。本人.

解决方案 »

  1.   

    delphi 有个READCOMPONENT的函数可以做到
    保存后就是。DFM文件格式
      

  2.   

    你如果急着要,我没办法帮你,如果不急,我过几天,一个星期内你来信给我[email protected]我可以给你这方面的源码看看,再自己改,(学习)然后再去实现,可以吗?
      

  3.   

    这个腻简单
    只要窗体设计时遵循一定的规则就可以了
    用D的流化技术
    将窗体上的重建保存到流里注意:
    是保存窗体上的控件
    不包括窗体
    以流化的方式写入和读出就可以了
    看看TComponent的流化处理
    我自己在项目中经常这类处理
      

  4.   

    李维的《VCL框架剖析》有明确的讲解
    或者自己看VCL关于这方面的东东
      

  5.   

    http://community.csdn.net/Expert/topic/3399/3399647.xml?temp=.5094568
    看看这里的讨论
    这几天没有时间帮你实现了
    要看存储过程的说
      

  6.   

    楼上的兄弟,那你能不能提供一点TComponent的流化处理的实例给我看一下呢?我在这方面真是一个新手,没什么概念呀。我是想把一个窗体的.DFM保存到数据库里去然后再把这个。DFM文件恢复成窗体包括窗体上的控件,不知兄弟怎么想的。
      

  7.   

    我已给linzhengqun(风。为菜鸟服务)发了消息
    你稍等
      

  8.   

    不知有没有人可以使正在运行的窗体变成编辑状态,然后我们可以在上面添加控件和更改属性。你们有没有用过Dream控件包中的TDreamDesigner控件呢?有经验的可以告诉我那是怎么用吗?我在做窗体设计器时,我们在自已的设计环境中需要把一个特定的窗体变成可编辑状态。然后添加控件,修改属性等。
      

  9.   

    晕死了,修罗,你找我有什么用呀,我也是菜鸟来的。
    事实上要做到像Delphi的IDE那样,难度不小的。有很多细节问题要考虑的
    不过,从根本上来说,就是动态创建控件,RTTI,还是流化操作,
    要真现实起来就不是一天两天可以解决的。楼主你要的话,给你一个小小的程序吧,我想用处也不大,不过拿去看看也好吧。
    给我邮箱
      

  10.   

    http://www.icsharpcode.net SharpDevelop  这是一个开源的IDE,是C#写的,读它的源码有一定帮助。
      

  11.   

    偶正在做,做了很久了,还没好
    《delphi4从入门到精通》第4章里有简单一点的例子Property Editor也不会弄
      

  12.   

    谢谢大家的意见,我现在也做的快要疯点了,还是没有什么成绩到时如果我做出来,一定把代码贴出来。To  linzhengqun(风。为菜鸟服务),. 
    To  inforum(收台 灭日) ,你的做好了吗?有机会我们一起讨论一下吧。
      

  13.   

    你可以从流文件的角度去考虑这个问题
    Delphi的dfm问题本身也是一个流文件而已,可以研究以下Delphi的TFileStream类.
      

  14.   

    我只是想做一个类似DELPHI的IDE一样的环境只要能创建创体,并在窗体上摆放控件其它任何代码也不用写难道真的很难吗?
    我只要把这个新创建的窗体和控件生成DFM,然后存入数据库的一个字段。
      

  15.   

    linzhengqun(风。为菜鸟服务)
    应该已经发了例程给你了我再根据你实际要求说说:
    设计界面
    无非是想让客户或自己重新排放控件的位置或增加之
    而并不是去实现一个IDE
    那么
    只要遵循一定的规则
    如:我们在窗体上放一TPanel
    其他控件都放在上面
    使用流化的技术
    将TPanel保存至数据库中
    同时,其所有子控件也被保存
    就这么简单关于控件属性
    可以根据RTTI来读取或设置事件属性和代码
    同样的
    我们可以编写一些通用的操作方法
    让客户或自己编写伪代码
    来“解释”执行之
      

  16.   

    你后面说的编一些通用的操作方法让客户或自已编写伪代码来"解释"执行之是什么意思呀?能给个列子吗?其实我现在觉得比较难的问题有一个就是自已要做属性编辑器比较难。
    谁懂得如何把.BPL里的控件读出来的?
      

  17.   

    故计您已经看我的提问了。
    http://community.csdn.net/Expert/topic/3399/3399647.xml?temp=.5094568
    罗修帮了我很大忙。但我最终还是放弃了。因太难了。前后我共研究了一个月的时间呢!可惜。但我的论文研究方向还是和您相似的。
    《个性化界面定制方法的研究与实现》控件的属性修改我目前已经在研究了。有空可以联系。[email protected]
      

  18.   

    至于访问BPL里面的类,也不是什么难事。
    使用LoadPackage载入BPL,
    LoadPackage做了两件事情,
    1,BPL也是DLL,调用LOADLIBRARY载入它。
    2,调用BPL的initialization函数一般在
    initialization的时候,会把BPL里面的类REGISTER一下,
    这样你就可以通过FINDCLASS之类的函数找到它使用它。。
      

  19.   

    那请问有没有一个小例子说可以从.Bpl里面把所有的控件列出来呢?
      

  20.   

    其实哈欠说的方法是最好的
    如果你要察看一个第三方提供的bpl里面的需要注册到设计环境的组件类,你可以用这样的办法var
      //用于保存类
      CompClasses: TList;
      ClassesNoIcon: TList;procedure MyRegisterComponentsProc(const aPage: string;
        const aComponentClasses: array of TComponentClass);
    var
      I: Integer;
    begin
      for I := Low(aComponentClasses) to High(aComponentClasses) do
        CompClasses.Add(aComponentClasses[I]);
    end;procedure MyRegisterNoIconProc(const aComponentClasses: array of TComponentClass);
    var
      I: Integer;
    begin
      for I := Low(aComponentClasses) to High(aComponentClasses) do
        ClassesNoIcon.Add(aComponentClasses[I]);
    end;procedure GetPackageUnits(
            const Name: string;
            NameType: TNameType;
            Flags: Byte;
            Param: Pointer);
    begin
      if (NameType = ntContainsUnit) then
        //其实还应该检查一下Flags
        TStrings(Param).Add(Name);
    end;procedure GetRegisteredClassInPackage(const aPackageName: string);
    var
      I: Integer;
      Dummy: Integer;
      UnitOrPkgName: string;
      RegisterProc: TProcedure;
      Module: THandle;
      UnitList: TStrings;
      OrgRegComp, OrgRegNoIcon: Pointer;
    begin
      OrgRegComp := @RegisterComponentsProc;
      OrgRegNoIcon := @RegisterNoIconProc;
      try
        RegisterComponentsProc := MyRegisterComponentsProc;
        RegisterNoIconProc := MyRegisterNoIconProc;    Module := LoadPackage(aPackageName);
        try
          UnitList := TStringList.Create();
          try
            GetPackageInfo(Module, UnitList, Dummy, GetPackageUnits);        for I := 0 to UnitList.Count-1 do
            begin
              UnitOrPkgName := UnitList[I];          RegisterProc := GetProcAddress(Module, PChar(Format('@%s@Register$qqrv', [UnitOrPkgName])));
              //找每个单元的register函数,如果有就调用          if Assigned(RegisterProc) then
                RegisterProc();
            end;
          finally
            UnitList.Destroy();
          end;
        finally
          UnloadPackage(Module);
        end;
      finally
        RegisterComponentsProc := OrgRegComp;
        RegisterNoIconProc := OrgRegNoIcon;
      end;  //那么,现在CompClasses和ClassesNoIcon里面的类就是你想知道的类了
    end;
    不过这个方法不太安全,随手写的,仅供参考
      

  21.   

    有些package还会调用一些其它的Register函数,比如RegisterNonActiveXProc,RegisterNonActiveX等等,那些你自己考虑吧
      

  22.   

    如果试成攻了,不要忘了告诉我。
    [email protected]
      

  23.   

    去看看FastReport 3.0的源代码,里面有Dialog的窗体设计