2014-02-08 1 views
1

У меня возникли проблемы с маркировкой поля (ов) на кадре. Количество полей и требуемые метки определяются во время выполнения.Прогресс 4GL: маркировка поля из переменной

требуемых этикеток сохраняются в массив символов:

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. 

У меня есть googled, но единственное появление выглядит несколько иначе, и я не уверен, что solu применимо. http://www.mofeel.net/258-comp-databases-progress/5295a6889.aspx

Я предполагаю, что, будучи в состоянии ссылаться на элементы ш-indarray [], как литералы бы решить эту проблему, как я мог бы просто сделать:

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

есть ли способ ссылки на элементы ш -indarray [] как литералы, которых мне не хватает?

Спасибо за ваше время.

ответ

0

В сообщении об ошибке говорится, что вам нужно использовать константу в массиве вместо переменной. Это означает, что вам нужно сделать саз, чтобы получить функциональность, которую вы ищешь - как так:

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. 

Причина постоянного элемент массива компилятор не может определить, какие поля элемента массива соответствует тому, когда вы даете ему переменное обозначение.

+0

Привет Тим, спасибо за ответ. Я добавил код, предложенный непосредственно под «формой w-sstrings [i] с фреймом f1». line, но получите ошибку «не удалось найти w-sstrings в фрейме f1» при компиляции. Я попытаюсь понять это, но если у вас есть предложения, я был бы благодарен. Еще раз спасибо – tom01

+0

PSC смешно относительно полей фреймов с привязкой к объекту - конструкция выше в одну сторону, другая - FRAME имя-кадр имя-вид: метка Попробуйте это и посмотрите, что произойдет. –

+0

Я думаю, что я недопонимаю синтаксис, пытаясь: "frame f1 w-array [1]: label =" test "." дает мне синтаксическую ошибку. – tom01

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. 
+0

Привет, Дженсен, спасибо за ответ, я протестировал ваш код, и он работает для вашего примера, однако в моем случае я не знаю, сколько полей мне нужно в кадре до выполнения. Я попытался установить размер, используя «присваивать степень (cField) = 2» (пример теста), но он падает с «Недопустимое использование неопределенных экстентов. Невозможно передать без подписки на фреймы». Чтобы решить эту проблему, вместо отображения cField i зацикливается вокруг оператора отображения для отображения cField [счетной переменной], но теперь в кадре отображается только первый элемент cField. Вы знаете, как сделать эту работу для неизвестного размера массива. – tom01

+0

Подумайте о том, чтобы вместо этого использовать ярлыки в таблице temp, а не в массиве. Это облегчит вашу жизнь. – Jensd