我是初学者,希望大家帮忙看一下。
在一个对象中,我动态创建一个ListBox,并且在Listbox中保存了一个Object
随便什么(如:TEdit等),实际上我是要保存数据集列表。
用WriteComponent保存到一个Stream中,
在用readComponent重新创建时,出错,control “listbox的名称”not parent window,
如果我不在listbox中加Object,则不会报错,且组件及它的属性的保存和读取都没有问题。
我是组件编程的初学者,各位大虾帮忙解决一下。
分数不够的话,可以再加。谢谢了。

解决方案 »

  1.   

    再说清楚一下我的实际情况:
    我有一个bolbfield,里面存储了界面信息。
    作了一个对象,对象可以增加删除一些控件,如dbedit,Dbgrid,
    现在我还需要保存一个数据集列表,
    我先做了一个DataObj的类,继承了Object,里面放了ClientDataSet,DataSource,以及一些他们的读取属性。
    然后我把DataObj对象用listbox.additem(String;TObject)方法加入到Listbox中,这样就形成一个数据集列表。
    现在出现了1楼的问题。
      

  2.   

    你在创建ListBox的时候是不是没有指定Parent?把你的代码贴出来看看?
      

  3.   

    动态创建的控件不能在Create方法中对其有句柄的操作,而应该是覆盖CreateWnd方法,在CreateWnd方法中创建,因为控件在Create时尚未构成窗体;
    procedure CreateWnd(...);
    begin
      inherited CreateWnd(...);
      .....
    end;
      

  4.   

    李维的VCL那本书的第8章讲的有。
      

  5.   

    自己看了会儿源码,
    原来我用 
    for i:= 0 to self.controlcount -1 do
       stream.writeComponent(self.control[i])
    去保存self的组件信息,读取用
    for i:= 0 to self.controlcount -1 do
    begin
       control := TControl(stream.readComponent(nil))
       self.insertControl(control) 
    end
    现在改了
    保存:stream.writeComponent(self) 
    读取:self := TSelf(stream.readComponent(self)) ;现在listbox及他的Items都可以读出来,但他的Object没有了 ,不知道为什么,大家帮忙看看
      

  6.   

    这就是用WriteComponent的一个局限。原来连接上的Object其实并不存在于Delphi自己的持久对象管理机制中。所以Delphi不会自动帮你把Object的实例也保存到流中。你必须自己写方法来保存连接上去的对象。这一个主题其实并不简单。因为你保存了对象后,需要另外的一套管理机制(Id或者Name映射)来恢复原先的连接。个人觉得WriteComponent对开发人员其实没什么用。因为它只对在DelphiVCL框架下的对象有效,对于你自己定义的非Component对象则完全没有效果。还是自己完成流管理吧!
      

  7.   

    请教楼上的高手,
    我后来改了ListBox中Object的对象,就是我2楼提到的DataObj,我把他从Tcomponent继承,
    但还是没有用,可能要好好看看TPersistent了,
    昨天我还一位listbox的object存的是object的poient,所以无法保存,查了好多资料,没有找到相关的信息。
    难道listbox中的object的参数类型是TObject,writeComponent就不保存了吗?即使我传入的是TComponent或者是TControl,我甚至放一个TEdit都不可以。
      

  8.   

    WriteComponent应该只会保存连接在Components下面的子控件的Published属性,而Objects不在此列。同时,对于有自定属性(比如对象)的对象还要求自己实现DefineProperties方法以用来实现保存。你的问题是:Objects是非标准的属性,你必须自己重载ListBox的DefineProperties方法来实现数据的。不论在哪个框架下,Objects的保存始终是要你自己实现的。
      

  9.   

    楼上的高手,再请教一个问题
    在dfm文件中保存着组件信息,我举例说明一下我的问题:
    一个DataSource
    一个ClientDataSet
    DataSource.DataSet := ClientDataSet
    此时在dfm文件中,就会是,
      object DataSource: TDataSource
        DataSet = ClientDataSet
      end
    当然这里的"DataSet = ClientDataSet"中后面的ClinentDataSet存的肯定是ClientDataSet.Name
    我想问的是,在创建窗体时,
    DataSource是不是在它的Owner中用for i:=0 to owner.componentcount do 
    去查找这个ClientDataSet,如果没有就创建(当然创建的时候要读取CLientdataset的属性)
    这样的话,是不是在创建窗体时要循环好多遍ComponentCount,
    可以留个msn吗?
      

  10.   

    http://community.csdn.net/Expert/topic/3568/3568946.xml?temp=.969433
      

  11.   

    应该不是。正确的步骤应该是先创建所有的控件,然后根据dfm中的数据恢复他们的属性。对于对象之间的连接应该就像你说的那样根据名字来查找相应的实例。至于循环的次数,大概是可以忽略不计的,因为一个窗口上面实在是摆不了多少个控件。几十上百次的循环对计算机来说算不了什么。