管理gui的状态

时间:2018-03-22 18:05:37

标签: c++ events state

我正在开发一个图形程序,让您连接或托管服务器。它有一个输入IP的字段。现在有2个州:Hosting& Connecting。托管IP字段时应禁用。为此,我将以下内容添加到HostConnectChanged事件:

if(state == Hosting)
{
    ipField.enable(false);
}
else if(state == Connecting)
{
    ipField.enable(true);
}

在我看来,这是以简单方式处理gui状态的合理方式。问题是为程序添加另一种类型的状态。它可以连接/托管或断开连接。当它连接时,也应该禁用IP字段。

if(state == Hosting)
{
    ipField.enable(false);
}
else if(state == Connecting)
{
    if(state2 == Idle)
        ipField.enable(true);
}
if(state2 == Running)
{
    ipField.enable(false);
}
else if(state2 == Idle)
{
    if(state == Connecting)
        ipField.enable(true);
}

我想你知道这是怎么回事。大型项目如何处理多个州?难道这不是gui编程中一个众所周知的问题吗?

1 个答案:

答案 0 :(得分:0)

较大的程序总是大量使用separation of concerns,并且尽可能将状态保存在相关对象的本地。处理此类状态依赖行为的一个常见问题是state design pattern

如果您的两个州是独立的:

理想情况下,几个不同类的对象将使用它们自己的状态机。例如,表单上的某些控件可能取决于连接状态。其他一些控件可能取决于表单中的修改状态。然后,组件的全局状态(例如表格)简单地从其各部分的状态的组合中出现(例如,连接/修改,或连接/未改变)。

如果你的状态是依赖的:

但是,在您的情况下,这两个州是相关的,因为RunningConnecting似乎不相容。最简单的方法肯定是使用复合状态机,其中有效状态是所有允许的组合。然后使用具有复合状态的状态模式。