Progress 4GL:从变量标记字段

时间:2014-02-08 21:43:40

标签: progress-4gl

我在标记帧上的字段时遇到问题。字段数和所需标签在运行时确定。

所需的标签存储在char数组中:

w-indarray[]

我使用以下循环将所需字段添加到框架

do i = 1 to w-nooff:                               
form w-sstrings[i] with frame f1.     
w-sstrings[i]:label in frame f1 = w-indarray[i].
end.

但是我收到了一个错误:

Widget array-element requires constant subscript.

我用Google搜索,但唯一的情况看起来略有不同,我不确定该解决方案是否适用。 http://www.mofeel.net/258-comp-databases-progress/5295a6889.aspx

我假设能够引用w-indarray []的元素,因为文字可以像我一样解决这个问题:

form w-sstrings[i] label "abc" with frame f1. 

有没有办法引用w-indarray []的元素作为我缺少的文字?

感谢您的时间。

2 个答案:

答案 0 :(得分:1)

通过获取所有窗口小部件句柄并修改其标签,您可以在不使用范围的静态数字的情况下执行此操作。它可以工作,但是做一些真正应该更容易的事情是很多代码。

这样的事情:

DEFINE VARIABLE cLabel       AS CHARACTER   NO-UNDO EXTENT 10 INIT ["One","Two","three","Four","Five","Six","Seven","Eight","Nine","Ten"].
DEFINE VARIABLE cField       AS CHARACTER   NO-UNDO EXTENT 10.
DEFINE VARIABLE hFieldGroup  AS HANDLE      NO-UNDO.
DEFINE VARIABLE hFirstWidget AS HANDLE      NO-UNDO.
DEFINE VARIABLE iExtent      AS INTEGER     NO-UNDO.
DEFINE VARIABLE iLoop        AS INTEGER     NO-UNDO.

DEFINE FRAME f1 WITH SIDE-LABELS 1 COLUMN.

DISPLAY 
    cField
    WITH FRAME f1.
/* Static will be done like this
Commenting out this 
ASSIGN                                   
    cField[1]:LABEL  = cLabel[1]
    cField[2]:LABEL  = cLabel[2]
    cField[3]:LABEL  = cLabel[3]
    cField[4]:LABEL  = cLabel[4]
    cField[5]:LABEL  = cLabel[5]
    cField[6]:LABEL  = cLabel[6]
    cField[7]:LABEL  = cLabel[7]
    cField[8]:LABEL  = cLabel[8]
    cField[9]:LABEL  = cLabel[9]
    cField[10]:LABEL = cLabel[10].
 */


ASSIGN
    hFieldGroup  = FRAME f1:FIRST-CHILD
    hFirstWidget = hFieldGroup:FIRST-CHILD. 

/* Widget-loop. Could really be done prettier... */
REPEAT:
    iLoop = iLoop + 1.

    hFirstWidget =  hFirstWidget:NEXT-SIBLING NO-ERROR.

    IF hFirstwIDGET = ? THEN LEAVE.

    IF hFirstWidget:TYPE = "FILL-IN" THEN DO:
        iExtent = iExtent + 1.
        /* Set dynamic label */
        hFirstWidget:LABEL = cLabel[iExtent].
    END.
END.

答案 1 :(得分:0)

错误消息表明您需要在数组中使用常量而不是变量。这意味着您需要执行CASE语句来获取您正在寻找的功能 - 例如:

CASE i:
WHEN 1 THEN w-sstrings[1]:label in frame f1 = w-indarray[i].
WHEN 2 THEN w-sstrings[2]:label in frame f1 = w-indarray[i].
WHEN 3 THEN w-sstrings[3]:label in frame f1 = w-indarray[i].
WHEN 4 THEN w-sstrings[4]:label in frame f1 = w-indarray[i].
WHEN 5 THEN w-sstrings[5]:label in frame f1 = w-indarray[i].
END CASE.

常量数组元素的原因是编译器在给出变量指定时无法识别数组元素对应的字段。