2016-08-05 8 views
0

問題があります。私は次のコードによって変数を正しく再定義することはできません。関数ReturnRightListで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;       

私はprjOne、prjTwo、prjThirdに割り当てられていることをTStringListののRoleListを記入。しかし、その後、私は同じ内容の3つのTStringListsを取得します。なぜそれが起こり、どのように解決するのですか?おかげ

+0

rolelListは、3つのTStringListsの配列でなければなりません。 roleList [0]、roleList [1]、roleList [2]を作成し、その都度適切なTStringListを処理するコードを変更するようにコードを修正します。 – Scooter

答えて

2

あなただけの文字列リストの単一のインスタンスを持っています。あなたはTStringList.Createを一度しか呼んでいないことに注意してください。したがって、単一のインスタンスのみです。リストを作成するたびに、同じリストインスタンスを作成して、前のコンテンツを上書きします。

次の3つの異なるインスタンスをインスタンス化する必要があります。私はあなたのプログラムのすべてを見ることができないので、実際にこれを実装する方法を正確には伝えられません。しかし、あなたは、変数prjOneprjTwoprjThreeでこれらの新しく作成されたリストを格納し、TStringList.Create 3回、各リストのための1つを呼び出す必要があります。あなたはまた使用しないroleListを取り除く必要があります。

このすべてを理解する鍵は、参照型の概念です。クラスは参照型です。したがって、タイプTStringListの変数はインスタンスへの参照です。これはインスタンスへのポインタです。参照型変数に代入するときは、参照(ポインタ)をコピーしていて、値をコピーしていません。つまり、あなたのコードでは、すべての3つの変数prjXXXが同じオブジェクトインスタンスを参照または指しています。

+0

[OK]を、しかし、私はこの場合に3つの異なるintancesを使用する必要がある方法を理解していません – user2032083

+0

3つの異なるリストが必要ですが、1つだけがあります。 1つのリストに3つの異なる値をどのように表示できますか? –

関連する問題