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)

개요


  • Form1과 Form2가 있다
  • Form2에서 어느 처리를 하면, Form1에 반영되도록 하고 싶다
  • Form2에서 Unit1.h를 include하지 않는다
  • include 하면 Unit1에 의존해, Unit2의 재이용성이 저감한다
  • 예 : Unit3에서 Unit2 사용



  • 지난번



    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 추가)
  • 함수 포인터
  • 좋은 웹페이지 즐겨찾기