메인 폼에서 서브 폼으로 인자 전달하는 것은 전역 변수를 쓰면 됩니다.
무슨 기법이 필요한게 아니죠.
그런데 서브 폼 클래스 자체에 받을 인자 멤버변수나 메소드를 설정해서
전달하는 방법은 조금 생각이 필요합니다.
아래는 파일명 변경하는 서브 폼인데, 여기에 원래의 파일명과
변경할 파일명을 건네 준뒤 다시 결과를 되돌려 받는 것입니다.
변경 요청하는 파일명을 서브폼 클래스에 그대로 세팅하고
그것을 되돌려 받는 것을 보여주는 예제입니다.
서브폼 헤더
//---------------------------------------------------------------------------
#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 이벤트 핸들러까지 호출한다는 점을 꼭 기억해야 합니다.
이렇게 인자를 서브폼 클래스 자체에 넣는 것이 전체 코드가 깔끔해지고,
불필요한 전역변수의 사용도 막아 좋습니다.
그럼.
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;
}
그럼..