2010-03-17 3 views
1

이전 사용자 지정 양식 디자이너를 Delphi의 폼 디자이너로 바꾸려고합니다. 우리의 응용 프로그램은 우리 자신의 보고서 작성자가 사용할 수있는 양식을 생성하는 사용자 정의 프로그램을 사용했습니다. 이전 응용 프로그램을 유지하기 어렵고 폼 디자이너를 위해 Delphi를 사용하는 것이 좋은 방법 인 것 같습니다. 이 양식을 사용하는 응용 프로그램은 Delphi로 작성되었지만 실제로 양식으로 표시되지는 않습니다. 구성 요소를 반복하고 보고서를 생성합니다.양식의 다른 구성 요소를 옮길 때 사용자 지정 구성 요소 업데이트

현재 양식 디자이너의 기능 중 하나는 "이웃 목록"입니다. 이웃 목록은 양식의 모든 셀에 대해 다음 위, 아래, 오른쪽 및 왼쪽 셀을 추적합니다. 오래된 디자이너는 디자인 단계에서 양식을 저장할 때이 목록을 업데이트합니다.

다른 모든 것들은 일반적인 컨트롤 속성 (위치, 높이, 너비 등)을 매우 쉽게 추적 할 수 있어야합니다. dfm에서이 유형의 이웃 정보를 생성하고 저장하는 방법을 알아낼 수 없습니다.

디자인 타임에 폼의 구성 요소가 변경되면 이벤트가 발생하도록하는 방법이 있습니까? 또는 양식을 저장할 때의 이벤트입니까?

나는이 문제에 대해 두 가지 접근법을 생각했다. 1) 각 개별 컨트롤에 이웃 정보를 유지한다. 그것은 일종의 일이지만 업데이트 할시기를 알 수있는 이벤트를 얻을 수 없다면 양식의 다른 컨트롤을 이동할 때 동기화 상태가 해제되는 문제가 있습니다.

2) 목록을 추적하는 비 시각적 구성 요소가 있습니다. 목록을 다시 생성 할 수있는 "업데이트"단추가있는 사용자 지정 속성 편집기 페이지를 추가 할 수는 있지만 최종 버전을 저장하기 전에이를 클릭해야한다는 것을 기억해야합니다. 나는 그 단계가 빠져있는 것을 볼 수 있으며 오히려 그냥 작동하는 무언가를 가질 것입니다.

또한 런타임에 이웃을 동적으로 찾기 위해 응용 프로그램을 변경할 수도 있지만 디자인 타임에 작동하도록하는 방법을 찾을 수 있기를 기대했습니다.

모든 버전의 Delphi 용 솔루션이 효과적입니다.

이것이 일반적인 생각이 아닌 이유에 대한 의견은 내가 올바른 방법이라고 100 % 확신하지 못했기 때문에 일반적으로 좋지 않을 것입니다. :-)

+0

처음부터 이웃 목록을 가지고있는 이유를 밝히지 않았기 때문에 이것이 좋은 아이디어인지는 말하기 어렵습니다. 왜 그런 목록이 필요한지 우리에게 말하면, 우리는 유지 보수를 자동화하려고 시도하는 것이 좋은 생각인지 말할 수 있습니다. –

+0

Rob의 질문에 대한 결론 : 현재 VCL Form에서 탭 순서를 지원하고 이웃 목록을 잊지 않는 이유는 무엇입니까? –

+0

다음과 이전보다 더 많은 것을 필요로하기 때문에 이웃리스트가 필요합니다. 또한 위, 아래, 왼쪽, 오른쪽이 필요합니다. 현재 사용자는 화살표 키를 사용하여 서식을 따라 이동하여 데이터를 입력 할 수 있습니다. 또한 "다음"및 "이전"개념이 탭 키에 매핑됩니다. 그리드를 생각해보십시오. 각 셀은 위쪽, 아래쪽, 왼쪽 및 오른쪽을 가질 수 있지만 탭 키를 사용하면 다음 열의 맨 위로 이동할 수 있습니다. "좋은 아이디어"라는 질문은 현재 사용자 정의 빌드 디자이너를 업데이트하는 대신 일반적으로 Delphi 폼 디자이너를 사용하는 것에 관한 것입니다. –

답변

3

새 TForm 자손을 만들고 DefineProperties 함수를 재정 의하여 스트리밍 프로세스의 일부로 목록을로드하고 저장합니다. Marco Cantù는 Delphi Developer's Handbook에 새로운 디자인 시간 형식을 추가하는 방법에 대해 자세히 설명하지만 등록 절차에서 RegisterCustomModule으로 전화를 걸어 볼 수 있습니다.

TApplicationEvents 개체 (AppEvnts.pas)를 만들고 OnMessage 처리기를 할당하고 WM_SIZE 메시지를 볼 수 있습니다. 그런 다음 FindControl을 사용하여 메시지가있는 TWinControl을 가져 와서 양식에 부모 역할을하는지 확인하십시오. OnMessage는 전체 IDE에 대한 모든 메시지를 보게되므로 여기에서 수행하는 모든 필터링이 빠르다는 것을 확인하십시오.

+0

DefineProperties 함수를 오버랩하는 것은 트릭을 수행하는 것처럼 들립니다. 오늘 밤 좀 보자. –

+0

RegisterCustomModule은 제가 찾고있는 것입니다. 당신이 제공 한 링크는 델파이 7의 경우 다소 오래되었습니다. 나는 또 다른 질문을하여 업데이트 된 정보를 찾아 보도록하겠습니다. –

0

TComponent.Notification 방법을 사용하십시오. 공통 소유자가 소유자에게 삽입되거나 제거 될 때 공통 소유자가있는 모든 구성 요소에서 호출됩니다. FreeNotification으로 전화를 걸어 다른 소유자와 함께 구성 요소에 대한 알림을받을 수도 있습니다.

예를 들어 버튼에 PopupMenu 속성이 설정되어있는 경우 버튼은 메뉴 구성 요소의 FreeNotification 메서드를 호출합니다. 메뉴가 나중에 삭제되면 버튼에 Notification이 호출되고 더 이상 유효한 객체를 나타내지 않으므로 버튼의 PopupMenu 속성이 지워집니다.

Notification을 무시하면 삽입 및 삭제를 모니터링 할 수 있습니다. 더 어려운 작업은 구성 요소 으로 이동할 때를 모니터링하는 것입니다. 구성 요소가 추가되었을 때 왼쪽 이웃 이었기 때문에 왼쪽 이웃으로 영원히 남을 것입니다. 실제로 위치는 삽입시 유효하지 않을 것입니다. 런타임에는 컨트롤의 위치가 변경되지 않을 가능성이 있으므로 컨트롤의 상대적 위치를 감지 할 수있는 방법이 있으면 Loaded 메서드가 좋습니다. 그것을하기 위해.이 메서드는 DFM을 읽고 모든 구성 요소의 속성을 설정 한 후에 호출됩니다.

관련 문제