Итак, вы на самом деле есть два вопроса:
- Как получить список элементов управления (вы не просите, но на основе фрагмента кода, вы делаете)
- Как начать с WindowObject и изменить п атрибут, связанный с потомком
Списком управления
Вы получили неявную ссылку на массив управления окном, который является хорошим первым шагом, но можно пренебречь встроенные массивы управления в объекты, такие как вкладки и пользовательские объекты. Функция, подобная следующей (предупреждение: непроверенная, только для иллюстрации), будет проходить через все ваши элементы управления и обрабатывать такие случаи, как вкладки в пределах вкладок.
function of_getcontrols (windowobject awo_input[], ref windowobject awo_output[]) returns integer
long ll_Input, ll_InputCount, ll_OutputCount, ll_Sub, ll_SubCount
window lw_Control
userobject luo_UserObject
tab ltb_Tab
windowobject lwo_Empty[], lwo_Sub[]
awo_Output = lwo_Empty
ll_InputCount = UpperBound (awo_Input)
FOR ll_Input = 1 TO ll_InputCount
ll_OutputCount ++
awo_Output[ll_OutputCount] = awo_Input[ll_Input]
// look for nested control arrays
CHOOSE CASE awo_Input[ll_Input].TypeOf()
CASE UserObject!
luo_UserObject = awo_Input[ll_Input]
ll_SubCount = of_GetControls (luo_UserObject.Control, lwo_Sub)
FOR ll_Sub = 1 TO ll_SubCount
ll_OutputCount ++
awo_Output[ll_OutputCount] = lwo_Sub[ll_Sub]
NEXT
CASE Tab!
ltb_Tab = awo_Input[ll_Input]
ll_SubCount = of_GetControls (ltb_Tab.Control, lwo_Sub)
FOR ll_Sub = 1 TO ll_SubCount
ll_OutputCount ++
awo_Output[ll_OutputCount] = lwo_Sub[ll_Sub]
NEXT
END CHOOSE
NEXT
RETURN ll_OutputCount
Кастинг
Следующий вопрос заключается в том, чтобы получить доступ или манипулировать атрибут объекта, где компилятор не признает право собственности этого атрибута к типу этого объекта. Решение переходит к типу, в котором компилятор распознает ассоциацию атрибутов. Вы видели, литье в приведенном выше примере:
userobject luo_UserObject
...
luo_UserObject = awo_Input[ll_Input]
...luo_UserObject.Control...
Компилятор не узнал бы ассоциацию между WindowObject и матрицей управления я пытался ссылаться, так что я бросил WindowObject к UserObject, назначая WindowObject к переменная типа UserObject. После этого я могу ссылаться на массив управления через эту переменную.
Вы будете делать что-то похожее на мое, возможно, внутри цикла, выполняющего CHOOSE CASE TypeOf(), а затем внутри каждого каста CASE с определенной переменной, соответствующей типу и управляющей атрибутом.
Я предполагаю, что вы надеялись, что существует опция однострочного назначения, но в PowerScript нет. (Если бы это была функция, которую вы вызывали по каждому из них, вы могли бы использовать ключевое слово DYNAMIC, вызывающее функцию в WindowObject, но вы несете ответственность за то, чтобы функция была там до того, как вы ее вызвали.) I верю, есть способ напрямую сделать это с PBNI, но я не могу с этим поделать, и я сильно подозреваю, что это гораздо больше усилий, чем того стоит.
Удача,
Терри.
Паштет, Терри ответил на это довольно красноречиво. Сверление по иерархии объектов несколько аналогично внесению изменений в DOM на веб-странице, но без фантастической структуры, такой как JQuery, чтобы упростить работу. –