Как передать объекты в качестве параметра для функции в энергетике - PullRequest
2 голосов
/ 05 ноября 2010

Я использую powerbuilder 9 .0.1 Build 7171 Я хочу написать обобщенный функция для обработки свойств объекта, таких как имя шрифта. Я хочу изменить шрифт кнопки объекта, идея списка я просто передам Имя окна или дескриптор окна и функция получат контрольный список, и если control.type - это список или кнопка или кнопка с изображением, изменит свой шрифт.

Я не хочу писать функцию windows для каждого окна. способ, которым я могу просто манипулировать свойствами windows

FOR n = 1 до UpperBound (Control []) IF Control [n] .TypeOf () = CommandButton! ИЛИ Control [n] .TypeOf () = PictureButton! THEN set_button_name (this.Control [п]) Конец, если СЛЕДУЮЩИЙ

В этом случае я должен жестко закодировать этот код в открытом событии каждого окна. чтобы вызвать это с помощью функции ()

1 Ответ

5 голосов
/ 05 ноября 2010

Итак, у вас действительно есть две проблемы:

  1. Как получить список элементов управления (вы не спрашиваете, но на основе фрагмента кода, вы делаете)
  2. Как начать с 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, но я не могу вам с этим помочь, и я сильно подозреваю, что это гораздо больше усилий, чем стоит.

Удачи,

Терри.

...