2009-12-11 5 views
0

두 구성 요소의 상태 (예 : Comp1: TSomeComponentComp2: TSomeComponent)를 비교하고 싶습니다. 즉, 두 구성 요소의 모든 게시 된 속성 값을 비교하고 싶습니다. 일부 속성은 TListBox.Items 속성처럼 인덱싱됩니다. 이 작업을 수행하는 쉬운 방법이 있습니까? 반복되는 RTTI 코드를 호출해야합니까?델파이 : 두 구성 요소 간의 속성 비교

+2

Delphi 2010은 이전보다 훨씬 새롭고 향상된 RTTI를 도입했습니다. 따라서 현재 정답에 대답하기 위해 현재 사용중인 델파이 버전을 아는 것이 중요합니다. –

+0

아아아, 저는 D2009를 사용하고 있습니다. 하지만 : 어쨌든 언젠가는 언젠가 D2010으로 옮길 것입니다. 그래서 이것은 전환해야 할 움직임이 될 수 있습니다. 이것이 D2010에서 가능합니까? – conciliator

+1

'게시'에만 관심이 있으므로 모든 버전의 Delphi에서 RTTI로이 작업을 수행 할 수 있습니다. –

답변

2

쉬운 방법은 모두 WriteComponent으로 직렬화하고 결과 문자열을 비교하는 것입니다. 그러나이 경우 이 아닌 public 속성 만 비교됩니다. 그러나 당신이 필요하다고, 그래서 무엇을 ... 이것은 위해 중요한 인덱싱 된 속성의, 말, 할 것이라고

참고. 그것은 당신이 원하는 것일 수도 아닐 수도 있습니다.

+0

감사합니다. Craig, 저는 실제로 그것을 고려하고있었습니다. 원래 질문에서 쓰지 않은 것은 WriteComponent를 사용하여 (차이의 경우) 속성을 작성하기 전에 속성을 비교하기 위해서였습니다. AFAIU를 사용하면 WriteComponent를 사용하여 작성된 특정 속성을 선택할 수 없습니다. 사실입니까? (잠시 동안, 내가 관심을 갖는 것은 게시 된 소품입니다 ...) – conciliator

+0

나는 당신이 옳다고 믿습니다. –

+0

사실, 속성을 작성하는 방법을 알아볼 수 있습니다. 'TComponent.DefineProperties' 및 관련 메소드/구성 요소를 살펴보십시오. 이것은 수년 전이지만 속성을 모두 표시하지 않고 게시 된 것으로 선언되지 않은 속성을 추가했습니다. –

0

아쉽게도 델파이에는 간단한 비교 기능이 없습니다. (나는 D2007에서 멈췄다.) 메소드를 기본 클래스에 "비교"하고이 메소드 내부의 모든 필드를 비교할 수있다. D2007에서는 이것을 헬퍼 클래스로 만들 수 있지만 여전히 필드를 지정해야합니다. 다른 클래스를이 기본 클래스에서 상속 받아 기본 비교 메서드를 재정의 할 수 있습니다.

RTTI를 사용하면 여러 유형의 클래스 필드를 비교하는 것이 쉬워 지지만 복잡하고 오류가 발생하기 쉽습니다. 그것은 모든 종류의 다른 클래스들로 많은 테스트를 요구할 것입니다.

0

내가 사용하는 트릭 (IDE에서 통합 된 것과 같은 것을 갖고 싶습니다.)은 dfm에 액세스하기 위해 두 구성 요소 (ALT + F12 사용)와 관련된 dfm 부분을 복사 한 다음 두 구성 요소 NotePad++에서 비교 플러그인을 사용하여 2를 비교합니다. 좋은 시각적 출력을 제공하지만 IDE에서 다른 구성 요소를 선택하는 것보다 더 많은 시간이 소요됩니다. 그리고 비교 도구와 비교해보십시오. IDE.

관련 문제