2013-08-22 2 views
0

Мне интересно, можно ли сделать имя переменной в PowerBuilder с помощью цикла и строки. Например:Сделать имя переменной с помощью цикла и строки в PowerBuilder

long ll_go 
string lst_new 
for ll_go = 1 to 8 
    lst_new = "text" + ll_go 
    lst_new.tag = 5500 
next 

Таким образом, он должен дать мне переменные text1, text2 ..,, text8 и я смог бы присвоить значения для них.. Дайте мне знать, если кто-нибудь преуспел, заблаговременно

ответ

0

Не думаю, что это возможно. Обходной путь может быть массивом.

Br. Габор

+0

Это было бы довольно сложно. Потому что это может быть text1.tag, text1.visible, text1.enabled, хотя я мог бы определить массив двух измерений, но это сделало бы код еще более сложным. – user

+0

Я не понимаю, почему это сложнее. вы можете определить невизуальный пользовательский объект с необходимыми свойствами и массив из этого uo. – DARKinVADER

+0

Согласитесь, это было бы простым решением. Если вам нужно много свойств, тогда просто создайте NVO OR Structure, ant и настройте его как: я приведу пример в ответ ниже. –

0

Я вижу два пути, чтобы сделать это, но они не так легко, как кажется, что вы надеялись:

1. Массив управления

Первый метод должен был бы пройти через (на окнах, вкладках и пользовательских объектах). Я бы создал функцию, которая взяла имя элемента управления в виде строки, а затем другую, которая перегрузила ту же функцию и взяла имя управления и массив windowobject. Метод, основанный только на строках, просто вызовет метод string/array, передав строку и добавив window.Control как второй параметр. Метод string/array будет проходить через массив, а для каждого элемента - ClassDefinition. Вытяните имя и отделите его так, как вы хотите, чтобы он соответствовал параметру строки (например, для w_test`tab_first`tabpage_first`cb_here, вы хотите, чтобы cb_here соответствовала, или tab_first`tabpage_first`cb_here?). Поступайте с совпадениями по мере необходимости. Когда вы найдете элемент управления вкладкой типа или пользовательского объекта, вызовите функцию string/array снова с помощью массива Control из этого объекта; справиться с успехами/неудачами при необходимости.

2. DataWindow

Что вы описываете очень хорошо работает с DataWindows, и их описать() и Modify() функции. Поскольку вы передаете эти функции только строкой, вы можете создавать не только имена элементов управления, но и значения, которые они заданы, так как вы создадите любую строку. Фактически, вы можете создавать несколько строк Modify() вместе (разделенные пробелом) и делать один вызов Modify(); это не только быстрее, но и уменьшает мерцание окна и видимую активность.

Не попадайте в ловушку, думая, что, поскольку ваши данные не из базы данных, вы не можете использовать DataWindow. Создайте внешний DataWindow и просто используйте его с одной строкой, вставленной во время события Constructor.

Как вы могли догадаться, я бы сильно поддержал подход DataWindow. Мало того, что он будет работать лучше, но он будет обеспечивать гораздо большую гибкость, если вы захотите переместиться и пометить больше типов управления, чем просто статический текст. (Вы должны будете сделать некоторый тип отливку даже с одним типом управления, но если вы хотите получить в упаковке, вам нужно начать ВЫБРАТЬ СЛУЧАЙ обрабатывать все типы.)

Успехов,

Terry

0

Вы не можете создать имя переменной в скрипте, потому что переменные должны быть объявлены, прежде чем вы сможете их использовать. С PBNI можно создать имя так, как вы описываете, а затем получить ссылку на переменную этого имени, которая уже существует, но я не думаю, что это то, что вы хотите. Если вы хотите отслеживать дополнительные свойства для своих элементов управления, просто наследуйте новый объект пользователя от всего, что есть (sle, mle и т. Д.), И добавьте нужные свойства. Затем вы можете поместить свой пользовательский объект в окно и использовать его. Другой подход - использовать свойство тега элемента управления.Он содержит строку, в которую вы можете поместить все, что хотите. PFC использует эту технику. Решение Terry's DataWindow является хорошим подходом для хранения произвольных данных.

0

Да, и есть более одного пути, чтобы кошка кошка.

Похоже, что у вас есть несколько свойств, поэтому я бы использовал массив пользовательских не визуальных пользовательских объектов или массив структур. В противном случае вы, вероятно, могли бы использовать что-то из платформы .NET, например, словарный объект или что-то в этом роде, или datawidnow с использованием внешнего источника данных, где вы можете ссылаться на имена столбцов как col + ll_index.ToString().

SIMPLE Пример:

сделать пользовательские со следующими НВО переменных экземпляра, плюс геттер/сеттер функций для каждого, назовите его n_single_field

// add the properties and recommend getter and setter functions 
public string myTag 
public string myText 
public int myTabOrder 
... 

// To USE the NVO define an unbounded array 
n_single_field fields[] 

// to process the populated fields 
integer li_x, li_max_fields 

// loop through field 1 through max using array index for field number 
li_max_fields = upperbound(fields) 
for li_x = 1 to li_max_fields 
    fields[li_x].myTag = 'abc' 
    fields[li_x].myText = 'text for field number ' + li_x.ToString() 
    fields[li_x].myTabOrder = li_x * 10 
next 

Может быть, я упрощаю, если так, дайте мне знать, если есть это воля всегда есть путь. ;)

1

В вашем описании отсутствует точность терминов.

Если вы действительно хотите, чтобы динамически создавать новые переменные как «переменной в PowerScript подпрограммы или функции» это просто не представляется возможным.

Если вместо этого вы хотите создать динамически новые управления StaticText или TextEdit объектов в окне или визуального userobject это возможно:

  1. использовать локальную переменную типа нового объекта, необходимо создать, например static text
  2. сделать это живой объект (Instantiate) с create
  3. установить свойства объекта к тому, что вам нужно
  4. «прикрепить» новый объект своего родителя (либо window или визуальный userobject - хоть какой-graphicobject является возможно с использованием функции win32api SetParent) с помощью метода OpenUserObject(). Обратите внимание: вы не можете просто добавить его непосредственно в массив родительского Control[].
  5. вы также можете сохранить объект в собственном массиве для последующего удобства доступа к создаваемым объектам вместо зацикливания на Control[] массиве
  6. после того, как объект прикрепил его родитель, вы можете использовать локальную переменную, чтобы создать еще один

Вот пример:

//put this in a button clicked() event on a window 
//i_myedits is declared in instances variables as 
//SingleLineEdit i_myedits[] 
SingleLineEdit sle 
int i 
for i = 1 to 8 
    sle = create singlelineedit 
    sle.text = string(i) 
    sle.tag = "text_" + string(i) 
    sle.height = pixelstounits(20, ypixelstounits!) 
    sle.width = pixelstounits(100, xpixelstounits!) 
    parent.openuserobject(sle, pixelstounits(10, xpixelstounits!), pixelstounits(22 * i, ypixelstounits!)) 
    i_myedits[i] = sle //keep our own reference 
next 

Exemple доступа значений:

//put that in another button clicked() event 
SingleLineEdit sle 
int i 
string s_msg 

for i = 1 to upperbound(i_myedits[]) 
    sle = i_myedits[i] 
    if i > 1 then s_msg += "~r~n" 
    s_msg += "edit #" + string(i) + " (" + sle.tag + ") says '" + sle.text + "'" 
next 
messagebox("Edits values", s_msg) 

Result

Как вы можете видеть, одна проблемы практичности является то, что вы не можете ссылаться на эти элементы управления с помощью построения имени элемента управления, как "text"+2, вместо этого вы должны получить доступ к моему edits[] массива или цикла через элементы управления и проверить их .tag недвижимости если вы установите его на что-то конкретное.

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

  • Нет связанных вопросов^_^