Jump to content
과거의 기술자료(읽기 전용): https://tech.devgear.co.kr ×
과거의 기술자료(읽기 전용): https://tech.devgear.co.kr

[DocWiki 번역] Relative Panel 사용하기


Recommended Posts

Docwiki에 있는 "Using the Relative Panel"를 번역한 글 (번역일: 2022년 1월 31일)


위로 가기: VCL

TRelativePanel은 컨테이너 컨트롤이다. 오브젝트를 RelativePanel 안에 넣으면 그 오브젝트의 위치를 지정할 때 같은 RelativePanel 안에 있는 다른 오브젝트를 기준으로 하거나 부모인 RelativePanel를 기준으로 상대적인 위치를 지정할 수 있다. TRelativePanel는 제약이 없기 때문에 자칫 상충되는 정렬을 지정하기 쉽다. 따라서 아래와 같은 몇가지 지침을 따라야 한다.

목차


지정한 정렬 규칙이 반영되는 우선 순위

가장 중요한 부분이다! RelativePanel을 사용할 때 명심해야 한다. 
RelativePanel의 자식들을 배치하는 절차의 우선 순위는 아래 순서와 같다. 

  1. Align(상하좌우)WithPanel : 컨트롤을 부모인 RelativePanel를 기준으로 정렬. 예, AlignLeftWithPanel
    • AlignCenterWithPanel (정중앙)이 가장 우선하므로 다른 정렬은 무시된다.
    • Left (왼쪽 정렬)이 Right(오른쪽), Top(위), Bottom(아래) 보다 우선한다.
  2. Align(상하좌우)With : 상하좌우 정렬을 RelativePanel 안에 있는 다른 컨트롤 중 무엇을 기준으로 정렬할 것인지를 지정
    • AlignCenterWithPanel (정중앙)이 가장 우선하므로 다른 정렬은 무시된다.
    • Left (왼쪽 정렬)이 Right(오른쪽), Top(위), Bottom(아래) 보다 우선한다.
  3. 나란히 정렬 (LeftOfRightOfAboveBelow) : 그 컨트롤의 상하좌우의 정렬 기준이 될 다른 컨트롤을 각각 지정

위 2,3번 단계에서 자식 컨트롤들이 배치되는 순서는 자식 배열의 순번(index)를 따른다. 더 우선하고 싶은 컨트롤이 있다면 그 컨트롤의 순번(index) 지정을 더 높게한다.

 

특별히 고려할 점

보이지 않는 곳으로 정렬 (컨트롤이 사라짐)

자식 컨트롤이 RelativePanel 바깥으로 밀려나게 정렬하지 않도록 확인하는 기능이 없다. RelativePanel 바깥으로 벗어난 부분은 보이지 않는다. 의도적으로 이렇게 구현되었으며, 상황에 따라 유용하기도 하다.

 

의존 순환(Circular Dependency)

RelativePanel 안에 있는 자식 요소들 간에는 방향 그래프 (directed graph)가 형성된다. 의존 순환은 방향 그래프에 순환이 있으면 발생한다. 즉 두 요소가 (중간 매개 요소 등) 서로 의존하는 것이다. 

의존 순환이 되도록 설정하면, TRelativePanel 컴포넌트는 의존 순환을 탐지하고 예외(exception)을 던진다. 만약 의존 순환이 개발 환경 에서(design-time)에 발생하면 폼 디자이너가 에러 메시지를 표시한다. EnableAlign 또는 Realign 멤버를 호출하는 코드도 이 예외를 시작시킬 수 있다. 

 

상충 관계(Conflicting Relationships)

만약 컨트롤의 동일한 가장자리를 지정하는 정렬을 여러개 설정하면 충볼이 발생할 수 있다. 어느 정렬 규칙이 다른 규칙보다 우선하는 지는 지정한 정렬 규칙이 반영되는 우선 순위를 참고.

 

양쪽 가장자리 정렬(Opposite Edge Alignments) 과 자동-크기(Auto-sizing)

만약 컨트롤의 양쪽 가장자리 (왼쪽과 오른쪽 또는 위와 아래)를 동일한 목표 (RelativePanel이거나 또는 그 안에 있는 형제 컨트롤)에 맞추어 놓으면, 너비 또는 높이가 목표 컨트롤에 맞추어진다. 예를 들어, 버튼 컨트롤의 AlignLeftWithPanelAlignRightWithPanel을 모두 True로 지정하면 이 버튼의 너비는 RelativePanel의 너비에 맞춰지게 된다.

이와 같은 동작으로 인해 예상하지 못한 상황이 발생될 수 있다. 예를 들어, 에디트 컨트롤에서 AlignLeftWithPanelAlignRightWithPanel을 True로 설정하고 이 에디트 컨트롤을 어느 버튼의 LeftOf로 지정하면, 이 에디트 컨트롤은 자신의 너비가 RelativePanel의 너비에 맞추지만 버튼의 왼쪽이라는 배치 규칙 때문에 RelativePanel의 "바깥으로 벗어나게" 된다.


관련 도움말 (See Also)

이 댓글 링크
다른 사이트에 공유하기

이 토의에 참여하세요

지금 바로 의견을 남길 수 있습니다. 그리고 나서 가입해도 됩니다. 이미 회원이라면, 지금 로그인하고 본인 계정으로 의견을 남기세요.

Guest
이 토픽(기고/질문)에 답하기

×   서식있는 텍스트로 붙여넣기.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   이전에 작성한 콘텐츠가 복원되었습니다..   편집창 비우기

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...

중요한 정보

이용약관 개인정보보호정책 이용규칙 이 사이트가 더 잘 작동하기 위해 방문자의 컴퓨터에 쿠키가 배치됩니다. 쿠키 설정 변경에서 원하는 설정을 할 수 있습니다. 변경하지 않으면 쿠키를 허용하는 것으로 이해합니다.