不知道DELPHI到底有没有模板这个概念,想要实现这样一个功能:
可以在运行期设计窗体(控件拖拉,图片编辑),然后将窗体样式保存为一个文件,这个暂且称它为模板的窗体,可供其它程序调用,就是其它程序可以载入这个文件,然后在它的界面上显示出这个窗体,并且能显示为略缩图的样式!
不知道具体要用到哪种方式?
希望有高人帮帮忙!!!!

解决方案 »

  1.   

    File -> New -> Other... -> Frame   ....
      

  2.   

    当然,Frame是框架,不是模板,但还是可以满足你的一些需求.
    你把控件在上面摆好做好以后,在Frame上点右键->Add To Palette,就能把这个Frame保存了,以后要用就直接拖出来.其实要实现你的需求,还有一个推荐的方法,就是"继承".
    你设计好一个窗体(模板),然后其它窗体类声明时直接继承它就行了,一试就爽,试试吧!
      

  3.   

    IDE有个对象库的功能,可以直接继承以前创建的窗体,跟楼主所说的模板差不多。可以研究下。
      

  4.   

    其实将窗体做控件也未尝不可,窗体本身也继承TControl/TComponent
      

  5.   

    先在 Tool-> Repository 里添加一个页面
    然后你在建一个模板From 在Form上右键选择Add to Repository,设置一个标题,选择你设置的页面保存,以后就可以用File->New->Other 来使用该模板了,复制、引用,继承 都可以。
      

  6.   

    哦,看来之前没有完全看明白楼主的需求,现在再来分解一下:1.运行期实现对窗体上的控件拖动或其它编辑.
    关于拖动的实现方案网上很多,你搜一下"delphi 运行期 拖动控件",应该有很多收获.
    其它编辑也简单,就是编辑那些控件的"属性"吧.2.窗体做为"模板",并由其它程序加载使用.
    似乎直接的办法应该就是去加载窗体描述DFM文件.
    用到"对象持久化"或叫"串行化"技术.
    可以参考VCL源码TCustomForm.Create里是怎样载入DFM资源的.3.显示窗体的缩略图.
    这个就相对简单了,就是把窗体的DC保存为图像.
    至于缩放完全可以交给TImage去搞定.以上供参考,希望能对楼主有所帮助.
      

  7.   


    不仅仅是Delphi,其他语言也有持久性特性。你可以把他的内容以流的方式存储,并读出。
      

  8.   

    這主要是持久化的總是,DELPHI的DFM文件是可翠用文件流讀的。
      

  9.   

    看来是得看看它的Create 函数了,是怎么样装载DMF文件的,其实整个程序关键之处也就在这里了,哪位有这方面的详细一点的资料?
      

  10.   

    <<Inside VCL>>第8章看看...
      

  11.   

    http://it.inhe.net/richbbs/2006/345/3459421.htm
    郁闷着,不在公司,刚刚找了下资料回去再看一下,谢谢 楼上的兄弟,我没这本书呢。。 
      

  12.   

    发个链接:
    http://blog.csdn.net/suiyunonghen/archive/2008/01/03/2022856.aspx
      

  13.   

    楼上的兄弟,我要的是不设计期的,是运行期可用,不可能每个窗体都做成一个 Frame 然后供别人用
    另一个总是就是,如何实现像设计期一样编辑控件的大小位置,就是可拖拉伸缩的功能,同样可画出控件的边框
    我试了一下 mouseup,mousedown,mousemove,效果不太理想,不知道有没有什么捷径?
      

  14.   

    烦S人了,需要这样一个控件,
    1.运行期可拖拉,大小可改变,就像DELPHI的设计期一样的功能,当然也要有边框线(这个难度不大) 
    2.文字大小可根据控件的大小自动变化 (字体和像素的转化,麻烦)
    3.文字可调透明度(目前还知道怎么实现)
    4.控件背景可调透明度(可在canvas 上画位图,通过修改位图的透明度)
    5.文字角度可任意旋转(可在canvas 上用 DrawText 来角度旋转)我想通过继承 TGraphicsControl 类来自定义一个控件,但具体不知道要怎么搞,对VCL认识太少了,汗一个......
    哪位帮帮忙吧!!!!
      

  15.   

    转:(拖拉尺寸)
      procedure   TForm1.ManipulateControl(WinControl:   TWinControl;   
          Shift:   TShiftState;   X,   Y,   Precision:   integer);   
      //Precision:精度,该方法可以在onmousemove中调用   
      var     SC_MANIPULATE:   Word;   
      begin   
          //光标在控件的最左侧   
          if   (X   <=   Precision)   and   (Y   >   Precision)   and   (Y   <   WinControl.Height   -   Precision)then   
          begin   
              SC_MANIPULATE   :=   $F001;   
              WinControl.Cursor   :=   crSizeWE;   
          end   
            //光标在控件的最右侧   
          else   if   (X   >=   WinControl.Width   -   Precision)   and   (Y   >   Precision)   and   (Y   <   WinControl.Height   -   Precision)   then   
          begin   
              SC_MANIPULATE   :=   $F002;   
              WinControl.Cursor   :=   crSizeWE;   
          end   
            //光标在控件的最上侧   
          else   if   (X   >   Precision)   and   (X   <   WinControl.Width   -   Precision)   and   (Y   <=   Precision)   then   
          begin   
              SC_MANIPULATE   :=   $F003;   
              WinControl.Cursor   :=   crSizeNS;   
          end   
          //光标在控件的左上角   
          else   if   (X   <=   Precision)   and   (Y   <=   Precision)   then   
          begin   
              SC_MANIPULATE   :=   $F004;   
              WinControl.Cursor   :=   crSizeNWSE;   
          end   
          //光标在控件的右上角   
          else   if   (X   >=   WinControl.Width-Precision)   and   (Y   <=   Precision)   then   
          begin   
              SC_MANIPULATE   :=   $F005;   
              WinControl.Cursor   :=   crSizeNESW     ;   
          end   
          //光标在控件的最下侧   
          else   if   (X   >   Precision)   and   (X   <   WinControl.Width   -   Precision)   and   (Y   >=   WinControl.Height   -   Precision)   then   
          begin   
              SC_MANIPULATE   :=   $F006;   
              WinControl.Cursor   :=   crSizeNS;   
          end   
          //光标在控件的左下角   
          else   if   (X   <=   Precision)   and   (Y   >=   WinControl.Height   -   Precision)   then   
          begin   
              SC_MANIPULATE   :=   $F007;   
              WinControl.Cursor   :=   crSizeNESW;   
          end   
          //光标在控件的右下角   
          else   if   (X   >=   WinControl.Width   -   Precision)     and     (Y   >=   WinControl.Height   -   Precision)   then   
          begin   
              SC_MANIPULATE   :=   $F008;   
              WinControl.Cursor   :=   crSizeNWSE;   
          end   
          //光标在控件的客户区(移动整个控件)   
          else   if   (X   >   5)   and   (Y   >   5)   and   (X   <   WinControl.Width   -   5)   and   (Y   <   WinControl.Height   -   5)then   
          begin   
              SC_MANIPULATE   :=   $F009;   
              WinControl.Cursor   :=   crSizeAll;   
          end   
          else   
          begin   
              SC_MANIPULATE   :=   $F000;   
              WinControl.Cursor   :=   crDefault;   
          end;   
        
          if   Shift   =   [ssLeft]   then   
          begin   
              ReleaseCapture;   
              WinControl.Perform(WM_SYSCOMMAND,   SC_MANIPULATE,   0);   
          end;   
      end;   
        
      procedure   TForm1.Button1MouseMove(Sender:   TObject;   Shift:   TShiftState;   X,   
          Y:   Integer);   
      begin   
          Caption   :=   IntToStr(X)   +   '/'   +   IntToStr(Y);   
          ManipulateControl((Sender   as   TWinControl),   Shift,   X,   Y,   10);   
      end;
      

  16.   

    郁闷得不行了,在 mousemove 中调整frame 的大小和坐标,不知怎么搞的,只有一个左上角可以正常拉伸大小和位置,其余三个点老是不行,一调整它的width 和 height 就变化非常大,但是单步跟踪时它的值是正常的,有可能是什么原因引起的?
      

  17.   

    TFrame可以基本满足你的要求。
      

  18.   

    差不多吧,基本上是用 frame 来构架,想写成控件,太烦人了