Как переопределить переменную типа 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
ссылаться или указывать на тот же экземпляр объекта.