2017-11-17 1 views
2

dfm에서 구성 요소를 만들지 않고 건너 뛰는 방법이 있습니까?dfm에서 구성 요소를 수동으로 건너 뛰기

시각 구성 요소가 있습니다. 가끔씩 생성하고 싶지 않습니다. 물론 손으로 구성 요소를 만들 수도 있지만 구성 요소에 많은 항목이 있기 때문에 많은 작업이 필요합니다.

답변

8

실제로 거기에서 은 이것을 수행하는 방법입니다.입니다. 다음은 특정 클래스의 구성 요소를 건너 뛴 예제입니다.

procedure TForm224.DoCreateComponent(Reader: TReader; ComponentClass: TComponentClass; var Component: TComponent); 
begin 
    if ComponentClass = <whatever component class shall be skipped> then begin 
    Abort; 
    end; 
end; 

procedure TForm224.DoReaderError(Reader: TReader; const Message: string; var Handled: Boolean); 
begin 
    Handled := True; 
end; 

그런 다음 폼의 ReadState() 방법이 방법을 오버라이드 (override) :

다음과 비슷한 양식에 두 개의 이벤트 핸들러를 추가

procedure TForm224.ReadState(Reader: TReader); 
begin 
    Reader.OnError := DoReaderError; 
    Reader.OnCreateComponent := DoCreateComponent; 
    inherited; 
    Reader.OnError := nil; 
    Reader.OnCreateComponent := nil; 
end; 

가 해당 구성 요소 클래스의 여러 인스턴스이고, 당신이해야하는 경우 개별 인스턴스를 확인하려면 TReader.OnSetName 이벤트를 사용할 수 있습니다.

procedure TForm224.ReadState(Reader: TReader); 
begin 
    ... 
    Reader.OnSetName := DoSetName; 
    inherited; 
    Reader.OnSetName := nil; 
    ... 
end; 

procedure TForm224.DoSetName(Reader: TReader; Component: TComponent; var Name: string); 
begin 
    if Name = <instance name> then begin 
    Abort; 
    end; 
end; 
+1

단점은 다른 리더 오류를 해당 구성 요소를 건너 뛸 의도로 취급한다는 것입니다. 'OnError' 이벤트 핸들러가 감지 할 수있는 센티넬 메시지를 사용하여 예외를 생성함으로써 피할 수 있습니다 (다소 거친 방식으로). –

+1

또 다른 큰 단점은 * 개별 구성 요소에 적용 할 수 없다는 것입니다. ('Component'는'nil'으로 설정됩니다). – kobik

+1

이것은 영리한 점으로 가득 찬 반면, 그런 불쾌한 똥을 repo에 넣기로 결정한 개발자를 죽이게하는 것은 그런 종류의 일입니다. 런타임시 구성 요소를 관리하는 더 나은 방법이 있습니다. –

6

dfm에서 구성 요소를 건너 뛰는 방법이 있습니까?

제 생각에는 명확한 방법이 없습니다. 양식 디자이너를 사용하여 적용 할 수있는 방법을 찾고 있다고 생각합니다.

Uwe의 대답은 코드를 기반으로하는 방법으로 실제로 묻는 것을 수행하지만 실제적으로는 너무 다루기 힘들다고 개인적으로 생각합니다. 또한 Uwe의 대답은 선택적 구성 요소가 해당 클래스의 유일한 구성 요소가되도록 요구합니다. 그것은 현실적이지 않습니다. 내보기에서

, 최고의 옵션 중 하나입니다 :

  1. 구성 요소가 .DFM 스트리밍의 일부로 자동으로 생성 할 수 있고, 다음을 파괴하거나 런타임에 숨길 중 하나.
  2. 런타임에 선택적으로 구성 요소를 만듭니다.
+3

실제로 내 대답에 설명 된대로 방법이 있습니다. –

+0

@ J ... 당신 말이 맞습니다. 특히 kobik의 포인트를 고려할 때 그렇습니다. –