문제

싱글 톤과 글로벌 변수를 피하기 위해 매개 변수를 TFrame 구성 요소로 전달할 수 있기를 원합니다. 그러나 TFRAME는 일반적으로 설계 시간에 양식에 포함되므로 기본 생성자 만 사용할 수 있습니다.

상위 양식은 물론 TFRAME가 생성 된 후 OnCreate 콜백에 일부 속성을 설정할 수 있습니다. 그러나 이것은 속성이 잊혀지지 않도록 보장하지 않으며 종속성은 생성자를 사용하는 것만 큼 명확하지 않습니다.

좋은 방법은 DFM 파일을 읽는 동안 구성 요소를 작성하기 위해 공장을 등록 할 수 있다면 좋은 방법입니다. 그런 다음 공장에서 생성 할 때 필요한 매개 변수를 TFrame 생성자로 전달할 수 있습니다. 이것을 달성하는 방법이 있습니까?

아니면 매개 변수를 TFRAME로 전달하는 방법에 대한 더 나은 솔루션이 있습니까?

도움이 되었습니까?

해결책

후손을 포함한 모든 구성 요소 TFrame, 상속 된 생성자를 사용하여 구성 할 수 있어야합니다. TComponent. 그렇지 않으면 설계 시간에 제대로 사용할 수 없습니다. 설계 시간 사용의 제한이 허용되면 해당 생성자를 무시하고 예외를 제기 할 수 있습니다. 이는 구성 요소가 설계 시간에 양식에 배치되는 것을 방지합니다. 다른 매개 변수가 필요한 다른 생성자를 제공하기 만하면됩니다.

설계 시간 요구 사항으로 인해 모든 구성 요소는 기본값의 일부 또는 모든 속성으로 존재할 수 있어야합니다. 그렇다고 구성 요소가 해당 상태에있는 동안 유용한 일을해야한다는 의미는 아니지만 해당 상태에 무기한 상태를 유지할 수 있어야합니다. 예를 들어, 양식에 구성 요소를 배치하고 양식을 저장하고 델파이를 닫아서 양식 디자인을 재개하려는 의도로 괜찮습니다. 모든 속성이 아직 최종 사용을 위해 설정되지 않더라도 구성 요소는 자체를 저장하고 복원 할 수 있어야합니다.

내가 선호하는 옵션은 런타임에만 구성 요소의 규칙을 시행하는 것입니다. 모든 속성을 사용하기 전에 모든 속성이 현명한 값으로 설정되어 있는지 확인하십시오. 어설 션을 사용하여 구성 요소의 올바른 사용을 시행 할 수 있습니다. 수업 소비자는 자신의 구성 요소 설정을 마치지 않으면 매우 빨리 학습 할 것입니다.

다른 팁

나는 일반적으로 모든 매개 변수를 제공 해야하는 공개적이고 비가적인 "초기화"또는 (미국인에게 초기화) 절차를 추가합니다. 그러면 속성이 설정됩니다.

가능한 경우 속성을 보호하거나 비공개로 만들므로 설정할 수있는 유일한 방법은 초기화 (Afoo, Abar : Integer)를 호출하는 것입니다.

그런 다음 tformxxx.formcreate 또는 tformxxx.create에서 다음을 수행하십시오.

inherited;
Initialise(foo, bar);

자신의 tframe 구성 요소를 작성/레지스터 컴퓨터로 만들고 양식에 배치 할 수 있습니까?

공장에서 필요한 매개 변수를 제공 할 수 있다면 프레임의 기본 생성자를 무시하고 팩토리 클래스에 매개 변수를 문의하지 않겠습니까?

나는 보통 내 자신의 생성자를 만듭니다. 어쨌든 DesignTime에서 프레임을 만드는 것을 좋아하지 않습니다.

a) 필요할 때 프레임을 동적으로 만들 수 있으며 필요하지 않은 경우 파괴 될 수 있습니다.

b) 파라미터 데이터 유형 또는 데이터 구조로 프레임에 공공 속성을 제공하고 속성을 통해 값을 양식으로 전달하십시오.

예시:
TAddress - 주소의 일반적인 요소를 보유하는 클래스.
TAddressFra - 주소를 표시하기 위해 시각적 컨트롤이있는 프레임

  • 인스턴스를 채우십시오 TAddress 값으로
  • 인스턴스를 만듭니다 TAddressFra
  • 할당 TAddressFra.address 그 자산 TAddress 사례
  • 절차를 사용하십시오 setAddress(o_address : TAddress) 값을 할당합니다 TAddress 해당 시각적 구성 요소의 속성 TAddressFra
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top