2012-09-10 4 views
4

프로 시저에 "모든"레코드 유형을 전달할 수 있습니까?함수의 유형이 지정되지 않은 매개 변수를 통해 전달 된 레코드를 마무리하는 방법은 무엇입니까?

"레코드"를 여러 번 사용했습니다.

Finalize(R); 
FillChar(R, SizeOf(R), #0); 

문제는 내가 기록의 어떤 종류를 전달하는 방법을 취소 할 수 있다는 것입니다 :

type 
    TR = record 
    a: string; 
    b: string; 
    end; 

을 지우려면 내가 쓸 필요가?

나는이 힌트를 얻었습니다. "식 초기화/마무리 필요 없음".

procedure ClearRecord(var R); 
begin 
    Finalize(R); 
    FillChar(R, SizeOf(R), #0); 
end; 

모든 정보 주셔서 감사합니다!

+0

나는 처음에이 지정되지 않은 매개 변수를 발견하지 않았다. 유형이 지정되지 않은 매개 변수를 사용하여 일반적인 것을 수행 할 수 없습니다. @ LURD의 대답은 나에게 잘 어울립니다. –

+0

당신의 프로 시저'ClearRecord'는 어떤 데이터에 대한 원시 포인터를 얻습니다. 그것은'TypeInfo (R)'을 두 번째 인수로 전달하고 그 레코드 레이아웃을 읽을 수 있어야합니다.하지만 나는 LU RD의 대답에 동의합니다. 이것은 너무 복잡해서 노력할만한 가치가 없습니다. – hvd

+2

@hvd 'InitializeArray (@R, TypeInfo (TR), 1)'을 사용하여이를 달성 할 수는 있지만 예전의 오래된 할당이 가장 좋습니다. –

답변

11

지나치게 복잡하게 만들지 마십시오. 그것을

Const TR_Empty: TR =(); 

및 사용 : 당신이 기록을 지우려면 두 라이너를 작성하지 않을 경우, 선언 고려

R := TR_Empty; 

그리고 다른 사람에 의해 주석으로, 일반적인 절차는이 작업을 수행하기를 노력할만한 가치가 없다. 델파이 2009 이상을했을 경우

,이 코드는 기록을 삭제 유효 :

R := Default(TR); 
+0

'기본값'에 대해 들어 본 적이 없습니다. 새로운 것을 배우기 좋은! – TLama

+2

@TLama, David 's answer here : [Delphi에서 다양한 유형의 레코드를 한 번에 확보하는 방법] (http://stackoverflow.com/a/11066205/576719). –

+0

지나치게 복잡하지는 않지만 두름 다라가하는 일은 아마 허약합니다. –

관련 문제