2011-04-27 9 views
6

필자는 사용자가 선택한 옵션에 따라 여러 가지 TPanel을 표시하거나 숨길 수 있습니다. 문제는 디자인 타임에 끊임없이 편집해야한다는 것입니다. 다른 사람들이이 상황을 처리하는 더 쉽고/좋은 방법이 있습니까?디자인 타임에 여러 TPanel을 어떻게 처리합니까?

답변

10

경우 한 번에, 당신에게 물건을 정리할 때 TPageControl을 사용하려고 할 수 있습니다. 탭을 클릭하면 디자인 타임에 작업 할 탭을 선택하고 런타임에 탭을 숨기거나 항상 탭을 숨기고 the ActivePage property을 설정하여 페이지를 선택할 수 있습니다.

+1

+1 초. 그것은 컨트롤을 구성하는 훨씬 좋은 방법입니다. 탭 머리말이 필요 없다면 자신의 종파를 만들거나 이미 개발 한 일부를 사용하여 런타임에 Tabheight = 0으로 설정할 수 있습니다. – Simon

+0

이 방법을 사용하면 잘 작동합니다. –

+0

올바르게 이해하면 설계 시간보다 런타임에 컨테이너에 더 많은 공간이있게된다는 단점이 있습니다. 그래서 고정 된 크기의 레이아웃을 가지고 있다면 잘 작동하지 않을 것입니다. 아니면 막대기의 잘못된 끝을 잡았나요? –

3

패널이 겹쳐있는 경우 마우스 오른쪽 버튼으로 클릭하고 컨텍스트 메뉴에서 Control->Bring to Front 또는 Control->Send to Back을 선택하여 순서를 바꿀 수 있습니다.

4

Structure Pane을 사용하여 원하는 것을 찾은 다음 앞으로 가져 오십시오.

Structure pane http://edn.embarcadero.com/article/images/33289/8.png

(그러나 위의 엠 바카 데로의 모범을 따르지 않는, 당신의 컨트롤이 떨어져 말할 쉽게 귀하의 컨트롤에 의미있는 이름을 제공합니다.) 단 하나의 패널이 표시

+1

+1; 대부분 완전히 겹쳐진 컨트롤을 사용하여이 방법을 좋아합니다. 항목을 선택하고 마우스 오른쪽 버튼을 클릭 한 다음 O + F 키를 눌러 컨트롤을 앞으로 가져옵니다. –

1

또한 TPageControl을 사용했으며 탭을 디자인 타임에 표시했습니다. 이것은 나에게 내가 원하는 탭을 클릭하는 것을 통해 디자인 사용성을 주었다. 그런 다음 런타임에 페이지 탭을 숨기고 페이지를 볼 수있는 전환 방식으로 코드를 사용하여 페이지 컨트롤의 활성 페이지를 전환합니다. 그러나 이것은 많은 무시 무시하게 거대하고 복잡한 형태로 이어지고 많은 문제의 원인이되었습니다.

귀하의 경우, 리팩토링을 각 폼 또는 프레임으로 리팩토 할 것을 권해드립니다. 필자가 선호하는 것은 프레임이 아닌 Forms를 사용하는 것이고, 그 이유는 잘 알려져 있고 Delphi 세계에서 잘 설명되어 있습니다.

가장 잘 구조화 된 응용 프로그램에서는 TFrame이 아닌 TForm을 사용하여 구현되는 각 "pane"이 서로 다른 단위로 분리되어 있기 때문에 디자인 타임 제어 문제가 해결되고보다 나은 결과를 얻을 수 있습니다 구조화 된 전체 솔루션.

구조 창 (다른 사람이 지적한 것)은 당신에게 큰 도움이된다고 생각 합니다만, 일반 디자이너의 시각적 도구가 사용하기가 점점 어려워지는 복잡한 형태로 작업하기를 원할 때도 그렇습니다. 양식 디자이너를 사용하여 "수익 감소"라는이 요점에 도달 할 때 양식을 깨뜨리는 것을 고려하는 것이 좋습니다. 앞으로 가져 오기>

(구조보기를 여는 유사하다)

2

편집을 클릭합니다 나는 프레임을 선택하거나 패널은 메인 메뉴에서 다음 개체 관리자 콤보를 사용하여 이를 위해 프레임을 사용합니다. 보통 런타임에 생성하고 필요에 따라 폼에 추가합니다. 또한 ed_NameForPanel1, ed_NameForPanel3 등이 아닌 다른 프레임에서 같은 구성 요소 이름 (예 : ed_Name 또는 l_Welcome)을 사용할 수 있기 때문에 코드를 훨씬 쉽게 읽을 수 있습니다.

1

그것은 훨씬 쉽게됩니다 -

3

주의 사항 런타임에 Panel1.Visible : = false를하면 레이아웃이 엉망입니다.
솔루션 내가 찾은 작품을하는 것입니다 :

//Design time 
//----------- 
Panel1.BevelOuter:= bvNone; //Make the panel look flat. 

//Run time when hiding the panel 
//------------------------------ 
procedure HidePanel(APanel: TPanel); 
var 
    H,W: integer; 
begin 
    case APanel.Align of 
    alTop, alBottom: begin 
     APanel.Tag:= Max(APanel.Tag, APanel.Height); 
     APanel.Height:= 1; 
    end; {alTop, alBottom:} 
    alLeft, alRight: begin 
     APanel.Tag:= Max(APanel.Tag, APanel.Width); 
     Panel1.Width:= 1; 
    end; {alLeft, alRight:} 
    alNone: begin 
     H:= Max(APanel.Tag and $FFFF, APanel.Height); 
     W:= Max((APanel.Tag shl 16) and $FFFF0000, APanel.Width shl 16); 
     APanel.Tag:= (H or W); 
     APanel.Height:= 1; 
     APanel.Width:= 1; 
    end; {alNone} 
    //alClient: do nothing 
    end; 
end; 

//Run time when restoring the panel 
//--------------------------------- 
procedure UnhidePanel(APanel: TPanel); 
var 
    H,W: integer; 
begin 
    case APanel.Align of 
    alTop, alBottom: begin 
     APanel.Height:= APanel.Tag; 
     APanel.Tag:= 0; 
    end; {alTop, alBottom:} 
    alLeft, alRight: begin 
     APanel.Width:= APanel.Tag; 
     APanel.Tag:= 0; 
    end; {alLeft, alRight:} 
    alNone: begin 
     H:= APanel.Tag and $FFFF; 
     W:= APanel.Tag shr 16; 
     APanel.Height:= H; 
     APanel.Width:= W; 
     APanel.Tag:= 0; 
    end; {alNone} 
    //alClient: do nothing 
    end; {case} 
end; 

은 단순히 패널은 엉망이 디자인 타임
에 건설 한주의 정렬 (. ESP 스플리터를 사용하여)
을 할 수 숨어.
이 코드는 이러한 현상을 방지합니다.
패널에 Bevels 세트가없고 panelcolor가 위에있는 컨트롤의 색상과 같을 때만 실제로 시각적으로 작동합니다.

관련 문제