2013-08-30 2 views
3

우리는 300 개 이상의 서로 다른 형식으로 구성된 대규모 레거시 데이터베이스 기반 VCL 응용 프로그램을 보유하고 있습니다. 우리는 생산 데이터베이스와 함께 설치된 소프트웨어 (연습/연습용 등)와 함께 실습 (더미) 데이터베이스를 제공하고 싶습니다.각 양식의 코드를 수정하지 않고 응용 프로그램의 모든 양식에 테두리를 추가하려면 어떻게합니까?

문제는 사용자가 연습 모드를 사용할 때 연습 모드에서 작동하는 것을 알 수 있도록 눈에 띄는 것이 무엇인지 명확하게해야한다는 것입니다. 가장 이상적인 솔루션은 모든 단일 폼의 안쪽 모서리에 빨간색 테두리를 배치하는 것입니다. 그러나 내가 각자 하나씩 수정하고 싶지 않은 많은 형태가 있습니다.

하나의 글로벌 장소에서 응용 프로그램의 모든 양식 가장자리를 따라 (예 : 외부가 아닌 Windows 테두리 안에) 프레임을 추가하려면 어떻게해야합니까?

VCL 스타일을 사용할 수 없습니다. 그렇지 않으면 거기에서 구현할 것입니다. 전 모든 양식을 반복하고이 경계선을 그릴 수있는 글로벌 수준의 무언가를 찾고 있습니다. 그러나 이는 또한 모든 양식의 크기 조정 메시지를 포착하고이 경계를 다시 그리는 것을 의미합니다.

내가 볼 수있는 가장 쉬운 방법은이 기능을 가진 기본 양식을 만들고이 기본 양식에서 시스템의 모든 양식을 상속하는 것입니다. 그러나 이것은 여전히 ​​모든 형태가 이것에 기초하고 있음을 확인하는 것을 의미합니다. 과거에 기존 양식의 기본 양식 (다른 주제)을 수정하는 데있어 다른 문제가 있었기 때문에 더 쉬운 해결책이 있다면 그 해결책을 피하고 싶습니다.

+3

양식이 자체 기본 클래스를 기반으로하지 않으십니까? – bummi

+1

만약 내가이 시스템을 처음부터 디자인했다면 나는 기초 양식을 만들 것이다. 문제는 소프트웨어가 약 20 년 오래되었고 거대합니다. 많은 다른 형태가 이미 여러 번 상속받습니다. –

+1

그래서 기본 폼을 삽입하십시오. 무엇이 널 멈추게 해? –

답변

4

양식을 TComponent.ReadState으로 대체하여 스트리밍을 처리하는 TReader에 이벤트 처리기를 추가하는 등의 방법으로 양식 스트리밍 시스템에 연결하는 방법이 있지만 문제의 양식 클래스에서 실제로 코드를 변경해야합니다. 프로그램 전체에서 TReader 동작을 전역 적으로 수정할 수있는 방법이없는 것으로 보입니다. 따라서 앱의 모든 양식에 대한 실제 기본 양식 클래스가 없어도이를 쉽게 수행 할 수있는 방법은 없습니다.

을 메모리에 패치하려고해도 가상 메소드이고 TCustomForm에 대한 재정의가 없기 때문에 모든 변경 사항이 양식뿐만 아니라 모든 구성 요소에 영향을 줄 수 있습니다.

솔직히 말해서 이것을 처리하는 가장 좋은 방법은 글 머리 기호를 물고 class(TForm에 대한 코드베이스 전체 검색을 실행하고 찾고있는 동작을 보여주는 사용자 정의 폼 클래스의 서브 클래스가되도록 변경하는 것입니다 에 대한. 이론적으로는이를 수행하는 다른 방법이있을 수 있지만 예측할 수없는 부작용이있을 수있는 매우 털이 많은 런타임 트릭이 필요합니다.

+0

당신은 무엇을 알고 있습니다, 여기 두 답은 제가 필요로하는 최종 해결책을 포함하고 있습니다 만, 이것에 대해서는 좀 더 자세하게 설명했습니다. 필자는 앞으로 생산 모드 또는 실습 모드에서 실행 중인지 여부를 자동으로 감지하는 기본 양식을 구현할 것입니다. "총알을 물린다"는 내가 여기서해야 할 일이다. –

+1

@ JerryDodge 나는 '* I will going to *'이 세 글자 수축으로 파열되는 것을 볼 때마다 여전히 나를 놀라게한다는 것을 인정한다. 그것은 일종의 기록이어야합니다. –

+0

@J ... 그게 내가 영어에 대해 좋아하는 것입니다 : D –

4

거기에 기본 클래스를 삽입해야합니다. TMyBorderForm은 TForm을 상속받으며 경계 동작을합니다. 그런 다음 모든 양식을 TForm에서 직접 가져 오는 대신 TMyBorderForm에서 상속받습니다.

+4

나는 downvote하지 않았다 (단지이 질문을 보았습니다). 그러나 질문은 특별히 각 양식을 수정할 필요가없는 솔루션을 요구하기 때문에 가능합니다.이 대답은 100 %가 "필요하지 않음"부분을 실패합니다. 그러므로 이것은 어떤 방법 으로든 묻는 질문에 대한 대답이 아니므로 게시해서는 안됩니다. (이 솔루션을 적절한 방식으로 제안하는 기존 의견을 주석 대신 게시하여 참조하십시오.) –

+0

이것은 내가 더 많은 설명 때문에 다른 답변을 수락 한 것입니다. –

0

DFM을 텍스트로 저장한다고 가정 할 때 Chris의 답변에 변형이 있습니다.

  1. 양식이 모두 상속되는 양식을 정의하십시오.
  2. 모든 PAS 파일을 텍스트 편집기로로드하고 클래스 (TForm)를 클래스 (TMyBaseForm)로 바꿉니다.
  3. IIRC 또한 모든 DFM 파일을 편집해야합니다. 'object'가 'inherited '. 테스트 앱으로 먼저 시도해보십시오. 왜냐하면 저는 과거에했던 것을 기반으로 작성했기 때문에이 답변이 100 % 완료되었는지 확신 할 수 없기 때문입니다.
  4. 당신은 (온/오프) TMyBaseForm에 경계 기능을 추가

엄밀히이 '열려있는 모든 파일에서 바꾸기' '모든 형태의 통과',하지만 '선택한 파일 열기'를하고 당신을 필요로 말하기 실제로 큰 문제가 아닙니다 ;-)

DFM을 아직 텍스트로 저장하지 않은 경우 단점이 있습니다. 먼저 DFM을 변경해야합니다.

[자신의 '기본 서식에서 상속]은 대용량 프로젝트에서 좋은 경우가 많습니다. 예 : 개발자가 기본 속성을 변경하는 것을 잊어 버리면 기본 폼의 런타임 코드가이를 업데이트합니다.] - 원하는 기본 속성이없는 타사 구성 요소의 경우.

+0

DFMs? PAS 파일 형식을 의미합니까? DFM에는 해당 코드가 포함되어 있지 않습니다. –

+0

죄송합니다. DFM과 PAS가 일치해야합니다. 편집 됨. –

+0

아니요, DFM에는 'TForm'이 아닌 양식의 이미 변경된 클래스 이름이 포함되어 있습니다. –