Итак, у вас действительно есть две проблемы:
- Как получить список элементов управления (вы не спрашиваете, но на основе фрагмента кода, вы делаете)
- Как начать с WindowObject и изменить атрибут, связанный с потомком
Список элементов управления
У вас есть неявная ссылка намассив Control окна, который является хорошим первым шагом, но может пренебречь встроенными массивами Control в таких объектах, как вкладки и объекты-объекты.Функция, подобная следующей ( предупреждение: не проверено, только для иллюстрации ) будет выполнять все ваши элементы управления и обрабатывать случаи, такие как вкладки во вкладках.
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
Casting
Следующая проблема заключается в том, как получить доступ или манипулировать атрибутом объекта, когда компилятор не распознает принадлежность этого атрибута к типу этого объекта.Решение приведено к типу, где компилятор распознает связь атрибутов.Вы видели приведение в приведенном выше примере:
userobject luo_UserObject
...
luo_UserObject = awo_Input[ll_Input]
...luo_UserObject.Control...
Компилятор не распознал бы связь между WindowObject и массивом Control, на который я пытался ссылаться, поэтому я преобразовал WindowObject в UserObject, назначивWindowObject для переменной типа UserObject.После этого я могу ссылаться на массив Control через эту переменную.
Вы будете делать что-то похожее на мое, вероятно, внутри цикла, выполняя CHOOSE CASE TypeOf (), затем внутри каждого CASE приведение к определенной переменной, соответствующей типу, и манипулирование там атрибутом.
Полагаю, вы надеялись, что есть вариант назначения в одну строку, но его нет в PowerScript.(Если бы это была функция, которую вы вызывали для каждого, вы могли бы использовать ключевое слово DYNAMIC, вызывающее функцию в WindowObject, но вы должны были бы убедиться, что эта функция была там до того, как вы ее вызвали.) Я полагаю есть способ сделать это напрямую с PBNI, но я не могу вам с этим помочь, и я сильно подозреваю, что это гораздо больше усилий, чем стоит.
Удачи,
Терри.