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


person user2032083    schedule 05.08.2016    source источник
comment
rolelList должен быть массивом из 3 TStringList. Измените код, чтобы создать roleList[0], roleList[1], roleList[2] и каждый раз изменяйте код, чтобы он работал с соответствующим TStringList.   -  person Scooter    schedule 26.08.2016


Ответы (1)


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

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

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

person David Heffernan    schedule 05.08.2016
comment
Хорошо, но я не понимаю, как мне нужно использовать три разных экземпляра в этом случае. - person user2032083; 05.08.2016
comment
Вам нужны три разных списка, но у вас есть только один. Как один список может содержать три разных значения? - person David Heffernan; 05.08.2016