widget - 如何清除或删除包含我的静态类的未命名小部件池

标签 widget pool progress-4gl openedge static-class

我正在使用 Progress 10.1c

我有一个包含静态和非静态方法的类。

类是用 USE-WIDGET-POOL 定义的。在析构函数中,我说“DELETE WIDGET-POOL”。

我创建了我的类的一个实例,并调用了一个方法。该方法本身使用该类的静态方法之一。因此,如果我理解正确的话,我现在将在自己的未命名池中拥有我的类的实例,并为该类的静态成员提供一个单独的未命名小部件池。

到目前为止一切顺利。但是我正忙于调试并且正在对代码进行更改。我重新编译并再次运行我的测试。现在我的非静态成员工作了,但所有静态成员都来 self 类的旧版本,它仍然存储在静态成员池中,该池的范围是 session 。换句话说,我的析构函数中的“DELETE WIDGET-POOL”删除了类实例的池,但静态成员的池仍然存在。

我可以让它加载我的新版本的唯一方法是注销我的 session ,然后重新登录。这在我们的环境中是一个相当大的使命。每次我进行更改时,我都必须停止并启动我的开发环境。

我试图在我的 session 中遍历对象列表,但找不到我要找的东西。我很有可能从错误的对象开始,或者我遗漏了一些关于进程中的池和对象的知识。

有没有什么办法可以让我以那个未命名的池为目标并删除我类(class)的静态“实例”,而不会每次都破坏我的 session ?

最佳答案

事实证明,只需很少的编码就可以做到这一点。我可以使用语句 DELETE OBJECT THIS-OBJECT 来删除执行该语句的实例。因此,如果它在静态方法中,则删除的是静态实例。

METHOD STATIC VOID Reload () :
    DELETE OBJECT THIS-OBJECT.
END METHOD.

所以现在当我有一个新版本的类时,我只使用 MyClass:Reload()。无需结束我的 session 。

感谢Tim Kuehn感谢他用静态方法删除命名的小部件池的建议,为我指明了正确的方向。


我创建了这个示例来演示我是如何让它工作的。下面是一个包含 3 个静态方法的简单类:

/* File : rtt/cls/demo.cls */

USING Progress.Lang.*.
ROUTINE-LEVEL ON ERROR UNDO, THROW.

CLASS rtt.cls.demo USE-WIDGET-POOL :

    METHOD STATIC CHARACTER SayHello() :
      RETURN "Good-bye".
    END METHOD.

    METHOD STATIC VOID ShowMessage() :
      MESSAGE "This is the message." VIEW-AS ALERT-BOX.
    END METHOD.

    METHOD STATIC VOID Reload() :
      DELETE OBJECT this-object.
    END METHOD.

END CLASS.

我不知道别人的环境是怎么设置的,但在我的环境中,我必须登录到我们的系统才能编译和运行程序,换句话说,我有一个事件 session 。

所以我编译文件:

COMPILE VALUE(SEARCH("rtt/cls/demo.cls")) SAVE.

然后我在过程编辑器中运行以下位来测试它:

USING rtt.cls.*.

demo:ShowMessage().
MESSAGE demo:SayHello().

当我运行它时,我得到一个消息框,上面写着“这是消息。”,然后是一个消息框,上面写着“再见”。正如人们所期望的那样。

但是有一个错误,它应该说“你好”,而不是“再见”,所以我编辑了我的类(我只展示了我正在改变的两个方法:

    METHOD STATIC CHARACTER SayHello() :
      RETURN "Hello".
    END METHOD.

    METHOD STATIC VOID ShowMessage() :
      MESSAGE "That was the message." VIEW-AS ALERT-BOX.
    END METHOD.

我保存更改,像以前一样编译它,然后再次运行测试。您希望看到什么消息?我希望看到“This is the message”。和“再见”,和以前一样。这是合乎逻辑的,因为在我当前的 session 中有一个隐藏的小部件池,并且它加载了我的类的一个实例(来 self 的第一次测试)。它将继续使用此实例,直到实例或池被销毁。所以我关闭了我的开发环境,注销然后再次登录以启动一个新 session 。到目前为止,一切都按预期进行。

现在我再次运行我的测试,果然,我得到了我的新版本:消息是“That was the message”和“Hello”。

但现在我被告知要在“你好”一词后添加感叹号。所以我改变它:

    METHOD STATIC CHARACTER SayHello() :
      RETURN "Hello!".
    END METHOD.

我保存并编译它。当我运行测试时,显然我会得到没有感叹号的旧版本,它说“你好”。在我的更改生效之前,我必须重新启动我的 session 。我真的不想再这样做了。所以我改变了我的测试如下:

USING rtt.cls.*.

demo:Reload().

demo:ShowMessage().
MESSAGE demo:SayHello().

我运行它,瞧,我得到了我的最新更改。我将消息从“那是消息”更改为“有效!”。我保存、编译并运行我的测试。我看到了什么?我看到“它有效!”。不再在编辑之间重新启动我的 session 。我的解决方案非常适合我。

我尝试了各种方法,但无法生成错误“无法从静态成员 (15071) 引用 THIS-OBJECT 或 SUPER”。

关于widget - 如何清除或删除包含我的静态类的未命名小部件池,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11083506/

相关文章:

android - 小部件initialLayout不显示 - android

c++ - GUI 库 : how to correctly handle focus?

python - 从 multiprocessing.Pool 调用的函数退出的正确方法?

python - 无法使用 Pool.map() pickle 实例方法,但我没有实例方法

OpenEdge 10.2A - 即使存在 ANYWHERE 的 RETURN/CURSOR-DOWN 通用代码,如何在编辑器小部件上应用默认的 RETURN/CURSOR-DOWN?

performance - 使用 Progress 查询索引中的不等式

progress-4gl - 4GL 查询进度

widget - UserVoice 等托管服务如何将其内容嵌入其他网站?

java - 连接池模式

android - 如何从小部件启动配置 Activity ?