Как переопределить переменную типа 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 я заполняю список ролей TStringList, назначенный для prjOne, prjTwo, prjThird. Но после этого я получаю три TStringLists с одинаковым содержимым. Почему это происходит и как это решить? Спасибо

1 ответ

У вас есть только один экземпляр списка строк. Обратите внимание, что вы только звонили TStringList.Create один раз. Отсюда только один экземпляр. Каждый раз, когда вы заполняете список, вы заполняете один и тот же экземпляр списка, перезаписывая предыдущий контент.

Вам нужно создать три отдельных экземпляра. Я не могу сказать вам, как именно это реализовать, потому что я не вижу всей вашей программы. Однако вам нужно будет позвонить TStringList.Create три раза, по одному для каждого списка, сохраняя эти вновь созданные списки в ваших переменных prjOne, prjTwo а также prjThree, Вы также должны удалить roleList который не имеет смысла.

Ключом к пониманию всего этого является концепция ссылочного типа. Класс является ссылочным типом. Так что переменная типа TStringList это ссылка на экземпляр. Это указатель на экземпляр. Когда вы присваиваете переменную ссылочного типа, вы копируете ссылку (указатель), а не копируете значение. Это означает, что в вашем коде все три переменные prjXXX ссылаться или указывать на тот же экземпляр объекта.

Другие вопросы по тегам