【问题标题】:Progress 4gl-internal procedureProgress 4gl-内部程序
【发布时间】:2012-04-23 15:46:10
【问题描述】:

有没有办法在其内部过程(.p 文件) 中使用过程的变量(.p 文件)

【问题讨论】:

  • 你想完成什么?

标签: progress-4gl


【解决方案1】:

实际问题似乎是:“我有许多调用公共过程的过程。在一种特殊情况下,我需要让公共过程在调用过程中设置一个特殊值,但我不能修改所有其他过程。”

简单但在架构上令人反感的解决方案是使用全局共享变量。

很多人会告诉你这是一种糟糕的编码技术。他们是对的。但是您并不是在寻求有关最佳实践的建议。

只需在调用者和被调用者中都创建这样一个变量。不需要的程序不会错过。

你的一个“正常”程序:

/* p1.p */

message "p1, I'm normal.".
run common.p.

你的“特别”计划:

/* p2.p */

define new global shared variable special as character no-undo.

message "p2, I'm special!".
run common.p.
message "special = " special.

常用程序:

/* common.p */

define new global shared variable special as character no-undo.
message "common stuff...".
if program-name(2) = "p2.p" then special = "special value".
return.

您可以根据需要多次定义 NEW GLOBAL SHARED 变量,并且您只会获得一份副本。 “新”不会覆盖任何现有变量(如果您忽略 GLOBAL,它的行为会有所不同)。

您没有要求它,也许您不需要它,但程序名称 (2) 检查调用堆栈以查看 common.p 是否被 p2.p 调用。

还有其他更复杂的方法可以做到这一点,但它们都归结为同一个问题——你正在为你的“特殊”程序和现在不再通用的“普通”程序之间的一些非常丑陋的耦合创造基础程序。

【讨论】:

  • 共有五个不同的屏幕(5 个不同的 .p 文件)使用一段代码(第 6 个 .p 文件)。我需要更改特定的“一段代码”,以便它应该只在我需要的一个屏幕上产生效果,而不是其他 4 个。所以我认为使用标志可以解决问题。要求你让我知道实现这一目标的可能方法。对不起,我对这种利基技术完全陌生。我只是想利用与此相关的任何可用信息。再次感谢您的帮助
  • 如果“一段代码”是另一个过程(这是您在问题中声称的),那么 GLOBAL SHARED 变量将允许您这样做。显然我不知道你的代码实际上是什么样子——但你应该能够很容易地适应上面显示的概念。
  • 如果我定义一个全局共享变量,在 1 个 .p 文件中说“标志”,我在另一个 .p 文件(我在前一个 .p 文件中运行)中使用它而不定义,会不会工作吗?
  • 你必须在任何你想引用它的地方定义它。
【解决方案2】:

像这样?

define variable i as integer no-undo.  /* a variable in the main procedure */

procedure internalProcedure:

  message "Internal Procedure (a):" i.
  i = 13.
  message "Internal Procedure (b):" i.
end.

/* main block
 */

i = 1.
message "Main procedure (a):" i.

run internalProcedure.

message "Main procedure (b):" i.

更难的问题可能是:“是否有办法防止全局范围的变量在内部过程中使用”?

【讨论】:

  • :感谢您的关注,先生。让我把我的整个问题交给你,这样你就可以给我我真正需要的东西。**我正在开发 4gl,我是一名新手程序员。我正在处理一种情况,其中有五个彼此不相关的过程(.p 文件),共享一个过程(.p 文件)。我的问题是我需要修改共享过程,这应该只对一个调用过程产生影响,而不对其他四个产生影响。有什么方法可以同时链接这两个程序,防止影响其他四个程序。**
  • 另一件事是,有人告诉我,将标志从 1 .p 文件传递​​到另一个 .p 文件是不可能的。是这样吗,先生?如果该陈述是错误的,它将解决我的问题。!谢谢。
  • 所以你的问题实际上与内部程序无关,实际上是在多个 .p 文件之间传递参数?
【解决方案3】:

这是你的意思吗?

这里有一个名为 ShowTime.p 的通用 .p 文件,其他 .p 文件将运行该文件。您希望它对其中一个 .p 文件以某种方式运行,而对其他文件则以不同的方式运行。为此,我们定义了一个参数。在此示例中,它是一个 LOGICAL 参数,因此该值可以是 YES 或 NO。如您所见,如果 lShowDate 参数为 NO,ShowTime 过程将显示 TIME,如果 lShowDate 参数为 YES,它将显示 DATE。

/* ShowTime.p */
DEFINE INPUT PARAMETER lShowDate AS LOGICAL.
IF lShowDate = NO THEN
  MESSAGE STRING(TIME,"HH:MM:SS").
ELSE
  MESSAGE STRING(TODAY,"9999/99/99").

这是您的五个不相关的 .p 文件之一。它运行 ShowTime.p 过程,传递一个 NO 参数,因此 ShowTime 将显示 TIME。

/* p1.p */
MESSAGE "P File 1".
RUN ShowTime(INPUT NO) NO-ERROR.

另一个,为什么不呢?

/* p2.p */
MESSAGE "P File 2".
RUN ShowTime(INPUT NO) NO-ERROR.

这个 .p 文件正在运行 ShowTime,并且 lShowDate 参数为 YES,这意味着 ShowTime 过程对于这个文件的行为会有所不同,通过显示 DATE 而不是 TIME。

/* p5.p */
MESSAGE "P File 5".
RUN ShowTime(INPUT YES) NO-ERROR.

所以基本上你所拥有的是一个程序,ShowTime,它可以做两件事之一。运行这个过程的不相关过程可以通过传递一个参数来告诉它它想要什么。

就您的问题而言:有五个彼此不相关的程序(p1.p,p2.p ... p5.p),共享一个程序(ShowTime.p文件)。共享过程通过一个参数进行了修改,因此它只能对一个调用过程(带有 YES 参数的那个)产生影响,而不影响其他四个(带有 NO 参数的那个)。

但是如果你不能改变五个不相关的过程运行共享过程的方式,如果你只能改变共享过程,你就必须在参数以外的东西上做出决定。这个呢:

/* DoThing.p */
IF SOURCE-PROCEDURE:NAME = "p5.p" THEN
  MESSAGE "Do one thing".
ELSE
  MESSAGE "Do something else".

这将对五个过程中的一个做一件事,而对另外四个做另一件事。

【讨论】:

  • 是的,这就是我需要的,罗伯特。感谢您的帮助。
  • 每当我尝试“THIS-PROCEDURE:FILE-NAME”来显示我正在使用的当前 .p 文件时,我总是得到一个 .ped 文件。我想知道什么是 .ped 文件以及显示文件名的方法,即我的程序中 .p 文件的名称。
  • 当您直接从源代码运行程序时,Progress 会将其编译到一个临时文件中并运行该临时文件。 THIS-PROCEDURE:FILE-NAME 将返回临时文件的名称,而不是源代码文件的名称。但是,如果您将程序作为编译后的代码运行,您应该得到正确的文件名。如果我在过程编辑器中打开了一个名为 app.p 的程序,我会在运行它时得到“c:\temp\p78104_app.cmp”。但是如果我执行“RUN 'app.p'”。从过程编辑器,它运行编译的文件,所以 THIS-PROCEDURE:FILE-NAME 给我“C:\MyProgs\app.p”。
猜你喜欢
  • 1970-01-01
  • 2021-02-20
  • 1970-01-01
  • 2013-11-02
  • 1970-01-01
  • 1970-01-01
  • 2014-11-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多