2017-10-31 C++ Builder XE4, 10.2 Tokyo > Form2에서 Form1 함수 실행 > Form2는 Unit1.h를 포함하지 않는다 > __closure 사용
C++ Builder XE4
RAD Studio 10.2 Tokyo Update 2 (追記: 2018/01/05)
개요
지난번
C++ Builder > Form2에서 Form1 버튼 누르기 > Form2는 Unit1.h를 포함하지 않습니다 > TButton 포인터 전달
TButton의 포인터를 전달했습니다.
Form1 함수를 전달하고 Form2에서 함수를 호출하고 싶습니다.
__closure를 사용해 보았습니다.
참고 : h tps : // s t c ゔ ぇ rf ぉ w. 코 m / 쿠에 s 치온 s / 19050077 / why-s-s-te-s-fun c chion-poi r-fu-i-g
code
Unit1.h
//---------------------------------------------------------------------------
#ifndef Unit1H
#define Unit1H
//---------------------------------------------------------------------------
#include <System.Classes.hpp>
#include <Vcl.Controls.hpp>
#include <Vcl.StdCtrls.hpp>
#include <Vcl.Forms.hpp>
//---------------------------------------------------------------------------
class TForm1 : public TForm
{
__published: // IDE で管理されるコンポーネント
TButton *Button1;
TMemo *Memo1;
void __fastcall FormShow(TObject *Sender);
private: // ユーザー宣言
public: // ユーザー宣言
void __fastcall SetXXX(void);
__fastcall TForm1(TComponent* Owner);
};
//---------------------------------------------------------------------------
extern PACKAGE TForm1 *Form1;
//---------------------------------------------------------------------------
#endif
Unit1.cpp
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "Unit1.h"
#include "Unit2.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::SetXXX(void)
{
Memo1->Lines->Add(L"SetXXX");
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormShow(TObject *Sender)
{
Form2->SetFunction(SetXXX);
Form2->Show();
}
//---------------------------------------------------------------------------
Unti2.h
//---------------------------------------------------------------------------
#ifndef Unit2H
#define Unit2H
//---------------------------------------------------------------------------
#include <System.Classes.hpp>
#include <Vcl.Controls.hpp>
#include <Vcl.StdCtrls.hpp>
#include <Vcl.Forms.hpp>
//---------------------------------------------------------------------------
class TForm2 : public TForm
{
__published: // IDE で管理されるコンポーネント
TButton *Button1;
void __fastcall Button1Click(TObject *Sender);
private: // ユーザー宣言
TButton *m_buttonPtr;
typedef void __fastcall (__closure *TMethod)(void);
TMethod m_funcPtr;
public: // ユーザー宣言
void __fastcall SetFunction(TMethod ptr);
__fastcall TForm2(TComponent* Owner);
};
//---------------------------------------------------------------------------
extern PACKAGE TForm2 *Form2;
//---------------------------------------------------------------------------
#endif
Unit2.cpp
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "Unit2.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm2 *Form2;
//---------------------------------------------------------------------------
__fastcall TForm2::TForm2(TComponent* Owner)
: TForm(Owner)
{
m_buttonPtr = NULL;
m_funcPtr = NULL;
}
void __fastcall TForm2::Button1Click(TObject *Sender)
{
if (m_funcPtr == NULL) {
return;
}
m_funcPtr();
}
void __fastcall TForm2::SetFunction(TMethod ptr)
{
m_funcPtr = ptr;
}
실행
Form2의 버튼을 누르면 Form1의 함수가 실행되어 SetXXX가 추가됩니다.
흠집
void __fastcall
의 함수를 건네주는 경우는 __closure
의 정의도 void __fastcall
로 하지 않으면 안 된다.typedef void __fastcall (__closure *TMethod)(void);
__closure
는 잘 사용되지 않으므로 여전히 잘못되었을 수 있습니다.검색 키워드
(2019-10-03 추가)
Reference
이 문제에 관하여(2017-10-31 C++ Builder XE4, 10.2 Tokyo > Form2에서 Form1 함수 실행 > Form2는 Unit1.h를 포함하지 않는다 > __closure 사용), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/7of9/items/58f377cf89fa7aed162d텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)