Joseph M. Newcomer wrote:
See below...
On Thu, 27 Mar 2008 10:30:10 +0800, asm23 <asmwarrior@gmail.com> wrote:
HI, I'm designing a program which has many CDialog(as docking control
bar) and user data structures. I want to do some data exchange on those.
For example:
//==================================================================
class CConfigDlg : public CDialog
{
...
//many common control such as CEdit...
}
class CMyData{
...
//many data members...
}
//==================================================================
When I initialize the dialog, or some data hase changed in working
thread,I want to update UI in using UpdateData(false);
****
It sounds to me like your statement is "I want to update the values in the controls".
Whether or not UpdateData is relevant to this problem is a different issue
****
When I made some modification on the UI control and Press "APPLY", these
change could to applied to CMyData.
But my CMyData is not the member of CConfigDlg, Maybe, CMyData is a
member of CMainFrame or some other's.
****
I would be very suspicious if it is a member of other than a window class. If it is a
member of a window class, it could reasonably contain a CWnd* of the target to be notified
if there are changes. Then you would SendMessage or PostMessage a notification (more
commonly, it would be SendMessage) using a user-defined message code, and handle the
problem in the receiving window, whatever it is, in whatever way it wants to.
*****
So, What's the best method to exchange data between UI dialog and data
structures? I found one kind of method to do this--Adding pointers to
each other and add "friend" keyword.
****
That's a bit scary. 'friend' is suspect, and it doesn't make any sense to me in this
context
****
//==================================================================
class CConfigDlg : public CDialog
{
...
//many common control such as CEdit...
CMyData * m_pData;
friend CMyData;
}
class CMyData{
...
//many data members...
CConfigDlg * m_pdlg;
friend CConfigDlg;
****
This is erroneous. The CMyData should have NO IDEA about how it is used, least of all
whether or not a dialog is involved, or what controls would be in the dialog, or what the
types of the controls are.
You have two issues here: notifying the dialog that the values have changed by some
mechanism outside the dialog, and notifying the "owner window" of the data that the dialog
has changed the data. This suggests that you should have
CWnd * UIwnd;
CWnd * owner;
the 'owner' is the window that owns the data. If it makes modifications, it would
SendMessage a notification to the UIwnd that the contents had changed, and that window is
the ONLY place where knowledge about what controls exist is where the knowledge of how to
update the controls is embedded. No piece of code outside the dialog should know anything
about the controls (one way to handle this is to make sure that all the methods that
update the controls, and all the control variables, are 'protected', and not use a
'friend' declaration anywhere.
The UIwnd holds the interface. If something is updated, it will send a notification to
the owner.
Note that what you have done here is create a poor imitation of document/view. Why is the
document not the repository of all this information? Note that if this is *not* involved
in doc/view, then you should be content with the concepts of document/view, which is what
I propose here:
The repository of the data asks the display components to display changed data
The display components update the data in the structure and notify the repository
that it has changed
joe
****
}
//==================================================================
Then, class can operation each other through "Pointers", Is this a good
method? or Someone can give me more suggestion? Which kind of books
cover these topics?
****
This proposal that each class can operate on the other EXCEPT by a very abstract mechanism
that does not involve any knowledge of a single name of the variables except in the
CMyData class. No knowledge of the dialog variables or any variable of any CWnd class is
appropriate. Note that I carefully said the dialogs are CWnd* variables; nothing more
specific is appropriate.
joe
****
Thanks.
Joseph M. Newcomer [MVP]
email: newcomer@flounder.com
Web: http://www.flounder.com
MVP Tips: http://www.flounder.com/mvp_tips.htm
Thanks Joseph. I'm sorry that my question is erroneous in both technical
your patient explanation of the relationship between UI and DATA. For
Prosise's <<MFC windows Programming>>. Your proposal about "CWnd
what said in the book. My testing code is below:
....
//This is what you said: UIwnd send notification to Owner.
Suppose the "docoment" is in CMainFrame.
....