2010-11-05 2 views
2

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

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

ДЛЯ п = 1 к UpperBound (Control []) IF Control [п] .TypeOf() = CommandButton! ИЛИ Control [п] .TypeOf() = PictureButton! ТОГДА set_button_name (this.Control [п]) End, если СЛЕДУЮЩИЙ

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

ответ

5

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

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

Удача,

Терри.

+0

Паштет, Терри ответил на это довольно красноречиво. Сверление по иерархии объектов несколько аналогично внесению изменений в DOM на веб-странице, но без фантастической структуры, такой как JQuery, чтобы упростить работу. –

Смежные вопросы