如果可以使用循环和字符串在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 :(得分:1)
您的描述缺少一些术语精度。
如果你真的想在powerscript子程序或函数中动态创建新的变量作为"变量"这只是不可能。
如果您想要在窗口中创建一些新的控件 statictext或textedit对象,或者使用visualrobject ,这是可能的:
static text
create
window
或视觉userobject
- 尽管使用win32api graphicobject
函数可以使用SetParent
OpenUserObject()
Control[]
方法。请注意,您不能简单地将其直接添加到父Control[]
数组。//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
数组上循环以下是一个例子:
//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)
值访问的例子:
"text"+2
正如您所看到的,一个实用性问题是您无法通过构造控件的名称来引用这些控件,而不是edits[]
,而是必须访问我的.tag
数组或循环访问控件并测试其{{1}}属性,如果您将其设置为特定的属性。
答案 1 :(得分:0)
我不认为这是可能的。解决方法可能是一个阵列。
溴。的Gabor
答案 2 :(得分:0)
我会看到两种方法,但它们并不像您希望的那样容易:
第一种方法是通过控制数组(在窗口,选项卡和用户对象上)。我创建了一个将控件名称作为字符串的函数,然后是另一个重载了相同函数并获取控件名称和windowobject数组的函数。仅字符串方法只调用字符串/数组方法,传递字符串并添加window.Control作为第二个参数。字符串/数组方法将遍历数组,并为每个元素获取ClassDefinition。从中拉出名称,并按照您希望它与字符串参数匹配的方式将其解析(例如,对于w_test`tab_first`tabpage_first`cb_here,您希望cb_here匹配,还是tab_first`tabpage_first`cb_here?)。适当处理比赛。当您找到类型制表符或用户对象的控件时,使用该对象中的Control数组再次调用字符串/数组函数;适当处理成功/失败的回报。
您所描述的内容非常适合DataWindows及其Describe()和Modify()函数。由于您只将这些函数传递给一个字符串,因此您不仅可以构建控件名称,还可以构建它们设置为构建任何字符串的值。实际上,您可以一起构建多个Modify()字符串(由空格分隔)并对Modify()进行一次调用;这不仅更快,而且减少了窗口闪烁和可见活动。
不要陷入这样的陷阱:由于您的数据不是来自数据库,因此您无法使用DataWindow。创建一个外部DataWindow,只需在构造函数事件期间插入一行就可以使用它。
正如您可能猜到的那样,我非常支持DataWindow方法。它不仅会表现更好,而且当你想要继续并标记更多的控件类型而不仅仅是静态文本时,它将提供更大的灵活性。 (即使使用一种控件类型,你也必须进行一些类型转换,但是如果你想进入倍数,你需要启动一个选择案例来处理你的所有类型。)
祝你好运,特里
答案 3 :(得分:0)
您无法在脚本中创建变量名称,因为必须先声明变量才能使用它们。使用PBNI,可以按照您描述的方式生成名称,然后获取对已存在的该名称的变量的引用,但我认为这不是您想要的。如果要跟踪控件的其他属性,只需继承新的用户对象(sle,mle等)并添加所需的属性。然后,您可以将用户对象放在窗口上并使用属性。另一种方法是使用控件的Tag属性。它包含一个字符串,您可以将任何内容放入其中.PFC使用此技术。 Terry的DataWindow解决方案是存储任意数据的好方法。
答案 4 :(得分:0)
是的,并且多种方式可以给猫皮肤。
听起来你有几个属性所以我会使用一组自定义非可视用户对象或一组结构。否则,您可能会使用.NET框架中的某些内容,如字典对象或类似内容,或使用外部数据源的datawidnow,您可以将列名称引用为col + ll_index.ToString()。
SIMPLE示例:
使用以下实例变量创建自定义NVO,并为每个变量添加getter / setter函数,将其命名为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
也许我过于简单化,如果是这样,让我知道,如果有遗嘱总有办法。 ;)