2012-03-15 2 views
4

AFAIK 해당 레코드가 일반 구조 인 경우 레코드 멤버에 값을 직접 할당 할 수 없습니다. 가진 예를 들어Delphi XE에서 Generics의 레코드 멤버를 효율적으로 변경하십시오.

:

var 
    ... 
    temp: TMyRec; 
    ... 

begin 
    ... 
    temp:=myList[999]; 
    temp.Width:=1000; 
    myList[999]:=temp; 
    ... 
end; 

미운, 천천히,하지만 작품 :

type 

TMyRec = record 
    Width: integer; 
    Height: integer; 
end; 

var 
    myList: TList<TMyRec>; 


... 
    myList[888].Width:=1000; //ERROR here: Left side cannot be assigned. 
... 

는 지금까지, 나는 이것을 극복하기 위해 임시 변수를 사용했다.

type 
    TMyRec = record 
    Width: integer; 
    Height: integer; 
    Points: array or TPoint; 
    end; 

을 ... 정도 앞뒤로 임시 변수에 복사 큰되었다 수있는 다른 데이터 구조는 실현 가능한 옵션이 아니다 :하지만 지금은 TMyRec에 동적 배열을 추가 할 수 있습니다.

질문 :이 레코드가 임시 var에 복사 할 필요없이 일반 구조에있을 때 레코드 멤버를 변경하는 방법은 무엇입니까? 피드백

+0

은 어디'PMyRec' 포인터가 TMyRec''이다'TList를 '등'myList'를 선언 할 수 쓸 수 있을까? 이 방법으로 복사하지 않고 직접 데이터를 사용할 수 있습니다. – teran

+2

@teran 이것은 목록과 별도로 스토리지를 관리해야하기 때문에 불편합니다. 나는 TList <>처럼 동작하는 클래스를 작성했지만 i 번째 요소에 대한 포인터를 리턴하는 특성을 가지고있다. 그건 분명히 작동하지만 그것은 명확하게 내장되어 있지 않습니다. –

답변

6

동적 배열 변수

TIA 어레이 단지 기준이다. 레코드에 단일 포인터로 저장됩니다. 따라서 과도한 복사없이 현재의 접근 방식을 계속 사용할 수 있습니다. 요소를 임시 변수에 복사하는 것은 배열에 대한 참조 만 복사하고 배열 내용을 복사하지 않습니다. 그리고 배열의 항목에 할당하는 경우 복사가 전혀 필요하지 않습니다. 다음과 같이 쓸 수 있습니다 :

실제로 큰 레코드가 있으면 레코드가 아닌 클래스를 사용하는 것이 좋습니다. 클래스의 인스턴스는 참조이므로 위와 같은 인수가 적용됩니다. 이 접근법의 경우 TObjectList <>을 TList <>보다 선호 할 수 있습니다. TObjectList <>의 장점은 OwnsObjects 속성을 True로 설정하고 목록을 멤버가 삭제하도록 할 수 있다는 것입니다.

그런 다음

var 
    myList: TObjectList<TMyClass> 
.... 
myList[666].SomeProp := NewValue; 
+0

..하지만 그가 외부 DLL에 데이터를 전달하려면 인터페이스없이 클래스를 사용할 수 없습니다; – teran

+4

@teran Whoa, DLL은 어디에 들어 있습니까? 그리고이 새로운 새로운 제약은 TList <>와 레코드의 동적 배열을 배제 할 것입니다. –

+3

+1하지만 사용하고있는 배열 색인은 내가 항상 의심해 왔던 것을 지워줍니다 ...

관련 문제