void __fastcall TForm1::ResetPanelPosition()
{
TPanel *pan[4]={Panel1,Panel2,Panel3,Panel4};
for(int i=1;i<4;i++)
{
pan[i]->Top=pan[i-1]->Top+hei;
}
}
panel을 height를 수정하신후에..
그냥 위함수를 호출해주세요
위 함수에서 Panel1~Panel4는 갯수만큼 .. 변경하시구요
그러면 알아서 위치 조정될것입니다.
그런데 보아하시 TreeView로 저렇게 잘 안만들어져서 ScrollBox와 Panel을 이용하시나 보네요..
...
unitas 님이 쓰신 글 :
: 그림 첨부 했습니다.
:
: pic1은 화면 초기 그림입니다.
: pic2는 장비1 ~ 장비3을 Expand 한 그림입니다. (그림이 짤렸습니다. - scroll을 아래로 이동하면 볼수 있습니다.)
: pic3은 장비3을 Collapse하고 다음에 장비2를 Collapse했을때 그림입니다.
:
: 그림 보시면 아시겠지만 장비1과 장비2 panel이 붙어야 되는데 떨어져 있습니다.
: 장비2와 장비3 panel이 붙어있는것 처럼요.
: (장비3을 Collapse하고 scroll을 위로 올린다음에 장비2를 Collapse 하면 제대로 붙습니다.
: ScrollBox1->VertScrollBar->Position 를 이용해서 한것인데 scroll position에 따라 top 좌표가
: 바뀌어서 맞추기가 쉽지 않습니다.)
:
: ( pic4는 장비3을 Collapse 했을때 scroll position 위치 입니다. 이것을 위로 옮긴다음에
: 장비2를 Collapse 하면 장비1과 장비2의 panel 이 붙습니다.)
:
: 결론적으로 pic3 그림에서 에서 scroll position에 관계없이 장비1과 장비2의 panel이 붙어야 합니다.
: 그래서 절대좌표로 하면 scroll position에 관계없이 각 panel의 top 좌표를 잡기가 쉬어질것 같아서
: 질문 드렸습니다.
:
:
:
: 장성호 님이 쓰신 글 :
: : 죄송합니다.
: :
: : 제가 머리가 나빠서 그런지..
: : 몇번을 읽어봐도 정확히 님께서 무엇을 원하는지 잘 모르겠습니다.
: :
: :
: : ScrollBox위에 Panel을 여러개 올리시려는것 같은데..
: :
: : Panel을 여러개 올려서
: : 초기상태의 그림과 , ScrollBar를 움직였을때의 그림
: : 그리고 Panel의 size를 조정했을때의 원하는 그림을 올려주시면 이해가 빠를것 같네요
: :
: : -----------------------------------------------------------------------
: : 만약 Panel을 상하로 붙이고
: : Panel의 Height등 size가 변한다면..
: : 다음과 같이 Panel의 위치를 설정하면 될것 같은데요...
: :
: :
: : void __fastcall TForm1::SetPanelHeight(int hei)
: : {
: : if(hei<1)return;
: : TPanel *pan[4]={Panel1,Panel2,Panel3,Panel4};
: : pan[0]->Height=hei;
: : for(int i=1;i<4;i++)
: : {
: : pan[i]->Height=hei;
: : pan[i]->Top=pan[i-1]->Top+hei;
: : }
: : }
: : //---------------------------------------------------------------------------
: :
: : void __fastcall TForm1::Button1Click(TObject *Sender)
: : {
: : SetPanelHeight(Panel1->Height+10);
: : }
: : //---------------------------------------------------------------------------
: :
: : void __fastcall TForm1::Button2Click(TObject *Sender)
: : {
: : SetPanelHeight(Panel1->Height-10);
: : }
: :
: :
: : 절대좌표가 뭘 얘기하는것인지 모르겠지만..
: : 맨 윗쪽에 Panel을 기준으로 나머지 위치를 조정하면 될것 같네요
: :
: : 그럼..
: :
: :
: : unitas 님이 쓰신 글 :
: : : Panel이 10개 이상(상하로 붙여서 panel #1 --- panel #n) 붙입니다.
: : : 또 실행중 panel의 size(height)가 바뀝니다. 바뀔때마다 다른 panel도 Top의 좌표가 바뀌기 때문데
: : : 어떠한 규칙으로 조절을 할려고 합니다. (Panel들이 상하로 붙어 있는것처럼 표시합니다.)
: : : ( panel #1 바로밑이 panel #2의 Top이 되고 마찬가지로 panel #9 바로밑에 panel #10의 Top이 됩니다.
: : : 그러면 panel들이 붙어 있는거처럼 보이죠. panel들이 size가 바뀔때마다 panel들의 top를 계산해서
: : : panel들을 재배치 합니다. 그러기 때문에 top의 절대 좌표가 필요합니다.)
: : :
: : : Panel의 좌표값을 고정한다는 말씀은 panel #1의 top이 20 이면 아무리 scroll이 움직여도 -176등 top의
: : : 좌표가 바뀌지 않게 한다는 말씀입니다.
: : :
: : : 예를 들어서 panel #1의 Top이 50 면 scroll을 아래로 움지이면 panel #1 이 위로 움지이지 않습니까?
: : : 그럼 ScrollBox의 현재 보이는 부분위가 0 으로 되어서 panel #1의 Top이 -(마이너스)값으로 변하는데
: : : panel #1이 위로 이동하면서 안보일수도 있어도 panel #1 의 Top은 50 를 가지게 하는것입니다.
: : :
: : : 저도 ScrollBox1->VertScrollBar->Position 이용해서 할려고 했는데 역시 Scroll이 움직일때마다
: : : Top의 좌표들이 틀어져서 맞추기가 어렵습니다.
: : :
: : : ScrollBar는 단순히 위아래 움직이면 panel를 보이게만 할뿐 panel의 좌표에 대해서 관여를 하지 않게
: : : 하고 싶습니다.
: : :
: : : 제대로 질문의 설명을 했는지 모르겠습니다.
: : : 제가 원하는 내용들 해결 방법이 힘든가요?
: : :
: : :
: : :
: : : 장성호 님이 쓰신 글 :
: : : : 제가 질문을 잘못 이해 한것 같습니다.
: : : :
: : : : 그런데..
: : : :
: : : : ScrollBar를 움직였을때 Panel을 같이 움직이면서..
: : : : Panel의 좌표값을 고정한다는게 말에 모순이 있지 않나요?
: : : :
: : : : 단지 ScrollBox의 ScrollBar를 움직이지 않았을때의 위치값을 알고자 한다면..
: : : :
: : : :
: : : : int iPanelTop=Panel1->Top+ScrollBox1->VertScrollBar->Position;
: : : : int iPanelLeft=Panel1->Left+ScrollBox1->HorzScrollBar->Position;
: : : :
: : : :
: : : : 하지만 저 값을 가지고 Panel1의 위치를 이동시키면 안되겠죠...
: : : :
: : : : 그럼..
: : : :
: : : :
: : : : unitas 님이 쓰신 글 :
: : : : : 장성호님 감사합니다.
: : : : : 그런데 제가 정확하게 이해를 못한거 같은데요.
: : : : : 다시 설명해 주시면 안될까요?
: : : : :
: : : : : ScrollBox1->Parent = Panel4;
: : : : : Panel2->Parent = Panel4;
: : : : : 위에처럼 Parent를 같게 명시했습니다.
: : : : :
: : : : : 이렇게 하니까 첨부한 그림처럼 Panel이 ScrollBox에 영향을 받지 않습니다.
: : : : : 제가 원한것은 ScrollBox에서 Scroll를 움직이면 Panel도 같이 움직이면서 고유한 Panel의 좌표(Top)를
: : : : : 갖고 있게 하는것입니다.
: : : : :
: : : : : ScrollBox을 맨 뒷쪽으로 보내라고 하셨는데 Panel을 ScrollBox위에 놓으면 되는건가요?
: : : : : 그렇게도 해봤는데 그래도 실행하면 그림처럼 scrollbox안에 있는것처럼 보이지 않고
: : : : : 단순히 ScrollBox위에 있는것처럼 됩니다.
: : : : :
: : : : : 다시 부탁드립니다.
: : : : :
: : : : :
: : : : :
: : : : : 장성호 님이 쓰신 글 :
: : : : : : Panel을 ScrollBox 안에 두지마시고
: : : : : :
: : : : : : Panel을 ScrollBox와 같은 Level에
: : : : : : 즉 ScrollBox->Parent와 Panel->Parent를 같도록 해 두시구요
: : : : : :
: : : : : : ScrollBox을 맨 뒷쪽으로 보내세요
: : : : : :
: : : : : : 그러면 ScrollBox의 scrollbar를 움직여도 Panel의 좌표를 변화하지 않습니다.
: : : : : :
: : : : : : ...
: : : : : :
: : : : : : ScrollBox는 원래 그런 용도로 만들어진것이므로..
: : : : : : scrollbar를 움직여도 원래 위치 그대로 두려면..
: : : : : :
: : : : : : scrollbox안에 있는것처럼 보이지만 실제로는 scrollbox안에 있지 않도록 하면 되지 않겠어요?
: : : : : :
: : : : : :
: : : : : : ...
: : : : : :
: : : : : : unitas 님이 쓰신 글 :
: : : : : : : ScrollBox에 여러 컴포넌트를 넣어서 범위를 벗어나면 scroll이 생기는데 scroll을 움직이면 기존의 컴포넌트의
: : : : : : : 좌표 (상하 이동시 Top좌표)가 변하지 않습니까.
: : : : : : : ScrollBox에서 scroll의 이동시 ScrollBox1->VertScrollBar->Position에 관계없이 절대 좌표를 갖을수 있나요?
: : : : : : : properties에는 그러한 옵션이 없는것 같고요.
: : : : : : : 제 질문이 잘 전달이 되었는지 모르겠네요. 샘플로 그림 첨부했습니다.
: : : : : : : [첨부한 그림에서 scroll이 아래 또는 어느 위치에 있더라도 절대좌표 (top = 20)를 보존할수 있나요? ]
: : : : : : :
: : : : : : : ScrollBox1->VertScrollBar->Position를 이용해서 할려고 했는데 실제로 여러 Panel들을 일일이 좌표설정을
: : : : : : : 할려니 힘드네요. scroll의 position이 조금만 움직여도 맞추기가 쉽지 않습니다.