Delphi Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
델파이 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
FreePascal/Lazarus
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
델마당
볼랜드포럼 광고 모집

델파이 팁&트릭
Delphi Programming Tip&Tricks
[164] 팁! TOpenDialog에 컨트롤 추가하기~!
박지훈.임프 [cbuilder] 12075 읽음    1999-06-04 00:00
임프랍니다.. 오늘도 어제처럼 내일도 오늘처럼 매일 아침마다 나오는....
오늘의..... (빰빠라방~~~) 팁~~~! (우우우우우~~~~~~)
오늘은~ 어제 했던 팁을 약간 응용도 해볼겸, 아주 재밌는 일을 해봅시다.

무슨 일이냐고요?
새롬 98 써보신 분은 다 알겠지만, 새롬 98의 업로드 다이얼로그에 보면
보통 오픈다이얼로그인데도 불구하고 이상한 버튼이(올릴화일에서 선택)
있죠.. 이걸 어케 올렸을까.. 하고 궁금하셨던 분 많으시리라 생각됩니다..
바로, 이것이 오늘의 팁임다.. 기대되죠? ^^;;;;

사실은 이 팁은, 빌더의 vcl 소스에 나오는겁니다. (example이 아니라 vcl)
뭐냐면, 바로 TOpenPictureDialog가 바로 오픈다이얼로그에 픽처박스를
추가한거잖아요~ 그래서 그걸 보고 따라해봤죠.. 몇시간을 끙끙댄 끝에,
결국 해냈슴다~~~ 추카해주세요~ ^^;;;;

왜 갑자기 이런짓을 해봤느냐? 쩝..
비파툴에 질문이 올라왔더군요. 옛날부터 해보고 싶기도 했고..
그래서 바로 해봤습니다. 짧은 시간에 해보느라 새 컴퍼넌트로 만들지는 못하고,
그냥 오픈다이얼로그에 새 컨트롤을 올리려니, 어쩔수 없이 오픈다이얼로그의
프라이빗이나 프로텍티드 멤버를 억세스해야만 하더군요. 이 팁은 어제 알려드렸죠?

물론, 비파툴에는 이런 설명은 다 빼먹고, 그냥 vcl소스보고 알아서 해라..
정도만 알려줬죠. 그리고 물론, 컴퍼넌트를 만들지 않고 할 수 있는 방법인
어제의 팁은 절대로 안갈켜주고요.. (넘 치사한가요....? T.T)

자아.. 그럼 진도를 나가봅시다.
먼저 폼에 오픈다이얼로그 컴퍼넌트를 하나 놔야겠지요?
그런후에, 폼의 OnCreate 핸들러에서 올려놓을 컨트롤로서 패널을 하나 만듭시다.
뭐, 디자인타임에 만든 패널이라도 상관은 없지만, 그러면 폼이 안나니까
동적으로 만들어봅시다. 물론 여기서 써먹는 Panel은 TPanel *형으로 전역적으로
혹은 클래스 선언내에 선언 해놔야죠.

만약 델파이라면 약간의 준비가 더 필요합니다.
interface 섹션의 폼 클래스 선언 아래쪽에 다음과 같이 클래스 선언을 하나 더 만듭니다.
  TImpOpenDialog = class(TOpenDialog)
  public
    property Template;
    function GetStaticRect: TRect; override;
  end;

그리고 implementation 섹션에 위의 클래스에서 오버라이드한 GetStaticRect() 함수의 바디를 만듭니다.
function TImpOpenDialog.GetStaticRect: TRect;
begin
  result := inherited GetStaticRect;
end;


자 그럼 본격적으로 코딩...

C++ 코드
void __fastcall TForm1::FormCreate(TObject *Sender)
{
    Panel = new TPanel(OpenDialog1);
    Panel->SetBounds(204, 5, 169, 200);
    Panel->BevelOuter = bvNone;
    Panel->Caption = "임프만세~~~";
}


델파이 코드
procedure TForm1.FormCreate(Sender: TObject);
begin
  Panel := TPanel.Create(OpenDialog1);
  Panel.SetBounds(204, 5, 169, 200);
  Panel.BevelOuter := bvNone;
  Panel.Caption := '임프만세~~~';
end;

패어런트를 안정해줬지요? 뭐.. 여기서 정해줘도 상관은 없습니다만..
넘어갑시다. 마지막줄이 아주 중요합니다. 꼭 임프만세 뒤에 물결표시가
세개라야 합니다. 알겠지요??

그리고.. 이 오픈다이얼로그를 실행시켜줄 이벤트를 위해 버튼을 하나 만듭시다.
코드는 그냥 오픈다이얼로그->익스큐트(); 가 아니고, 약간이 더 추가됩니다.
C++ 코드
void __fastcall TForm1::Button1Click(TObject *Sender)
{
    OpenDialog1->Template = "DLGTEMPLATE";
    OpenDialog1->Execute();
}

델파이 코드
procedure TForm1.Button1Click(Sender: TObject);
begin
  TImpOpenDialog(OpenDialog1).Template := 'DLGTEMPLATE';
  OpenDialog1.Execute;
end;

많이 귀찮을 정도는 아니지요? ^^

그럼, 마지막으로 오픈다이얼로그를 클릭하고 오브젝트인스펙터의 이벤트 탭에서
OnShow 이벤트를 더블클릭해서 핸들러코드를 만들고, 다음과 같이 써봅시다.
C++ 코드
void __fastcall TForm1::OpenDialog1Show(TObject *Sender)
{
    TRect PreviewRect, StaticRect;
    ::GetClientRect(OpenDialog1->Handle, (RECT *)(&PreviewRect));
    StaticRect = OpenDialog1->GetStaticRect();
    PreviewRect.Left = StaticRect.Left + (StaticRect.Right - StaticRect.Left);
    Panel->BoundsRect = PreviewRect;
    Panel->ParentWindow = OpenDialog1->Handle;
}

델파이 코드
procedure TForm1.OpenDialog1Show(Sender: TObject);
var
  PreviewRect, StaticRect: TRect;
begin
  Windows.GetClientRect(OpenDialog1.Handle, PreviewRect);
  StaticRect := TImpOpenDialog(OpenDialog1).GetStaticRect;
  PreviewRect.Left := StaticRect.Left + (StaticRect.Right - StaticRect.Left);
  Panel.BoundsRect := PreviewRect;
  Panel.ParentWindow := OpenDialog1.Handle;
end;


자아.. 이제 준비는 끝났습니다.
C++빌더에서 컴파일하면, 앞에서도 말했듯이 두개의 멤버가 억세스권한이 없다는 에러가 뜹니다.
이럴때 멋지게 어제의 팁을 써먹읍시다. 잘 이해가 안되시는 분은 어제팁을 읽어보세요.
(델파이에서는 위에서 선언한 TImpOpenDialog 덕분에 필요없이 바로 컴파일됩니다)

그럼.. 이제 실행되지요? 오픈다이얼로그박스의 오른쪽에 나오는 글자를
신경써서 잘 보세요. 명언이지요?

저는 이 소스를 작성하면서 어케되는건지 다 분석했습니다만, 잠도 오고..
설명은 질문이 올라오면 하기로 합시다. 잠 잘 시간이 한참 지났답니다.. 헐~

그럼 도움되시길...



독립문에서 임펠리테리였습니다.

+ -

관련 글 리스트
164 팁! TOpenDialog에 컨트롤 추가하기~! 박지훈.임프 12075 1999/06/04
(링크)     C++Builder Tip'N Tricks > 팁! TOpenDialog에 컨트롤 추가하기~!
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.