Ani*_*amy 5 c++ windows error-handling mfc
我有一些代码如下:
void MyClass::OnButtonClick()
{
int retVal = SomeDialog.DoModal();
if(retVal == MYCLASS_ERROR)
{
MessageBox("Error"...blah ...blah);
}
else if(retVal == IDOK) // IDOK is returned on clicking the 'OK' button
{
MessageBox("All is well"...blah ...blah);
}
}
Run Code Online (Sandbox Code Playgroud)
SomeDialog只显示一个进度条.如有任何错误,进度条将通过调用自动关闭EndDialog(MYCLASS_ERROR).只有在成功完成后,才允许用户点击"确定".MYCLASS_ERROR是一个enum包含各种返回类型和状态的值.我发现单击确定后SomeDialog,仍然显示错误消息!我挖得更深,发现MYCLASS_ERROR= IDOK= 1.
所以我的问题是,我应该如何定义所有这些返回状态,以便它不会与任何其他实现的状态发生冲突?意思是,我的函数应返回任何其他函数(或尽可能少的其他函数)不返回的值.
我想改变我的设计,使所有函数只返回TRUE或FALSE.但是,这在所有情况下都不可行.我也搜索了很多答案,到目前为止还没有找到任何答案.
谢谢你的期待!
有很多方法可以解决这个问题,但它们有点丑陋。
最干净的设计通常是避免与标准 Win32 习惯用法发生冲突的设计,在 Win32 的世界中,模式对话框返回值之一ID来指示用户在关闭它们时单击的按钮(就像消息框一样)。严格来说,它是nResult传递给EndDialog用于关闭模式对话框的函数的参数。
我建议不要尝试用额外的含义来重载此返回值。尝试这样做只会给您带来麻烦(例如,您可能还没有注意到返回值 -1 意味着对话框的创建失败)。
相反,请在对话框类中定义一个附加成员变量,并使用它来报告附加信息。成功后,您将从IDOK对话框中返回。失败时(任何类型的失败),返回类似IDCANCEL. 然后,您的代码OnButtonClick将检查返回值是否为IDOKor IDCANCEL。如果是IDCANCEL,那么您还需要查询添加到对话框中的成员变量的值以获取其他信息。
希望这是有道理的。如果没有,也许这个代码示例会(假设这m_errStatus是您添加到 的子类中的成员变量CDialog):
void MyClass::OnButtonClick()
{
if (SomeDialog.DoModal() == IDOK)
{
// Success!
// The OK button was clicked, so IDOK was returned.
MessageBox("All is well"...blah ...blah);
}
else
{
// Failure!
// Some error occurred, so IDCANCEL (or any other value) was returned.
// Determine what to do now, based on additional information that the
// dialog set upon failure.
switch (SomeDialog.m_errStatus)
{
case MYCLASS_ERROR_1:
MessageBox("Error 1 occurred.");
break;
case MYCLASS_ERROR_2:
MessageBox("Error 2 occurred.");
break;
// etc.
}
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
205 次 |
| 最近记录: |