MFC 中的更新数据
Posted
技术标签:
【中文标题】MFC 中的更新数据【英文标题】:UpdateData in MFC 【发布时间】:2011-06-27 14:30:01 【问题描述】:语言:C++
开发环境:Microsoft Visual C++
使用的库:MFC
问题:我创建了一个偏好配置应用程序。左侧是一个列表框,其中包含他们可以更改的设置的“父”类别,当他们单击一个时,他们可以更改的设置出现在列表框的右侧,就像在许多大型首选项对话框中一样。我的所有控件都设置了 DDX 数据交换(注意:我有一个用于每个子对话框/首选项页面的 cpp 文件),所以我已经设置了所有基础。
这是我的问题。我很难使用 UpdateData,因为我实际上从未在首选项框上调用 DoModal(),因为它们是父对话框容器的子级,并且它们只是绑定到对话框中的图片控件。当用户单击列表框时,我会执行设置焦点和显示/隐藏子对话框的组合。
当用户选择“保存这些”时,他/她会看到另一个对话框,允许他们检查他们想要保存的特定首选项窗格(以生成 XML 配置文件)。显然我需要为他们的输入抓取对话框,但是当程序到达代码中调用 UpdateData 的点时,程序会失败,因为我在调用 DoModal() 之前调用了 UpdateData。
现在我不确定如何获取这些值。我对 MFC 很陌生,这也无济于事。所以就是这样。无论如何,如果任何人都可以提供任何帮助,我将不胜感激。
【问题讨论】:
【参考方案1】:就在您显示其中一个子对话框之前,您应该调用其UpdateData(FALSE)
函数来填充其控件。这应该在外部对话框的 OnInitDialog 中,也应该在切换类别的代码中。就在从子对话框(从类别更改或 OnOK)切换之前,您应该调用 UpdateData(TRUE)
从子对话框中拉回更改;如果 UpdateData 返回 FALSE,则不允许更改类别或关闭对话框。
【讨论】:
我有一个包含两个文本字段 T1 和 T2 的表单。用户更改 T1。 T2 在其右侧有一个...
按钮,用于打开一个模态对话框并修改 T2。用户转到...
并单击确定。 T2 需要更新。将新值分配给 T2 关联变量后,我无法执行 Updatedata(FALSE)
,因为它会使 T1 用户所做的更改消失。我看到了两种解决问题的方法。 1:调用T2->SetWindowText(new_text);
2:声明一个CDataExchange dx(this, FALSE);
变量并且只为T2 做DDX_Text
。最好的方法是什么?
@sergiol 我假设 T1 是父对话框的一部分,对吗?这个答案是关于在 T2 的子对话框上调用 UpdateData
,这不应该影响 T1。然后调用子对话框的代码负责将该对话框中的数据复制到文本控件中。【参考方案2】:
使用CTabCtrl
可能会改善用户体验,它提供了您似乎正在实现的功能。
一般来说,在大多数情况下,您不应该直接调用UpdateData
,这是由OnInitDialog
调用以加载和OnOK
调用以保存模式对话框的框架机制。这不是您可能认为的加载和保存。它所做的是从OnInitDialog
中的资源或成员变量中加载控件值,然后当用户单击“确定”时,它会验证对话框上的控件值并将其保存到成员变量中。这种机制允许您在重新打开对话框时显示以前的值,以及在关闭对话框后取出值。
您可以查看CArchive
并序列化您的对话框,但我建议您编写自己的保存/加载框架,尤其是在处理 XML 配置文件时。
【讨论】:
如果可以的话,我真的很想避免部分重做 UI。我试过只使用 OnOK(),因为我知道它调用 UpdateData,但由于我的应用程序的工作方式,它不喜欢我正在尝试做的事情。基本上我有一个“全部保存”按钮和一个“保存这些”按钮,它们指定保存哪些子对话框。 SaveThese 会弹出一个带有复选框的对话框,以便他们可以指定要保存的窗格,并且在此选择器的关闭 (OnOK) 上,我要保存信息……这需要获取所有值。我尝试在子对话框上调用 OnOK 无济于事。 在没有看到代码的情况下,听起来您需要每个窗格的数据结构和允许您拥有这些数据结构的集合的界面,这些数据结构可用于从不相关的对话框中保存/加载。我假设这些窗格是无模式的,因此允许您拥有一组可以循环浏览的窗格指针的界面也有助于使事情变得更容易。 嗯,我得研究一下……我不确定你所说的每个窗格的界面是什么意思。我对 visual-c++ 和 MFC 还很陌生,所以要做到这一点是一个挑战。有什么建议么?我不想占用你太多时间... 基本上在 C++ 中,您可以使用纯虚拟基类作为接口。然后可以使用一组接口类指针来维护派生的具体类型。您的界面可能就像定义派生窗格必须实现的保存和加载方法一样简单。然后,您可以轻松地创建一个可以保存或加载所有让多态性处理每个窗格的对象。对于这种设计的更高级或更强大的版本,请在谷歌上搜索“访问者模式”。 谢谢 AJ。感谢您的帮助。以上是关于MFC 中的更新数据的主要内容,如果未能解决你的问题,请参考以下文章