如果可以使用循环和字符串在 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 并且我可以为它们赋值。如果有人成功请告诉我,提前谢谢
如果可以使用循环和字符串在 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 并且我可以为它们赋值。如果有人成功请告诉我,提前谢谢
您的描述缺乏一些术语精度。
如果您真的想动态地创建新变量作为“powerscript 子例程或函数中的变量”,这是不可能的。
相反,如果您想在窗口或可视用户对象中动态创建一些新控件statictext 或 textedit 对象,这是可能的:
static text
create
window
或视觉对象userobject
- 尽管 graphicobject
使用 win32apiSetParent
函数可以实现)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
,您必须访问 myedits[]
数组或循环通过控件并测试它们的.tag
属性,如果您将其设置为特定的东西。
我不认为这是可能的。解决方法可能是一个数组。
兄弟。加博尔
我会看到两种方法来做到这一点,但它们并不像您希望的那样容易:
第一种方法是通过控件数组(在窗口、选项卡和用户对象上)。我将创建一个将控件名称作为字符串的函数,然后创建另一个重载相同函数并获取控件名称和窗口对象数组的函数。纯字符串方法只会调用字符串/数组方法,传递字符串并添加 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,并在 Constructor 事件期间插入一行来简单地使用它。
正如您可能猜到的,我强烈支持 DataWindow 方法。它不仅会表现得更好,而且当您想要继续并标记更多控件类型时,它会提供更多的灵活性,而不仅仅是静态文本。(即使使用一种控件类型,您也必须进行一些类型转换,但如果您想进入多个,您需要启动一个 CHOOSE CASE 来处理您的所有类型。)
祝你好运,
特里
您不能在脚本中创建变量名,因为必须先声明变量才能使用它们。使用 PBNI,可以按照您描述的方式生成名称,然后获取对该名称的变量的引用,该变量已经存在,但我认为这不是您想要的。如果您想跟踪控件的其他属性,只需从任何对象(sle、mle 等)继承一个新的用户对象并添加您想要的属性。然后您可以将您的用户对象放在窗口上并使用属性。另一种方法是使用控件的 Tag 属性。它包含一个字符串,您可以将任何内容放入其中。PFC 使用这种技术。Terry 的 DataWindow 解决方案是存储任意数据的好方法。
是的,给猫剥皮的方法不止一种。
听起来你有几个属性,所以我会使用一组自定义非可视用户对象或一组结构。否则,您可能会使用 .NET 框架中的某些东西,例如字典对象或类似的东西,或者使用外部数据源的 datawidnow,您可以在其中将列名称为 col + ll_index.ToString()。
简单的例子:
使用以下实例变量制作自定义 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
如果让我知道,也许我过于简单化了,如果有意愿,总会有办法。;)