Re: Dialog Class "A" Accessing Data In Derived Dialog Class "B", "C", & "D"
I like the UpdateControls() idea. That's excellent way of doing things.
However, in this case, when running the program, you may Select Tab-2, Enter
data, then the only button is on the main dialog to Run or Execute the
action.
In my case, the Tab Control does not have any buttons. I don't think I need
them. The application is designed to make use of one Tab only. The 3-Tabs
provide 3-different tasks but you would not do action on multiple tabs. So
for that reason, I do not have buttons on the control other than the Tabs at
the top that allow you to switch tabs (Page).
fyi;
I'm using the Tab Control from VS Resources not PropertyPage &
PropertySheet. So it does not operate like a Wizard.
The only real execution required of each tab is to take the data and store
into the private members of the class, run the numbers through some
formulas, and store the results. I would access the results from the main
dialog. That's what I'm thinking?
"Joseph M. Newcomer" <newcomer@flounder.com> wrote in message
news:29gi66hem6js9b0m422nanelefru9qp4hk@4ax.com...
I have no idea, since you have not indicated what constitutes "valid
data".
What I do is have a single function, dialog::updateControls, which I call
everywhere. If
there is an EN_CHANGE notification in and edit control, I call
updateControls(). In that
function, I determine if all the data is valid, and if so, I enable the OK
button; if the
data is not valid, I disable the OK button. The ONLY place controls are
enabled or
disabled is updateControls.
On Mon, 16 Aug 2010 08:05:32 -0500, "JCO" <someone@somewhere.com> wrote:
What is the best way so that my main dialog knows when all of the CEdit
Box
on a Tab Control contains valid data and is ready to be process?
*****
In a wizard-style app, you would not enable the Next button until all the
data was valid.
I have no idea what "valid data" means, but you do, so you have to apply
your rules to it,
whatever they are. See my essay on Dialog Control Management on my MVP
Tips site.
joe
****
What is the best way so that the Main Dialog knows when the Tab Control
changes Pages? Currently I have a message handler in the ControlDialog
that
contains the 3-tabs as shown:
void CMyTabCtrl::OnSelchange(NMHDR *pNMHDR, LRESULT *pResult)
This works Fine!
A member variable of CMyTabCtrl is on my main dialog named m_tbCtrl,
therefore, from the main dialog I can get the current tab as shown:
int nSel = m_tbCtrl.GetCurSel(); //zero indx
What I really need is a way so that the main dialog is automatically aware
that the Tab Control has changed. I suspect it has to do with a
SendMessage() but I'm not sure how that is done.
Thanks
****
In the OnSetActive handler of the page you could do a
GetParent()->SendMessage of a
user-defined message to indicate that the dialog has become active. See
my essay on
message management on my MVP Tips site.
joe
****
"ScottMcP [MVP]" <scottmcp@mvps.org> wrote in message
news:5556930a-f2a1-4d29-a368-011aafc35844@k10g2000yqa.googlegroups.com...
On Aug 10, 6:16 pm, "JCO" <some...@somewhere.com> wrote:
Using VS 2008; C++, MFC
The title tells most of the story. I will only talk abut Class A & B
in
this example since Class C & D are accessed the same way. I created a
pointer of type B in Class A (Tab1). In Class B, things are done and
private member variables are set. I provided public Set() and Get()
functions in all classes to access private data variables.
In Class A, the code is as shown:
Tab1 = (CMyTab1*) new CMyTab1;
CString str1( Tab1->GetEdit1() );
CString str2( Tab1->GetEdit2() );
int n = Tab1->GetNumber();
CString strMsg( _T("") );
strMsg.Format( _T("Edit1: %s, Edit2: %s, Integer: %d"), str1,
str1, n );
MessageBox( strMsg );
if( Tab1 ) //goes in destructor
{
delete Tab1;
Tab1 = NULL;
}
What appears to be happening... when I use the "new" operator, class B
is
instantiated. In this process, the constructor of class B zeros the
data
(as it should). Therefore, Class A gets empty data as illustrated from
the
MessageBox().
Maybe the "new" operator is not the right way to go. If not, how do I
initialize the pointer in Class A (Tab1) to point to Class B?
Thanks in advance.
"new CMyTab1" creates a new CMyTab1 object, but it does not create a
tab window and so it also does not create Edit1 and Edit2 controls.
I'm guessing that you want a pointer to some CMyTab1 object that
already exists as part of the dialog. For such cases "new" is
definitely not the way to do it.
The best approach is not to use a pointer at all. Instead, use the
'Add Variable' command (right click on the tab control in the resource
editor). That can give you a CMyTab1 m_tab1 member variable in the
dialog. The wizard adds a line of code that calls DDX_Control that
"attaches" the existing control to your member variable. Then you
will be able to call things like m_tab1.GetEdit1().
Joseph M. Newcomer [MVP]
email: newcomer@flounder.com
Web: http://www.flounder.com
MVP Tips: http://www.flounder.com/mvp_tips.htm