2012-11-28 2 views
0

크기가 600 × 400, 즉 폭 = 600 및 높이 = 400 인 델파이 폼이 있습니다. 치수가 동일한 크기 (150 * 300)의 패널을 3 개 보관했습니다. 서로 등거리에있다.패널의 앵커 속성이 원하는대로 작동하지 않습니다.

이제 폼을 크기를 조정할 때 (수동으로 또는 최대화 버튼을 사용하여 작게 또는 크게 만들 때) 패널에서 폼의 크기를 조정해야합니다.

여기에 앵커 속성이 사용됩니다. 그러나 원하는대로 작동하지 않습니다. 패널이 서로 중첩됩니다. 이 기능을 수행하기 위해 어떤 앵커 속성을 true 또는 false로 설정할지 혼란 스럽습니다. 이걸 좀 도와주세요.

+0

당신은 [앵커 문서]를 읽을 않았다 (http://docwiki.embarcadero.com/Libraries/XE3/en/Vcl.ExtCtrls.TPanel.Anchors)? 앵커가 원하는대로 작동하지 않을 수 있지만 문서화 된대로 작동합니다. – jachguate

+1

예, 읽었습니다. 앵커 속성이 패널에 대해 [akTop, akBottom, akLeft]로 설정되어 있습니다. 이렇게하면 왼쪽 상대 위치를 유지하면서 각 패널을 아래쪽 및 위쪽으로 늘립니다. 그러나 내가 어떻게 그들을 오른쪽으로 뻗어 야하나요? 아니면 이것을 코딩해야합니까? –

+0

당신은 akRight를 늘려야합니다. 그러나 앵커가하는 일은 폼의 측면에 대한 절대 거리를 고정하기 때문에 오버랩을 해결할 것이라고는 생각하지 않습니다. 왼쪽 패널의 오른쪽이 450에서 오른쪽으로 떨어져 있다면 오른쪽 패널의 왼쪽이 왼쪽에서 450에 머무를 것이라는 사실에 관계없이 그런 식으로 머무를 것입니다. –

답변

2

위치를 지정하고 수동으로 크기를 조정하십시오. 패널 소유자의 OnReSize-Me thod.

procedure TOwnerForm.OnResize(Sender : TObject); 
begin 
    panel1.width := Self.Width div 3; 
    panel2.width := Self.width - 2*panel1.Width; 
    panel3.width := Self.Width - panel1.Width - panel2.Width; 
    panel1.Left := 0; 
    panel2.Left := panel1.left + panel1.width; 
    panel3.left := panel2.left + panel2.width; 
    panel1.top := 0; 
    panel2.top := panel1.top; 
    panel3.top := panel1.top; 
end; 
+1

해결책 주셔서 감사합니다. 나는 그것을 코딩해야한다고 생각했다. 당신의 대답을 수락했습니다. –

+0

VCL에서 나는 폼 리사이즈 이벤트에서 크기와 위치를 설정하는 대신 TGridPanel을 사용하는 것을 선호합니다. – slotomo

+0

안녕하세요, 저는 TGridPanel을 가지고 있지 않습니다. 그래서 위의 핸드 코딩을 사용하는 것입니다. 큰 문제는 아니지만 현대 델파이에서는 솔루션을 추천합니다. – alzaimar

2

Ive는 다른 방식으로 (오른쪽 또는 잘못된) 공격하는 경향이 있습니다. 여기서 패널은 폼의 한면 또는 다른면에 "정렬"속성을 사용하여 "정렬"됩니다. 그런 다음 "클라이언트"에 정렬 된 마스터 패널을 선택하여 크기를 조정할 때 사용할 수있는 대부분의 공간을 차지합니다 (하나의 패널이 왼쪽, 다른 패널이 맨 위, 세 번째 패널이 클라이언트로 정렬됩니다.) 패널 내에서 패널을 가질 수 있으며 사용자가 필요에 따라 크기를 조정할 수 있도록 스플리터 구성 요소를 사용하십시오. 결과가 아니더라도 중복 문제가 발생하지 않을 것입니다.

아마도 XE2에 태그가 붙어 있기 때문에 FireMonkey 양식이라면 양식을 확장하는 것이 옵션 일 것입니다 (여기를 참조하십시오 : http://edn.embarcadero.com/article/42560)

관련 문제