From: Vadim Zeitlin <vadim@wxwidgets.org> Date: Tue, 3 Feb 2009 12:02:20 +0000 (+0000) Subject: added wxPersistentRegisterAndRestore() function to work around VC6 brokenness in... X-Git-Url: https://git.saurik.com/wxWidgets.git/commitdiff_plain/77cc73a78e51832c71351a2758df508672b8c294 added wxPersistentRegisterAndRestore() function to work around VC6 brokenness in debug DLL build git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@58635 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- diff --git a/include/wx/persist.h b/include/wx/persist.h index ff2aabab10..24cd503142 100644 --- a/include/wx/persist.h +++ b/include/wx/persist.h @@ -215,5 +215,23 @@ private: DECLARE_NO_COPY_CLASS(wxPersistentObject) }; +// FIXME-VC6: VC6 has troubles with template methods of DLL-exported classes, +// apparently it believes they should be defined in the DLL (which +// is, of course, impossible as the DLL doesn't know for which types +// will they be instantiated) instead of compiling them when +// building the main application itself. Because of this problem +// (which only arises in debug build!) we can't use the usual +// RegisterAndRestore(obj) with it and need to explicitly create the +// persistence adapter. To hide this ugliness we define a global +// function which does it for us. +template <typename T> +inline bool wxPersistentRegisterAndRestore(T *obj) +{ + wxPersistentObject * const pers = wxCreatePersistentObject(obj); + + return wxPersistenceManager::Get().RegisterAndRestore(obj, pers); + +} + #endif // _WX_PERSIST_H_ diff --git a/interface/wx/persist.h b/interface/wx/persist.h index 8c31fb2976..bb0dc58c31 100644 --- a/interface/wx/persist.h +++ b/interface/wx/persist.h @@ -259,6 +259,23 @@ protected: framework. @see @ref persistence_defining + + @header{wx/persist.h} */ template <class T> wxPersistentObject *wxCreatePersistentObject(T *obj); + +/** + A shorter synonym for wxPersistenceManager::RegisterAndRestore(). + + This function simply calls wxPersistenceManager::RegisterAndRestore() but + using it results in slightly shorter code as it calls + wxPersistenceManager::Get() internally. + + For the implementation reasons, this function @em mucst be used instead of + the template method when using Microsoft Visual C++ 6 compiler. + + @header{wx/persist.h} + */ +template <class T> +bool wxPersistentRegisterAndRestore(T *obj); diff --git a/samples/widgets/widgets.cpp b/samples/widgets/widgets.cpp index a808a3a87f..19d86f02e3 100644 --- a/samples/widgets/widgets.cpp +++ b/samples/widgets/widgets.cpp @@ -367,7 +367,7 @@ WidgetsFrame::WidgetsFrame(const wxString& title) : wxFrame(NULL, wxID_ANY, title) { SetName("Main"); - const bool sizeSet = wxPersistenceManager::Get().RegisterAndRestore(this); + const bool sizeSet = wxPersistentRegisterAndRestore(this); // set the frame icon SetIcon(wxICON(sample)); @@ -617,7 +617,7 @@ void WidgetsFrame::InitBook() wxEVT_COMMAND_WIDGETS_PAGE_CHANGED, wxWidgetsbookEventHandler(WidgetsFrame::OnPageChanged) ); - const bool pageSet = wxPersistenceManager::Get().RegisterAndRestore(m_book); + const bool pageSet = wxPersistentRegisterAndRestore(m_book); #if USE_TREEBOOK // for treebook page #0 is empty parent page only so select the first page