|
pd 님이 쓰신 글 :
: 아루스 님이 쓰신 글 :
: : pd 님이 쓰신 글 :
: : : 폼으로 뭐좀 만들려고하는데 빌더는 첨써봐서 어려움이 생기네요..
: : : 이하에 질문이 많은데.. 어렵지않는 궁금증같습니다.
: : : 해결좀 해주세요.
: : :
: : : 1.
: : : 모든 RAD도구에서 접근방법은 두가지가있는것같습니다.
: : : 오브젝트 인스펙터로하는방법과
: : : 코딩으로하는방법이있는데
: : :
: : : PageControl1->Pages[0]->Caption= "캡션";
: : : 이것을 오브젝트 인스펙터에서 바로 쓸수있는방법은 없을까요?
: : PageControl1 에서 Pages[0] 이면 맨 처음 페이지를 선택하고 페이지 안쪽을 클릭 해서
: : TTabSheet 를 선택한 뒤, Caption 속성을 "캡션" 으로 고쳐줍니다.
: 이부분을 제가 햇갈릴수밖에없었습니다.
: 이유는 PageControl을 이용해놓고 그위에 StringGrid->Align=alClient; 이렇게 줘버렸습니다
: (오브젝트인스펙터에서 줘버렸음)
: 때문에 아무리 클릭을 해도 TTabSheet를 선택이안되니 저는 제방법이 틀린지알았습니다.
: 지금해보니까 StringGrid를 선택하고 ESC를 한번누르거나 오브젝트 트리뷰를 이용해서 접근하는방법도있었네요
: 어쨌던 지금은 이방법은 알려주신대로 해결되었습니다.
: 고맙습니다.
:
: :
: : : -----------------------------------
: : : 2.
: : : 스플리터를 페이지 컨트롤 위에 달았습니다.
: : : 그런데 스플리터를 사용하니까 텝을 닫아버리네요.
: : : 텝공간은 스플리터로부터 보호를 하고싶은데 어떻게 해야합니까?
: 설명이 부족한듯싶어 스샷을 찍어 올렸습니다.
:
: : : -----------------------------------
: : : 3.
: : : 도움말에서 이런예제를 보면
: : : __property Classes::TStrings* Cols[int Index] = {read=GetCols, write=SetCols};
: : : 제일뒤쪽의 {read=GetCols, write=SetCols}; 이부분은 무슨의미입니까?
: : 해당 프로퍼티를 통한 접근 방법을 제시합니다.
: : read 에는 읽어오는 방법을, write 에는 쓰는 방법입니다.
: : 여기에는 변수가 직접 올 수도 있고, 예제처럼(추측컨데) 함수가 올 수도 있습니다.
: : 이 함수는 read 의 경우 프로퍼티 속성과 같은 형을 반환하고 매개변수는 없어야 하고
: : write 의 경우는 인자값으로 매개변수와 같은 형을 받아야 합니다.
: :
: 좀어려운내용이네요.. 선뜻이해하기힘든부분같습니다.
: 첨접하는 개념이라서 그런지..
:
: : : -----------------------------------
: : : 4.
: : : TStringGrid 좌우정렬방법은 어떻게 해야하나요?
: : 이건 잘 모르겠네요.
: : 다음은 API 를 이용해 TEdit 중앙정렬 하는 코드입니다.
: : 참고해서 한번해보세요.
: : 될꺼같진 않지만;;
: : void __fastcall SetAlignCenter( TEdit *Edt )
: : {
: : // TEdit 컨트롤의 텍스트 중앙정렬
: : SetWindowLong(
: : Edt->Handle,
: : GWL_STYLE,
: : GetWindowLong( Edt->Handle, GWL_STYLE ) | ES_CENTER
: : );
: : Edt->Repaint();
: : }
: 6번과 좀햇갈릴수있지만..
: 위 스샷을 보면 제가 지워놓은 노란 컬럼부분이 중앙정렬로 오게하고싶습니다.
: 또 이하의 데이터들도 중앙정렬로하고싶은데..
: 이렇게 복잡한 코드말고 오브젝트인스펙터에서 처리되는건없을까요?
:
: :
: : : -----------------------------------
: : : 5.
: : : TStatusBar의 중앙정렬
: : : TStatusBar의 자동으로 상태줄맞춤
: : 각 패널에 Alignment 속성이 있습니다.
: : 상태줄 맞춤은 뭔지 모르겠네요.
:
: 이부분은 이런식으로 폼로딩시 삽입 처리해버렸습니다.
: // StatusBar1 설정.
: #define _SB_NUM_ 10 //여기서만 쓸것이다.
: AnsiString bartext[ _SB_NUM_ ]={"♡♡♡♡","","♤♤♤♤","","★★★★","","♣♣♣♣",""};
: for(int i=0;i<_SB_NUM_;i++)
: {
: StatusBar1->Panels->Insert(i);
: StatusBar1->Panels->Items[i]->Alignment=taCenter;
: StatusBar1->Panels->Items[i]->Width=80;
: StatusBar1->Panels->Items[i]->Text=bartext[i];
: }
: 실제 코드 중간에 define를 해버리고 그냥 이런식으로 처리해버렸는데
: 오류는 안나는데 퍼포먼스같은걸따졌을때나 잠재적오류 가능성등을 전혀 고려하지않았습니다.
: 한마디로 적절한표현인지모르겠네요
:
: :
: : : -----------------------------------
: : : 6.
: : : TStringGrid의 클릭시 정렬방법
: : 이건 아마 셀 값을 직접 접근해서 정렬 알고리즘을 적용해야하지 않을까요?
:
: 이것은 데이터들의 정렬방법입니다.
: 중요한건 정렬방법이아니라. 고정된 셀을 클릭할수있는가입니다.
: 이고정된 셀을 클릭하면 정렬알고리즘을 사용해야겠는데.. 아직까진 생각만하고있습니다.
:
: 스샷에서 노란색으로 된부분은 고정된 칼럼부분입니다.
: 이부분을 클릭시 정렬이되게해야하는데 클릭자체도 되지않습니다.
:
: :
: : : -----------------------------------
: : : 7.
: : : TPageControl을 사용해서 처음에 "제목없음"이라는 텝을 넣고싶습니다.
: : : 어떤방법으로 넣는지 알고싶습니다.
: : 디자인시에 하는 방법은 1번을 참고하시고
: : 런타임 생성은 빌더 도움말 예제를 참고하세요 아래에 적겠습니다.
: : 탭시트 생성후 PageControl 속성에 해당 PageControl 을 넣어 연결합니다.
: : 동적 생성된 탭시트는 명시적으로 삭제를 해주어야 하나봅니다 ~_~
: :
: : #include <Comctrls.hpp>
: : TPageControl* ppc;
: : TTabSheet* pts[MAXTABS];
: : const char * ppcTabTitles[] = { "ShortString", "Orders", "Items", "Parts" };
: : int iTabTitles = sizeof(ppcTabTitles)/sizeof(ppcTabTitles[0]);
: :
: : void __fastcall TForm1::FormCreate(TObject *Sender)
: :
: : {
: : ppc = new TPageControl(this);
: : ppc->Parent = this;
: : ppc->Align = alClient;
: : for (int i=0;i<iTabTitles;i++)
: : {
: : pts[i] = new TTabSheet(this);
: : pts[i]->PageControl = ppc;
: : pts[i]->Name = AnsiString("pts") + ppcTabTitles[i];
: : pts[i]->Caption = ppcTabTitles[i];
: : }
: : }
: :
: : void __fastcall TForm1::FormDestroy(TObject *Sender)
: :
: : {
: : for (int i=0;i<iTabTitles;i++)
: : delete pts[i];
: : delete ppc;
: : }
: 답변고맙습니다. 그런데 PageControl이아니라 TabControl을 말씀드리려고했었습니다.
: 제가아는바에의하면 PageControl은 텝마다 화면을 달리 구성할수있고
: TabControl은 텝마다 동일한 화면이지만 그데이터만 달리하는걸로알고있습니다.
: 때문에 후자의 퍼포먼스가 전자보다 훨씬 낫다는 생각도하고있습니다.
:
: 잘못된부분이있는지와 관련예를 부탁드립니다.
:
: 스샷에서 상단의 스트링그리드부분을 하단처럼 해주려합니다.
: 하지만 하단은 PageControl로사용되고 첫번째패널은 다른컨트롤을 넣을것이고
: 두번째를 저와같이 디자인하였습니다.
: 상단의 TabControl을 어떻게 처리하는게 좋을지 궁금합니다.
컨트롤안의 디자인이 동일하고 페이지 변환에 따른 처리가 간단하다면 TabControl 이 훨 낫겠죠. 아니면 그 반대일테고
제가 지금 만들고있는 관리 프로그램은 페이지가 절대 동일할 수 없어 PageControl 도배입니다 ㅜㅜ
그리고 스샷의 문제는 해결방법이 두가지네요
저런 현상은
Splitter 의 Align = alBottom 이고
위의 컨트롤은 Align = alClient
아래 컨트롤은 Align = alBottom 상태에서 발견이 되었는데요
위의 스트링 그리드 위에 다른 컨트롤이 없으므로
Aplitter 의 Align = alTop
위의 스트링 그리드는 Align = alTop
아래는 Align = al Client 가 그 첫번째 방법입니다 쿨럭...
어쨋거나 Splitter 가 붙어있는 쪽만 MinSize 가 보장이 되네요.
두번째 방법은 컨트롤1, 스플리터, 컨트롤2 를 독립 시키는 겁니다.
이 세가지를 잘라 내기 한 뒤 비어버린 위치에 패널을 올리고 Align = alClient 로 합니다.
그리고 그 패널에 잘라낸 컨트롤을 붙여넣습니다.
그리고 실행을 해봅니다.
밑에 붙어버리지만 다시 돌아오죠...
라고 쓰고는 스플리터의 이벤트를 보고 번뜩 떠올랐습니다.
위의 두 방법은 편법에 해당하고 해결방법이 있네요.
스플리터의 OnCanResize 이벤트를 이용합니다.
다음과 같이 합니다.
PageControl1 은 아래쪽 컨트롤이고 Splitter2 는 스플리터입니다.
저렇게 하면 최소 높이 30을 유지하게 되네요
호~ 덕분에 하나 배웠습니다 ㅋㅋ
void __fastcall TForm1::Splitter2CanResize(TObject *Sender, int &NewSize,
bool &Accept)
{
Accept = PageControl1->Height >= 30;
if ( Accept == false )
{
PageControl1->Height = 30;
}
}
//---------------------------------------------------------------------------
다시 추가 합니다.
두 컨트롤과 스플리터를 하나의 패널에 올려 다른 컨트롤과 구분해야 합니다.
그렇지 않으면 alBottom 인 컨트롤들이 막 섞이네요...
첨부파일은 패널로 분리하지는 않았지만
alTop 으로 Align 시켜서 원하시는 결과와 유사하게 동작하는 방법입니다.
이또한 위의 StringGrid 위에 또다른 컨트롤이 있다면 동작이 이상해질겁니다.
또 추가합니다 위에 다른분이 더 좋은 답을 올려주셨네요....OTL
제꺼는 그냥 알고만 계시고 Pass~
|