2013-09-02 2 views
1

매개 변수를 통해 "Form 2"에 개체 목록을 보내는 "Form 1"이 있습니다.TObjectList를 매개 변수로 전달 - Delphi Xe2

를 Form1 :

var list: TObjectList<TPerson>; 
    begin 

     list := TObjectList<TPerson>.Create(); 

     Try 

     list.Add(TPerson.Create('JOHN', 29)); 
     list.Add(TPerson.Create('MARK', 27)); 

     Form2.getList(list); 


     Finally 
     FreeAndNil(list); 
     End; 

문제 I는 "폼 1"오류의리스트를 공개 닫으면 있도록하지만 Delphi는 "폼 2"샘플로

에서 참조로 목록 발생 보내 "Form 1"참조 목록의 목록을 릴리스 한 후 릴리스 된 객체를 가리 킵니다.

질문 :

어떻게 복사가 아닌 참조로 "폼 2"에 목록을 보내?

감사합니다.

+1

생각보다 힘들어. 1 단계는 TPerson을 값 유형, 즉 레코드로 변환하는 것입니다. 일단 당신이 그 목록을 복사하면 한 - 라이너가됩니다. –

답변

0

, 대답은 TObjectList와 <T> 이후 델파이의 클래스와 클래스는 참조 형식입니다, "불가능"입니다.

실제로, 메서드에 전달하는 내용 Form2.getList()은 값이지만 참조는 값이므로 참조로 값을 전달하는 것과 같습니다.

이 목록의 사본을해야하는 경우, 당신은 스스로를해야하지만, 변수 목록 항목을 소유 한 목록에 대한 참조를 가지고 있으므로 경우에도 당신은 두 번째 목록을 작성 inside Form2 그리고 단순히 매개 변수로받은 목록에있는 항목을 추가하면 해당 항목은 Form1에서 목록이 삭제되면 계속 파괴됩니다. 당신의 장소에서

나는 의 목록에 Form1에에서 이동 목록에서 항목을 Form2Form2.getList을 구현하는 것입니다. 이런 식으로 뭔가 :

procedure TForm2.getList(aPeople: TObjectList<TPerson>); 
begin 
    while aPeople.Count>0 do 
    FPeople.Add(aPeople.Extract(aPeople[0])); 
end; 

이 코드 FPeople에서이 TPerson >TObjectList와 <로 선언 TForm2의 데이터 멤버입니다. 추출 메서드는 항목을 해제하지 않고 목록에서 항목을 제거합니다. 따라서 추출한 후 항목이 내부 목록에 추가됩니다. 그것은 더 이상 외부 목록에 없으므로 목록이 없을 때 더 이상 해제되지 않습니다.

+0

정확하게, 내 게재 위치를 완벽하게 이해했습니다. 나는 당신과 같은 코드를 이미 작성했고 작동합니다! 그러나 모든 항목을 반복하지 않고 목록의 복사본을 만들 수 있는지 궁금합니다. 나는 믿지 않는다. – Marcoscdoni

1

Form2 Form2는 목록의 소유권을 가져 와서 Form1에서 자유롭게하지 말고 그렇지 않으면 내용을 자체 로컬 목록에 복사하는 목록을 반복합니다.

+0

Form1의 범위를 벗어난 변수를 다른 옵션으로 옮길 수 있다고 생각합니다. – alcalde

0

Tobjectlist의 소유권을 확인하십시오. 목록을 비우면 목록이 소유되어 있으면 목록이 해제 될 때 목록의 개체가 해제됩니다.

시도 TObjectList<TPerson>.Create(false); 문제가 공식화 된 정확한 방법을 고려