如何重新定义TStringList类型变量

时间:2016-08-05 09:51:41

标签: lazarus freepascal tstringlist

我有一些问题。我无法通过以下代码正确地重新定义变量。

      UnitObj.prjOne:=ReturnRightList(0);
      for j:=0 to UnitObj.prjOne.Count-1 do
            str:=UnitObj.prjOne.ValueFromIndex[j];//here i get for example '32'

      UnitObj.prjTwo:=ReturnRightList(1);
      for j:=0 to UnitObj.prjTwo.Count-1 do
            str1:=UnitObj.prjTwo.ValueFromIndex[j];//here i get for example '40'

       for j:=0 to UnitObj.prjOne.Count-1 do
          str4:=UnitObj.prjOne.ValueFromIndex[j]; // WHY HERE I GET '42' instead of '32' 

      UnitObj.prjThird:=ReturnRightList(2);
      for j:=0 to UnitObj.prjThird.Count-1 do
            str2:=UnitObj.prjThird.ValueFromIndex[j];//here i get for example '42'


procedure TfrmLogin.FormCreate(Sender: TObject);
begin
  roleList:=TStringList.Create;
end;
function TfrmLogin.ReturnRightList(bPos:integer):TStringList;
var sqlString:string;
begin
  roleList.Clear();
  case bPos of
       0:sqlString0;//some sql queries
       1:sqlString1;
       2:sqlString2;      
  end;
      SQLQueryPrjRight.Close;
      SQLQueryPrjRight.SQL.Strings[5]:=sqlString;
      SQLQueryPrjRight.ParamByName('ID').Value:=uInfo.ID;
      SQLQueryPrjRight.Open;
      while not SQLQueryPrjRight.EOF do
                begin
             roleList.Add(IntToStr(SQLQueryPrjRight.FieldByName('pID').AsInteger));
             SQLQueryPrjRight.Next;
            end;
  Result:=roleList;
end;                        

在函数ReturnRightList中,我填写一个分配给prjOne,prjTwo,prjThird的TStringList roleList。但在此之后我得到三个相同内容的TStringLists。为什么会发生以及如何解决?感谢

1 个答案:

答案 0 :(得分:2)

您只有一个字符串列表实例。请注意,您只调用了TStringList.Create一次。因此只有一个实例。每次填充列表时,都会填充相同的列表实例,覆盖以前的内容。

您需要实例化三个不同的实例。我无法告诉你如何实现这一点,因为我看不到你的所有程序。但是,您需要调用TStringList.Create三次,每个列表一个,将新创建的列表存储在变量prjOneprjTwoprjThree中。您还需要删除不起作用的roleList

理解所有这一切的关键是参考类型的概念。类是引用类型。因此,TStringList类型的变量是对实例的引用。这是一个指向实例的指针。分配给引用类型变量时,您正在复制引用(指针)而不复制该值。这意味着在您的代码中,所有三个变量prjXXX都引用或指向同一个对象实例。