我创建了2个对象TClient  = class(TPersistent)
       private
          FClientID    : string;    //用户编号
          
          procedure SetClientID(Value : string);
       public
          property ClientID    : string read FClientID write  SetClientID;
          
          procedure Assign(source: TPersistent); override;
          
          constructor Create;
          destructor Destroy;
       end;TLList = class(TObjectList)
    private
      function GetClient(Lindex: integer): TClient  ;
      
    public
      property Client[windex:integer]: TClient read GetClient;          procedure LoadFromDB;
      constructor Create;
      destructor Destroy; override;
  end;
/////////
var
 Test_LList1, Test_LList2 : TLList;
....
procedure Test;
begin
  Test_LList1:=Test_LList1.create;
  Test_LList1.LoadFromDB;
  //当赋值给 test_LList1.ClientID:=1时,如何把这个值 传递给Test_LList2.ClientID 而不是传递地址!
  //当test_LList1.ClientID:=2时,不在影响Test_LList2.ClientID
  //下面该如何写代码 把 1的值赋值给2,而不是共享内存地址?? 如果Test_LList2:=Test_LList1 这样赋值的话,系统传递是内存地址
  Test_LList2:=
end;  
////////procedure TClient.Assign(source: TPersistent);
begin
   if (source is  TClient) then
    begin
      ClientID :=  TClient(source).ClientID;      
    end;
end;function TLList.GetClient(Lindex: integer): TClient  ;
begin
  if (Lindex < 0) or (Lindex >= Count) then
   begin
    result := nil;
    exit;
   end;
  Result := TClient(Items[Lindex]);end;
procedure TLList.LoadFromDB;
var
 Client : TClient;
begin
   
  XXX...'SELECT * FROM LoClientID';
  
  while not XXX.DataSet.Eof do
    begin
      Client := TClient.Create;
      with Client,XXXX.dataset do
        begin
          ClientID := fieldByName('ClientID').AsString;
          
        end;
        Add(Client);
        XXXX.DataSet.Next;
    end;
   XXXX.Free;
end;

解决方案 »

  1.   

    b.assign(a) 这样对像克隆.
      

  2.   

    Test_LList2:=Test_LList2.create
    Test_LList2.Assign(Test_LList1)
      

  3.   

    关键是 property Client[windex:integer]: TClient read GetClient; 怎么用Assign克隆啊
      

  4.   

    看你的代码中,利用LoadFromDB来加载一些对像.
    如果你要把值赋给Test_LList2,你可以定一个client:Tclient;
    for i:=0 to Test_LList1.count-1 do
    begin
      Client := TClient.Create;
      i ftest_LList1.ClientID:=1时
       client.assign(Test_LList1[i]); 
    end;
    你看这样是否可以呢
      

  5.   

    Assign只是TPersistent的一个虚方法,子类覆写AssignTo实现对象的复制。利用RTTI信息实现属性复制,但是published属性才有RTTI信息,但“property Client[windex:integer]: TClient read GetClient”这样的数组属性是不能声明成published的,要复制这样的成员,覆盖一下DefineProperties方法。具体的就不说了。看看VCL source!
      

  6.   

    上面的问题搞定了, 一会儿给分!谢谢兄弟们,再问一个问题:
    A,B:TLTest;A:=TLTest.create;
    B:=TLTest.create;B:=2;
    A:=B;A.free; //问题A释放完后,
    B.free; //B再释放就提示出错了,那么B该如何释放呢?如果不释放,会不会出现内存泄露呢?
      

  7.   

    同样 你只是把B的指针给A 
    A.free的时候 B已经被释放了
    用Assign.
      

  8.   

    A,B:TLTest; A:=TLTest.create; 
    B:=TLTest.create; B:=2; 
    A:=B; 
    -------------------
    B把B的首址赋给A,那实体B永远也不会被使用到,因为没人知道这块地址了,会出现内存泄露。