질문에 답변을 달때 에로사항중에 한가지는
질문자가 정확히 무엇이 궁금한지 또는 질문을 떠나서 질문자에게 필요한 답변은 무엇인지
파악하는것입니다.
나름 답변을 달때 질문을 여러번 읽고 정확한 의도를 파악하여 답변을 달려고 노력 하지만
질문을 잘못이해 하여 엉뚱한 답변을 달때가 종종 있습니다.
이번의 경우도 그러한것 같네요
님께서는 "컴포넌트가 scrollBox안에 있는지 를 check 할수 있는 방법" 에 대해 물으셨습니다.
예제를 보니 ScrollBox1 안에 Panel3가 있고 Panel3위에 여기저기 Button이 몇개 올려져 있더군요
그래서 저는 님의 질문을 ScrollBox의 Child나 Child의 Child 에서 찾고자 하는 Button이 있는지 확인하는 방법을
물어보는것으로 이해 했습니다.
그런데 또다시 똑같은 말씀을 하시는것으로 볼때
님의 질문하신 의도는
Button이 ScrollBox의 보이는 부분(Client영역)안에 있냐는 질문인것 같네요
Button이 ScrollBox의 안보이는 부분에 있다면 ScrollBox의 ScrollBar Position을 수정해서
보이도록 하고 싶다는 얘기 같습니다
맞나요?
그렇다면 아래와같이 간단히...
bool __fastcall TForm1::IsInScrollBox(TButton *Btn)
{
TPoint pt1,pt2;
pt1=Btn->ClientToScreen(Point(0,0));
pt2=ScrollBox1->ClientToScreen(Point(0,0));
TRect rc=Rect(pt2.x,pt2.y,pt2.x+ScrollBox1->ClientWidth,pt2.y+ScrollBox1->ClientHeight);
return PtInRect(rc,pt1);
}
void __fastcall TForm1::Button8Click(TObject *Sender)
{
TButton *btn=(TButton *)Panel3->FindChildControl(Edit1->Text);
if(btn)
{
if(IsInScrollBox(btn))return;
TPoint pt=Point(btn->Left,btn->Top);
ScrollBox1->HorzScrollBar->Position=OrgPt.x+pt.x;//+edt->Width;
ScrollBox1->VertScrollBar->Position=OrgPt.y+pt.y;//+edt->Height;
}
}
IsInScrollBox 라는 메소드로 화면의 보이는 영역에 있는지 확인했는데 좀 부족한 함수입니다.
왜냐하면 Button의 전체영역을 체크하지 않고 ( Left , Top ) 좌표만 확인했으니까요..
조금 보완해서 사용하시면 될듯 합니다.
그럼..
linuxman 님이 쓰신 글 :
: 감사합니다..
: 제가 알고 싶었던것은... 찾는 컴포넌트가 scrollBox안에 있는지 를 check 할수 있는 방법이 있나해서요..
: scrollbox 안에 있다면... HorzScrollBar->Position,ScrollBox1->VertScrollBar를 움직일 필요없고...
:
: scrollbox밖에 있는 컴포넌트이면... 컴포넌트가 조금만이라도 보일수 있도록... 최소한으로 움직일수 있는
: 방법을 찾고 있습니다...
: 찾는 콤포넌트의 left,top으로 움직이니까,화면이 너무 이동해서..깜빡거리는 현상이 일어나서요?
:
: 거듭 감사드림니다.
: *)공부에 왕도는 없겠지만,,그래도 C++builder를 정석으로 공부할수 있는 추천의 방법이 있으면... 조언해 주시면 감사하겠습니다...책이 많은것도 아니고,월간지 등이 있는것도 아닌것 같고...
:
: 장성호 님이 쓰신 글 :
: : 음...
: :
: : [Panel위에 있는 컨트롤 찾기]
: : 먼저 Panel위에 있는 Control을 찾는 방법은?
: : FindChildControl을 이용하시면 됩니다.
: :
: : TForm에만 있는 함수가 아니라 모든 TWinControl에 있는 함수입니다.
: :
: :
: : //다음과 같이 찾습니다.
: : TButton *btn=(TButton *)Panel3->FindChildControl("Button1");
: :
: : //또는 아래과 같이 TEdit로 입력을 받아서..
: : TButton *btn=(TButton *)Panel3->FindChildControl(Edit1->Text);
: :
: :
: :
: :
: : [ ScrollBox의 ScrollBar를 Control이 있는 위치로 이동]
: : 님이 올린 샘플을 보니 ScrollBar위에 있는 Panel의 위치가 (0,0)이 아니더군요
: : 즉 이런경우에 ScrollBar의 HorzScrollBar->Range 나 ScrollBox1->VertScrollBar->Range 가
: : Panel의 크기와 일치하지 않게 됩니다.
: :
: : 1. 먼저 ScrollBar위에 있는 Panel의 위치를 (0,0)으로 폼 디자인타임에 설정하십시요
: : 그럼 ScrollBar의 Scroll Range가 Panel의 크기와 같게 됩니다.
: :
: : 2. 그런다음 FindChildControl 찾은 Button의 Left , Top을 ScrollBox의
: : HorzScrollBar->Position 과 VertScrollBar->Position으로 설정하시면 됩니다.
: :
: :
: : void __fastcall TForm1::Button6Click(TObject *Sender)
: : {
: : TButton *btn=(TButton *)Panel3->FindChildControl(Edit1->Text);
: : if(btn)
: : {
: : ScrollBox1->HorzScrollBar->Position=btn->Left;
: : ScrollBox1->VertScrollBar->Position=btn->Top;
: : }
: : }
: :
: : 그럼...
: :
: :
: : linuxman 님이 쓰신 글 :
: : : 안녕하세요..
: : : 스크롤박스 안에..아주 큰 패널을 만들었습니다.
: : : 그런후에 패널의 여기저기에 동적인 콤포넌트 들을 배치하였습니다...
: : : (여기 저기 있기때문에...)
: : :
: : : 스크롤 박스 안에 원하는 콤포넌트가 있는지 체크할수 있는 방법과
: : : 없다면... 스크롤박스를 최소한 움직여서 원하는 콤포넌트를 스크롤 박스의
: : : 귀퉁이에라도 보여주고 싶은데... 좋은방법이 있을까요?
: : :
: : :
: : : ScrollBox1->VertScrollBar->Position=Button1->Left;
: : : ScrollBox1->HorzScrollBar ->Position=Button1->Left;
: : :
: : : 수고하세요.