2016-08-05 28 views
0

Ich habe ein Problem. Ich kann Variable nicht korrekt neu definieren, indem ich Code folge.Wie definiert man eine TStringList-Typ-Variable

 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;       

In Funktion ReturnRightList füllen i in einem TStringList roleList dass prjOne zugeordnet, prjTwo, prjThird. Aber danach bekomme ich drei TStringLists mit demselben Inhalt. Warum passiert es und wie löst man es? Danke

+0

rolelList sollte ein Array von 3 TStringLists sein. Ändern Sie den Code, um roleList [0], roleList [1], roleList [2] zu erstellen, und ändern Sie den Code, um jedes Mal mit der entsprechenden TStringList zu arbeiten. – Scooter

Antwort

2

Sie haben nur eine einzige Instanz der String-Liste. Beachten Sie, dass Sie nur TStringList.Create einmal angerufen haben. Daher nur eine einzige Instanz. Jedes Mal, wenn Sie eine Liste auffüllen, füllen Sie die gleiche Listeninstanz und überschreiben den vorherigen Inhalt.

Sie müssen drei verschiedene Instanzen instanziieren. Ich kann Ihnen nicht genau sagen, wie Sie das umsetzen können, weil ich nicht Ihr ganzes Programm sehen kann. Sie müssen jedoch TStringList.Create dreimal aufrufen, einen für jede Liste, und diese neu erstellten Listen in Ihren Variablen prjOne, prjTwo und prjThree speichern. Sie müssen auch roleList entfernen, das keine Verwendung bietet.

Der Schlüssel zum Verständnis all dies ist das Konzept eines Referenztyps. Eine Klasse ist ein Referenztyp. Eine Variable vom Typ TStringList ist also eine Referenz auf eine Instanz. Das ist ein Zeiger auf eine Instanz. Wenn Sie einer Referenztypvariablen zuweisen, kopieren Sie die Referenz (den Zeiger) und kopieren den Wert nicht. Das bedeutet, dass sich in Ihrem Code alle drei Variablen prjXXX auf die gleiche Objektinstanz beziehen oder auf dieselbe verweisen.

+0

Ok, aber ich verstehe nicht, wie ich drei verschiedene Intents in diesem Fall verwenden muss – user2032083

+0

Sie benötigen drei verschiedene Listen, aber Sie haben nur eine. Wie kann eine Liste drei verschiedene Werte enthalten? –