2016-08-05 2 views
0

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

+0

rolelList должен быть массивом из 3 TStringLists. Измените код для создания roleList [0], roleList [1], roleList [2] и измените код, чтобы обрабатывать соответствующий TStringList каждый раз. – Scooter

ответ

2

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

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

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

+0

Хорошо, но я не понимаю, как мне нужно использовать три разных понятия в этом случае. – user2032083

+0

Вам нужны три разных списка, но у вас их есть только один. Как один список может содержать три разных значения? –

Смежные вопросы