从MFC CPropertySheet加载和保存值的最惯用的方法是什么?

时间:2015-03-11 17:38:55

标签: properties mfc

我有一个派生自CPropertySheet的类,我无法找到启动时加载值的“正确”方法,并在用户按下OK时保存值。我很惊讶我在网上找不到任何有用的例子,但确实如此。

最终,我需要从外部数据源读取值并将其写回来但是现在,我在属性表上有一个void LoadValues(void)方法,它只使用一些文字来初始化属性页面上的控件。当我从LoadValues()拨打OnInitDialog()时,此功能正常。但如果我这样做:

CMyPropertySheet* pSheet = new CMyPropertySheet("My Title");

pSheet->LoadValues();

if (pSheet->DoModal() == IDOK) {
   pSheet->SaveValues();
   delete pSheet;
}

(如Microsoft suggests)当显示属性页时,值不存在;控件为空或包含默认值。所有MFC控件值设置例程似乎都返回void,所以没有什么可以测试成功。在我设置之后,我确实在LoadValues()中读回了一个值,并且得到了正确的值。

此外,SaveValues()看到了胡言乱语。也许在我离开DoModal()之前,属性表已被拆除,价值不再存在?

我被告知值应该加载到OnInitDialog()中,我想我可以将外部数据源添加到构造函数中的对象但是这让我不知道 save 值。似乎没有CPropertySheet::OnOK()方法。我错过了什么?

1 个答案:

答案 0 :(得分:1)

虽然您正在使用属性表,但同样的问题也适用于所有模态对话框。在调用DoModal之前,控件不存在。因此,如果您的LoadValues调用正在尝试访问控件,则它将无法工作。 (这通常会在调试版本中产生一个断言。)您需要的是两步操作:(1)LoadValues可以访问工作表的数据成员,因此将值传递给您为此目的创建的工作表的数据成员。 (2)在工作表的OnInitDialog中,您可以从数据成员初始化控件。

SaveValues需要类似的两步,因为DoModal返回后控件不再存在。 (1)在工作表的OnOK或等效文件中,将数据从控件移动到数据成员。 (2)DoModal返回后,您可以访问数据成员来执行SaveValues。