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

C++빌더 팁&트릭
C++Builder Programming Tip&Tricks
[1019] 서브폼에 인자 전달하기 기법.
김태선 [cppbuilder] 10885 읽음    2010-11-25 12:14
메인 폼에서 서브 폼으로 인자 전달하는 것은 전역 변수를 쓰면 됩니다.
무슨 기법이 필요한게 아니죠.

그런데 서브 폼 클래스 자체에 받을 인자 멤버변수나 메소드를 설정해서
전달하는 방법은 조금 생각이 필요합니다.

아래는 파일명 변경하는 서브 폼인데, 여기에 원래의 파일명과
변경할 파일명을 건네 준뒤 다시 결과를 되돌려 받는 것입니다.
변경 요청하는 파일명을 서브폼 클래스에 그대로 세팅하고
그것을 되돌려 받는 것을 보여주는 예제입니다.



서브폼 헤더
//---------------------------------------------------------------------------

#ifndef RenameH
#define RenameH
//---------------------------------------------------------------------------
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
#include <ExtCtrls.hpp>
#include <Buttons.hpp>
//---------------------------------------------------------------------------
class TFormRename : public TForm
{
__published:    // IDE-managed Components
    TPanel *Panel1;
    TLabel *Label7;
    TLabel *Label1;
    TEdit *EditTo;
    TEdit *EditFrom;
    TBitBtn *BitBtn1;
    TBitBtn *BitBtn2;
    void __fastcall FormCreate(TObject *Sender);
    void __fastcall FormShow(TObject *Sender);
    void __fastcall BitBtn1Click(TObject *Sender);
private:
    bool     bFirst;
public:
    String    Filename;
    String    NewFilename;
    String    RenameFilename;
public:
    __fastcall TFormRename(TComponent* Owner);
};
//---------------------------------------------------------------------------
extern PACKAGE TFormRename *FormRename;
//---------------------------------------------------------------------------
#endif



서버폼 구현부

//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Rename.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TFormRename *FormRename;
//---------------------------------------------------------------------------
__fastcall TFormRename::TFormRename(TComponent* Owner)
    : TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TFormRename::FormCreate(TObject *Sender)
{
    bFirst = true;
}
//---------------------------------------------------------------------------
void __fastcall TFormRename::FormShow(TObject *Sender)
{
    if (bFirst)
    {
        bFirst = false;
        EditFrom->Text = ExtractFileName(Filename);
        EditTo->Text = NewFilename;
    }
}
//---------------------------------------------------------------------------
void __fastcall TFormRename::BitBtn1Click(TObject *Sender)
{
    RenameFilename = EditTo->Text.Trim();
}
//---------------------------------------------------------------------------


호출하는 쪽 코드

    TFormRename *f = new TFormRename(this);
    f->Filename = item->Caption;  // 세팅 1
    f->NewFilename = item->SubItems->Strings[1]; // 세팅 2
    int r = f->ShowModal();

    String RenameFilename;
    if (r == mrOk)
    {
        RenameFilename = f->RenameFilename; // 결과 받기
    }
    delete f;
    if (r != mrOk)
        return;


위 호출하는 쪽 코드에서 보다시피 폼을 생성하고,
인자를 세팅한뒤 ShowModal() 로 폼을 실행하면 됩니다.

문제는 서브 폼인 TFormRename 에서 인자를 처리해서 화면에 보여줘야 하는데
FormCreate 이벤트는 인자가 세팅되기 전에 호출되는 핸들러이기 때문에
위의 구현부 소스 경우에는 FormShow 이벤트 핸들러에서
처리하도록 하고 있습니다.

    TFormRename *f = new TFormRename(this);
이 코드는 폼 생성자와 FormCreate 이벤트 핸들러까지 호출한다는 점을 꼭 기억해야 합니다.


이렇게 인자를 서브폼 클래스 자체에 넣는 것이 전체 코드가 깔끔해지고,
불필요한 전역변수의 사용도 막아 좋습니다.



그럼.
장성호 [nasilso]   2010-11-25 14:39 X
개인적으로 저 호출하는쪽 코드를 모두 함수로 만들거나..
sub-form의 static method로 만들구요..

함수의 return값은 ModalResult로 받고..
결과는 Call By Reference로 합니다.

호출하는곳이 1군데 이상이면.. 코드가 깔금해지죠

//Form을 생성해서 한번 사용후 free하는 버젼
int __fastcall TFormRename::Execute(String &sFileName)
{
    TFormRename *frm=new TFormRename(Screen->ActiveForm);
    frm->EditFrom->Text=ExtractFileName(sFileName);
    frm->EditTo->Text=ExtractFileName(sFileName);
    int iRslt=frm->ShowModal();
    sFileName=frm->EditTo->Text.Trim();
    delete frm;
    return iRslt;
}

//Form을 한번 생성해 반복 사용하는 버젼
int __fastcall TFormRename::Execute(String &sFileName)
{
    if(FormRename==NUILL) FormRename=new TFormRename(Application);

    FormRename->EditFrom->Text=ExtractFileName(sFileName);
    FormRename->EditTo->Text=ExtractFileName(sFileName);
    int iRslt=FormRename->ShowModal();
    sFileName=FormRename->EditTo->Text.Trim();
    return iRslt;
}

그럼..

+ -

관련 글 리스트
1019 서브폼에 인자 전달하기 기법. 김태선 10885 2010/11/25
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.