2009-11-03 6 views
5

우리의 응용 프로그램은 모든 양식이 상속되어야하는 공통 기본 양식을 사용하는 데 사용되었습니다. Delphi의 VFI 구현과 관련된 여러 가지 불만 사항에 이르기까지 모든 사람들이 경찰의 필요성에 이르기까지 여러 가지 이유로이를 제거하고 싶습니다. 그것이 제공 한 기능의 대부분이 다른보다 안정적인 방법으로 수행 될 수 있다는 것이 밝혀졌습니다.양식을 표시하기 전에 위치를 지정하는 방법은 무엇입니까?

내가 확신하지 못하는 것은 자동으로 발신자 중심에 모든 양식을 배치하는 것입니다. 따라서 기본 양식에서 대화 상자 A를 열면 기본 양식의 가운데에 배치해야합니다. 대화 A에서 대화 B를 열면 대화 A의 중앙에 배치해야합니다.

우리는이 모든 작업을 기본 폼의 Position 속성을 poOwnerFormCenter로 설정하여 잘 처리했습니다. 하지만이 앱 전체에서 어떻게해야합니까?

나는 Screen.OnActiveFormChange를 사용하려고 생각했지만 폼이 포커스를받을 때마다 이런 현상이 발생한다고 생각합니다. 나는 또한 Application.OnModalBegin을 사용하려고 생각했으나 이것이 호출 된 지점에서 폼을 찾는 확실한 방법이 아닌 것처럼 보인다.

아무도 시도한 적이 있습니까?

답변

5

분명히 양식 상속은 정확하게 해결하기 위해 제공되고 있습니다. 해결하고자하는 문제는입니다. 어떤 해결책이든 어떤 식 으로든 양식 상속을 모방하려고 할 것입니다.

"= class (TForm)"코드를 전역으로 검색하고 기존 기본 양식 또는 필요한 단순 기능 만 갖춘 새롭고 단순화 된 기본 양식 클래스로 TForm 클래스를 대체하는 간단한 작업을 수행 할 수 있습니까?

원래 TForm 클래스 자체를 수정하여 원하는 위치 지정 동작을 적용하려고 할 수 있습니다. 분명히 제공된 클래스를 수정하는 것은 위험한 측면에서 조금 있습니다.

+1

+1 사람들이 그것을 사용하지 않았기 때문에 기지를 없애 버렸습니다. 그래서 나는 당신의 논리를 여기에서 잘못하고 싶습니다.하지만 당신 말이 맞습니다. 나는 여전히베이스가없는 하나 또는 두 가지 요구 사항을 처리 할 수있는 신뢰할만한 방법을 찾을 수 없으므로 다시 넣어야 할 것입니다. 나는 상속의 시각적 부분을 건너 뛰어야한다고 생각합니다. 왜냐하면 그것은 단지 잘 작동하지 않기 때문입니다. –

+0

확신 할 수는 없지만 델파이 IDE는 최소한 새로운 폼의 기반이되는 클래스의 폴리싱을 돕기 위해 구성 될 수 있습니다. –

0

응용 프로그램에 대해 잘 알지 못하면 내 위치 코드를 각 양식에 개별적으로 추가하는 것이 좋습니다. 기본 클래스를 사용하지 않는 이점은 사물을 약간 다르게하는 특정 양식을 쉽게 만들 수 있다는 것입니다. 양식의 모든 논리를 한 곳에서 함께 유지합니다.

+0

여기의 문제는 규모입니다. 우리는 몇백 개의 패키지를 가지고 있으며, 대부분 몇 가지 형태를 포함하고 있습니다.기본 클래스는 모든 양식이 일관된 방식으로 작동하는지 확인하려는 시도 였지만 몇 년이 지나고 사람들이 와서 갔을 때 그 기반은 일관되게 사용되지 않았습니다. 나는이 일관성을 시행하려고 시도하고있다. –

4

공통 기본 양식을 사용하지 않을 경우 각 양식에 비 시각적 구성 요소를 배치 할 것을 제안합니다. 이 구성 요소는 원하는 동작을 기본 폼에 주입 할 수 있습니다. 다른 폼에 다양한 동작을 사용하려면 구성 요소에 어떤 형식의 역할을 정의 할 것인지를 정의하는 역할 속성을 부여한 다음 해당 역할을 기반으로 다른 특성을 주입 할 수 있습니다.

아직 비 시각적 양식 상속을 사용할 수도 있습니다. 이는 모든 양식에 공통된 기본 클래스를 만드는 기본 방법입니다. 또한 폼에 속성을 추가하는 장점이 있으며, 이러한 속성을 기반으로 폼의 역할이나 동작을 변경할 수 있습니다.

0

일반적으로 SetBounds() 프로 시저를 사용하여이 작업에 FormShow 이벤트를 사용합니다. 다른 비 형식 컨트롤을 사용하면 CMShowing 메시지를 재정 의하여 동일한 작업을 수행 할 수 있습니다.

+0

프로젝트의 규모에 대한 Kragen의 대답에 대한 내 의견을 참조하십시오. 공통 기본 클래스의 사용을 효과적으로 규명 할 수 없다면 각 양식을 변경해야하는 모든 것이 물 속에서 죽습니다. 소규모 프로젝트에서는 당연한 것입니다. –

0

나는 OnModalBegin에 대한 아이디어를 얻었고 함께 실행했습니다. 다음은 "해킹"이지만 작동하는 것 같습니다. 테스트하려면 폼 주위를 드래그하고 버튼을 클릭하십시오.

procedure TMainForm.Button1Click(Sender: TObject); 
var 
    mForm: TForm; 
begin 
    mForm := TForm.create(self); 
    mform.width := 300; 
    mform.height := 300; 
    mForm.ShowModal; 
    mForm.Free; 
end; 

procedure TMainForm.FormCreate(Sender: TObject); 
begin 
    application.OnModalBegin := modalbegin; 
end; 

procedure TMainForm.FormShow(Sender: TObject); 
begin 
    if Screen.FormCount>1 then begin 
    screen.forms[Screen.FormCount-1].left := round((screen.forms[Screen.FormCount-2].left + screen.forms[Screen.FormCount-2].width/2) - screen.forms[Screen.FormCount-1].width/2); 
    screen.forms[Screen.FormCount-1].top := round((screen.forms[Screen.FormCount-2].top + screen.forms[Screen.FormCount-2].height/2) - screen.forms[Screen.FormCount-1].height/2); 
    application.processmessages; 
    screen.forms[Screen.FormCount-1].Caption := inttostr(screen.forms[Screen.FormCount-1].top)+','+inttostr(screen.forms[Screen.FormCount-1].left); 
    end; 
end; 

procedure TMainForm.ModalBegin(Sender: TObject); 
begin 
    if Screen.FormCount>=0 then 
    screen.forms[Screen.FormCount-1].OnShow := FormShow; 
end; 
관련 문제