|
21355번 글을 참조하여 동적생성한 CheckBox에 이벤트를 부여하려고 하였습니다.
Chart의 TLineSeries와 TCheckBox를 같은 숫자만큼 생성시키고
체크박스에서 선택된 Series만 화면에 나타나도록 하는 것입니다.
디폴트는 모든 항목이 체크(->Active)되어 있는 것이고
동적생성한 CheckBox에 이벤트 부여하는 것을 제외하고는 일단 이상이 없었습니다.
제가 작성한 코드의 오류메세지는 checkboxAClick가 정의되지 않았다고 하는것입니다.
([C++ Error] Unit12.cpp(116): E2451 Undefined symbol 'checkboxAClick')
아래에서 checkboxAClick은 이벤트 함수이름입니다.
이 코드에서 제가 문제라고 생각되는 부분은 checkboxAClick를 호출하는 부분이
checkboxAClick를 선언한 Frm12Display에 있지않고 void Frm12Creation(void)라는 함수속에
자리잡고 있는 것입니다. 이렇게 되어도 괜찮은 것인지.... 모르겠군요.
해더에서의 선언 위치가 문제가 되는것인지......
//////////////////////////////////////////////////////////////////////////////////////////
//=========//
//헤더 부분//
//=========//
//---------------------------------------------------------------------------
#ifndef Unit12H
#define Unit12H
//---------------------------------------------------------------------------
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
#include <Chart.hpp>
#include <ExtCtrls.hpp>
#include <Series.hpp>
#include <TeEngine.hpp>
#include <TeeProcs.hpp>
//---------------------------------------------------------------------------
class TFrm12Display : public TForm
{
__published: // IDE-managed Components
TChart *Chart1;
TGroupBox *Gbx1VarItem;
TButton *Btn1Simul;
TButton *Button2;
TButton *Button3;
TButton *Button4;
TLabel *Label1;
TListBox *ListBox1;
void __fastcall Btn1SimulClick(TObject *Sender);
void __fastcall FormCreate(TObject *Sender);
private: // User declarations
void __fastcall checkboxAClick(TObject *Sender); //<====== 이벤트 함수 선언
public: // User declarations
__fastcall TFrm12Display(TComponent* Owner);
//Chart이 동적 생성
TList *MyChart1SeriesList; //Chart1의 LineSeries List
TList *MyChart1CheckBoxList; //Chart1_ Display Variables의 CheckBox List
int SrtNo_ChtIndex; //Model에 따른 LineSeries 이름 시작 번호
};
//---------------------------------------------------------------------------
extern PACKAGE TFrm12Display *Frm12Display;
//---------------------------------------------------------------------------
#endif
void Frm12Creation(void);
void Frm12Clear(void);
//================//
//이벤트 함수 부분//
//================//
void __fastcall TFrm12Display::checkboxAClick(TObject *Sender)
{
bool CrrntSrs;
TCheckBox *cbx = dynamic_cast<TCheckBox *>(Sender);
CrrntSrs = ((TLineSeries *)(Frm12Display->MyChart1SeriesList->Items[cbx->Tag]))->Active;
((TLineSeries *)(Frm12Display->MyChart1SeriesList->Items[cbx->Tag]))->Active != CrrntSrs;
}
//=========================//
//동적생성에 관한 함수 부분//
//=========================//
void Frm12Creation(void)
{
//==============//
//Chart1 Setting//
//==============//
Frm12Display->Show();
Frm12Display->Chart1->BottomAxis->AutomaticMaximum = false;
Frm12Display->Chart1->BottomAxis->Maximum = Frm11Simulation->Edt3SimulPeriod->Text.ToDouble();
Frm12Display->Chart1->Title->Text->Clear();
Frm12Display->Chart1->Title->Text->Append("Reactor State Profile(based on " + Frm1MainWindow->BioModel +")");
Frm12Display->Chart1->Title->Font->Style = TFontStyles()<<fsBold;
switch (Frm1MainWindow->CbxBioModel->Items->IndexOf(Frm1MainWindow->CbxBioModel->Text))
{
case 0 : //ASM1의 경우
Frm12Display->SrtNo_ChtIndex = 0;
break;
/* case 1 : //ASM2의 경우
Frm12Display->SrtNo_ChtIndex = 13+1;
break;
case 2 : //ASM2d의 경우
Frm12Display->SrtNo_ChtIndex = 13+1 + 18+1;
break; */
case 3 : //ASM3의 경우
Frm12Display->SrtNo_ChtIndex = 13+1 + 18+1 + 17+1;
break;
/* case 4 : //ASM3+bioP의 경우
Frm12Display->SrtNo_ChtIndex = 13+1 + 18+1 + 17+1 + 12+1;
break; */
default :
ShowMessage("Invalid Model Now");
}
Frm12Display->MyChart1SeriesList = new TList;
Frm12Display->MyChart1CheckBoxList = new TList;
//==============================================//
// LineSeries, CheckBox의 동적 생성의 동적 생성 //
//==============================================//
TLineSeries *series_A;
series_A = new TLineSeries(Frm12Display->Chart1);
series_A->ParentChart = Frm12Display->Chart1;
Frm12Display->ListBox1->ItemIndex = Frm12Display->SrtNo_ChtIndex;
series_A->Title = Frm12Display->ListBox1->Items->Strings[Frm12Display->ListBox1->ItemIndex];
series_A->VertAxis = aRightAxis;
Frm12Display->MyChart1SeriesList->Add(series_A);
TCheckBox *checkbox_A;
checkbox_A = new TCheckBox(Frm12Display->Gbx1VarItem);
checkbox_A->Parent = Frm12Display->Gbx1VarItem;
checkbox_A->Left = 25;
checkbox_A->Top = 20;
checkbox_A->Width = 45;
Frm12Display->ListBox1->ItemIndex = Frm12Display->SrtNo_ChtIndex;
checkbox_A->Caption = Frm12Display->ListBox1->Items->Strings[Frm12Display->ListBox1->ItemIndex];
checkbox_A->Font->Style = TFontStyles();
checkbox_A->Checked = true;
checkbox_A->OnClick = checkboxAClick; //<========== 이벤트 부여 ===========
checkbox_A->Tag = 0;
Frm12Display->MyChart1CheckBoxList->Add(checkbox_A);
for(int i=1; i<(Frm1MainWindow->CompositionCount+1); i++)
{
TLineSeries *series_A;
series_A = new TLineSeries(Frm12Display->Chart1);
series_A->ParentChart = Frm12Display->Chart1;
Frm12Display->ListBox1->ItemIndex = Frm12Display->SrtNo_ChtIndex + i;
series_A->Title = Frm12Display->ListBox1->Items->Strings[Frm12Display->ListBox1->ItemIndex];
series_A->VertAxis = aLeftAxis;
Frm12Display->MyChart1SeriesList->Add(series_A);
TCheckBox *checkbox_A;
checkbox_A = new TCheckBox(Frm12Display->Gbx1VarItem);
checkbox_A->Parent = Frm12Display->Gbx1VarItem;
checkbox_A->Left = 25;
checkbox_A->Top = 20+i*18;
checkbox_A->Width = 45;
Frm12Display->ListBox1->ItemIndex = Frm12Display->SrtNo_ChtIndex + i;
checkbox_A->Caption = Frm12Display->ListBox1->Items->Strings[Frm12Display->ListBox1->ItemIndex];
checkbox_A->Font->Style = TFontStyles();
checkbox_A->Checked = true;
checkbox_A->OnClick = checkboxAClick; //이벤트 부여
checkbox_A->Tag = i;
Frm12Display->MyChart1CheckBoxList->Add(checkbox_A);
}
}
|