Form上创建多个Frame,每个Frame初始画面都是一样。
通过配置文件来获得需要创建Frame的个数,Frame里有控件及控件的事件。
现在问题在于 怎么多线程创建Frame,以及把参数传递进Frame。

解决方案 »

  1.   

    建一个Frame,上面只放一个Edit,名称为Edt1,用于显示传入的参数。
    基本思路:创建线程时先挂起,传入参数后,线程执行,创建frame和显示参数值,为了显示得更为清楚,我在主窗体上加入一个PageControl,每个Frame附在一个动态生成的页面上。
    线程源码:unit Unit3;interfaceuses
      Classes,Unit2,Unit1,ComCtrls;type
      TCreatFrame = class(TThread)
      private
        pp:string;
        frame:TFrame2;
        procedure setEdtText;
        { Private declarations }
      protected    procedure Execute; override;
      public
        procedure setParam(ppp:string);
      end;implementation
    procedure TCreatFrame.Execute;
    begin
      { Place thread code here }
      FreeOnTerminate:=True;
      Synchronize(setEdtText);
    end;procedure TCreatFrame.setEdtText;
    var ts:TTabSheet;
    begin
      with Form1 do
      begin
        ts:=TTabSheet.Create(pgc1);
        ts.PageControl:=pgc1;
        frame:=TFrame2.Create(ts);
        frame.Parent:=ts;
        frame.edt1.Text:=pp;
      end;
    end;procedure TCreatFrame.setParam(ppp: string);
    begin
      pp:=ppp;
    end;end.
    调用线程源码:var c:Tcreatframe;
    begin
      c:=tcreatframe.create(True);
      c.setParam('Test');//传入参数
      c.Resume;
    end;
      

  2.   

    使用多线程当然是好,但也要看看你的CPU可以承载多少个线程,不然会挂了的。
      

  3.   

     to last_wolf1860 
    谢谢
    测试通过。
    这只做了其中一部分的工作。
    那怎么创建多个Frame,我需要显示在Form上。
    (我没法做到同时创建,目前只是通过轮询方式创建,速度太慢)
      

  4.   

    两种办法:
    1.在调用代码里for i:=0 to 30 do
    begin
      //创建线程的代码,这种主要是解决不同的frame中不同的参数,一个线程中仅创建一个Frame
    end;
    2.如果不需要为不同的frame传递参数,就把创建过程放到线程里面。我不是很理解你的需求,你可以简单地把需求和设计描述一下,推敲优化一下?
      

  5.   

     一个监控画面,Form上根据配置来决定需要创建多少个Frame,每个Frame从Form里传递参数进去,独立监控。
      

  6.   

    按照你的方法 创建多个Frame 到时实现了。但是有个问题,是这么多Frame都排列在一个Form上,每个Frame位置大小 就会难以控制。
      

  7.   

    为什么不排在PageControl上呢?
      

  8.   

    如果是排在PageControl那就需要手动来切换画面。
    就是想让所有的画面都同时显示出来。
      

  9.   

    Frame个数有大约数吗?或者是说有没有上限?
      

  10.   

    最多16个,因为Frame上也要放点内容,所以也不能 太多。
      

  11.   

    如果要讲究美观的话,不定数的界面组件最好使用Dev的Layout组件,动态加入创建的Frame,规定好尺寸后,其它的不需要管。这是一种思路。
    另外使用cxGrid的CardView也可以达到这种效果。
    选择依据:如果frame上面放的东西是图、表等等不规则的东西,建议使用Layout
    如果仅仅是显示几行字符,类似于数据库中的几个字段,建议使用cxGrid,这种做法的选择较多,如果还附带检索的话,可能就需要用到内在表之类的(比如ClientDataSET)
      

  12.   

    这俩控件 还真的没用过。
    如果说设定Form上只放4*4个Frame,那该如何来布局Frame。
      

  13.   

    to last_wolf1860  
    谢谢
    按照你的思路,多线程Frame创建应该没问题了。
    但,我对多线程不太了解。每个Frame是作为监控,也就是说如果有线程需要断开,那怎么通知主线程。