2011-04-20 1 views
4

하나 이상의 '하위'양식을 호스팅하는 양식을 만들었습니다. 내 편집 모드에서 각 자식 폼은 테두리와 캡션 바를 표시하여 이동하고 크기를 조정할 수 있습니다 (이전 MDI 응용 프로그램과 비슷 함). 편집 모드에서 테두리가 사라지고 하위 폼이 고정됩니다. 내 간단한 데모를 위해, 나는 이렇게 자식 폼을 만드는거야 : Layout이동 및 크기 조정이 가능하고 활성화 된 여러 개의 '자식'양식을 포함하는 delphi 양식을 만드는 방법

나는 자식 폼에서 편집 컨트롤이 활성화 결코 알 수 :

procedure TForm1.Button1Click(Sender: TObject); 
var 
    Frm : TForm; 
begin 
    Frm := TForm3.Create(Self); 
    Frm.Parent := Self; 
    Frm.Visible := True; 

결과이 같은 레이아웃입니다. 나는 '클릭 한'폼을 클릭하면 액티브 한 앱이 움직일 때처럼 액티브 캡션 바 색상을 보여주고 싶습니다. 나는 그들이 사용하지 않기 때문에 ChildForm.SetFocus와 같은 일을 시도하는 것은 아무 것도하지 않기 때문에 ChildForm의 '시체'동작을 가정합니다.

편집 컨트롤을 활성화하고 양식 중 하나를 '선택됨'으로 표시하려면 무엇을해야합니까?

좀 더 강력한 TForm.SetFocus보다

+1

왜 결국 MDI를 사용하지 않으려 고합니다. 결국 MDI를 원할 때 말입니다. 나는 MDI가 얼마나 싫어 보이고, 어떻게 동작하는지, 등등을 싫어한다. 유용성과 UI 상호 작용 디자인의 관점에서 끔찍한 개념이다. 하지만 실제로 mdi의 끔찍한 모습을 원하면 mdi를 사용하십시오! :-) –

+1

@ warren 때때로 mdi가 정확히 당신이 필요로하고 아름답게 작동합니다. –

+0

@WarrenP MDI는 끔찍한가요? 글쎄, 그게 그들이하는 말 ...하지만 내 비즈 애플 리케이션의 대부분을 위해, 나는 그들을 필요합니다. 불행히도 제 소프트웨어는 Windows와 Ubuntu 모두를 위해 설계되었으므로 사용할 수 없습니다. 그래서 나는 그들없이해야합니다. 또 다른 일 ... 나는 나사로를 사용하고 있습니다. (그들은 똑같다고 말합니다.하지만 ... 알다시피) – itsols

답변

4

VCL의 부모 역할 메커니즘으로 인해 문제가 발생합니다. 정확한 이유를 모르겠다. 다소 복잡한 메커니즘이므로 추측 할 시간이 필요하다.

당신은 API에 의해 양육하여 원하는 동작을 얻을 수 있습니다

: 당신은 고정, 부모에 의존 특성처럼, 확인을위한 VCL과 약간의 동기화를 잃게됩니다

procedure TForm1.Button1Click(Sender: TObject); 
var 
    Frm : TForm; 
begin 
    Frm := TForm3.Create(Self); 
// Frm.Parent := Self; 
    windows.SetParent(Frm.Handle, Handle); 
    Frm.Visible := True; 


, 소유권 등 그것은 수도도


하나 개 이상의 활성 형태의 느낌을 가지고 ... 누락 된 WS_CHILD 플래그처럼 ... 그것을 시도하고 그것이 당신의 요구에 작동하는지, API에 대한 문제가 될, 당신은 그들 중 하나를 말할 수 그에 따라 칠하기 :

SendMessage(Frm.Handle, WM_NCACTIVATE, WPARAM(True), 0); 

어떤 양식이이 메시지를 받으면 클라이언트가 아닌 영역을 재 활성화하여 해당 (추정 됨) 활성화 상태를 반영합니다. wParam에 'false'를 전달하면 그 반대가 발생합니다.

+0

그것은 나를 올바른 방향으로 인도했습니다. 감사. –

+0

@SertacAkyuz Windows API에 종속되지 않는 해결 방법이 있습니까? 나는 Lazarus와 함께 우분투/윈도우 앱 개발을 목표로 삼고 있으며 같은 문제가있다. 그래서 우리는 부모님이 잘못된 길을 설정하고있을 것입니다. – itsols

+0

순수하게 실험적이었습니다 ... 제 경우에는 아이의 형태가 단지 보여주고 부모 컨테이너 밖으로 움직이지 않기를 바랬습니다. 너희들도 똑같이해야한다면, 나는 하나의 탭으로 PAGECONTROL을 사용하여 이것을 달성했다. 자식 폼의 테두리를 끄면 작동합니다. 하지만 분명히 아이 양식을 옮길 수는 없습니다. 당분간, 이것은 내 목적에 봉사한다 :) – itsols

3

전화 Windows.SetFocus(Form.Handle) (정말 너무 가능하면 하나 이상의 양식을 '선택'하고 싶습니다). 특히 Windows.SetFocus은 포커스가있는 상태에서 비활성 상태 인 양식을 활성화하여 주된 문제점이라고 생각합니다.

두 개 이상의 양식을 사용하는 것이 잘못되었습니다.

마지막으로 MDI 사용을 고려 했습니까? 여전히 작동합니다.

+0

네, MDI를 고려해 봤지만, 합병증과 향후에 사용되지 않을 수있는 가능성을 피하려고합니다. –

+1

나는 더 이상 사용하지 않을 것 같아요. 최신 응용 프로그램에 대한 최신 문서 작업이 더욱 고무적입니다. MDI는 Delphi에서 전혀 복잡하지 않습니다. 모든 작업이 완료됩니다. –

0

MDI가 가장 쉬운 방법이라고 생각합니다. 주 양식 SetStyle = fsMDIForm, 하위 FormStyle = fsMDIChild.

그렇습니다. 이렇게하면 부모가 작동하도록 설정하지 않아도됩니다.

+0

좋은 의견을 가지고 있지만 다른 질문에는 대답하지 않습니다. –

+1

일반적으로 동의 하겠지만 전통적인 MDI가 처리 할 수 ​​없다고 생각하는 핵심 요구 사항이있는 것 같습니다. "Out of my 편집 모드에서는 테두리가 사라지고 자식 폼이 고정되어 있습니다. " –

관련 문제