SomeCallMeDave 发表于 2007-11-12 14:54:00

使用数组循环遍历控件

嘿,伙计们,
我对这一点很失望:
我相信一定有办法做到这一点;
通过这个项目,我将拥有app。每种控制类型140个。
我尝试使用数组进行某种循环,而不是必须单独列出每一行。
我知道下面的代码不会工作,但希望它能显示我在代码中尝试做的事情
我尝试对“几个”标签和图像执行下面的操作
user form 1 . label name . caption = user form 2。Textbox.Value
用户表单1。Imagename.Picture = Userform2。CMBItem.Picture
Dim Ctrl as Control
Dim Labls(20) As Integer
Dim Tboxs(20) As Integer
Dim Imgs(20) As Integer
Dim Cmbs(20) As Integer
For Each Ctrl In Userform1.Controls
If TypeOf Ctrl Is Label Then
If TypeOf Ctrl Is Textbox Then
   If TypeOf Ctrl Is ImageThen
    If TypeOf Ctrl Is ComboboxThen
For Labls = 1 To 20
For Tboxs = 1 To 20
   For Imgs = 1 To 20
    For Cmbs = 1 To 20
   Userform1.LL(labelname & Labls)L.Caption = Userform2.TBItem(Textbox & Tboxs)L.Value
   Userform1.IML(Imagename & Imgs).Picture = Userform2.CMBItem(Comboboxs & Cmbs)L.Picture
    Next
   Next
Next
Next
End If
Next Ctrl
End Sub

谢谢
马克
**** Hidden Message *****

SomeCallMeDave 发表于 2007-11-12 15:48:10

我马上就看到了一些事情。 IF 没有其他任何 ID,因此,如果第一个是 true,则在第二个 if 上崩溃。 我会使用选择大小写,因为它可能更快。
其次,我不认为嵌套 For 循环会起作用,因为我认为按照目前的方式,你有 160,000 次可能的迭代

SomeCallMeDave 发表于 2007-11-12 15:54:13


是的,CM
谢谢你
,我只是把代码扔了上去,以获得一般的想法。
我同意,用案例陈述来处理这个问题肯定会更好,你是对的,我确实错过了最后的陈述。
但是,你有点明白我要去哪里了吗?而且,您认为可以做到吗?
否则,我正在查看该行代码约800次
,谢谢
马克

SomeCallMeDave 发表于 2007-11-12 16:05:05

这完全可以做到。只要把语法搞对就行了

SomeCallMeDave 发表于 2007-11-12 16:07:56

你有一张预期结果的图片来显示这一切在做什么吗?

SomeCallMeDave 发表于 2007-11-12 16:09:45


是的
查看您的电子邮件
非常感谢<标记

SomeCallMeDave 发表于 2007-11-12 17:40:05


CM
这里更好地代表了我试图做的事情
Mark
Sub PopLine()
Dim Ctrl As Control
Dim Labls(20) As Integer
Dim Tboxs(20) As Integer
Dim Imgs(20) As Integer
Dim Cmbs(20) As Integer
For Each Ctrl In Form1.Controls
If TypeOf Ctrl Is Label Then
If TypeOf Ctrl Is TextBox Then
   For Labls = 1 To 20
    For Tboxs = 1 To 20
   Form1.LL1L(Labls).Caption = Form2.TB01(Tboxs).Value
    Next Labls
   Next Tboxs
End If
End If
Next Ctrl
   
For Each Ctrl In Form1.Controls
If TypeOf Ctrl Is Image Then
If TypeOf Ctrl Is CommandButton Then
   For Imgs = 1 To 20
    For Cmbs = 1 To 20
   Form1.IML1_1(Imgs).Picture = Form2.CMBItem01L(Cmbs).Picture
    Next Imgs
   Next Cmbs
End If
End If
Next Ctrl
   
End Sub

我相信这是可行的;我需要将每组控件放在一起,就像我上面一样
再次感谢
马克

SomeCallMeDave 发表于 2007-11-12 21:30:02

我仍然认为,如果你看这个<br>和<pre>的话,它将不适用于b/cFor Each Ctrl In Form1.Controls
If TypeOf Ctrl Is Label Then
If TypeOf Ctrl Is TextBox Then
   For Labls = 1 To 20
    For Tboxs = 1 To 20
   Form1.LL1L(Labls).Caption = Form2.TB01(Tboxs).Value
    Next Labls
   Next Tboxs
End If
End If
Next Ctrl
假设您的第一个控件实际上是一个标签
它将第一个IF语句和evals传递为TRUE,因此Then部分是IF文本框。这是不是,所以假,结束如果,结束如果下一个控制。我不明白这是怎么回事,因为被评估的控件不能同时是标签和文本框。这有意义吗?

SomeCallMeDave 发表于 2007-11-12 22:23:34

马克,我同意杜赫所说的话。 我不是想成为一个屌丝,但试图理解你实际上想做什么真的让我的大脑受伤。 我想我或多或少明白你要做什么,但我可能错了。
Sub PopLine()
Dim Ctrl As Control
Dim intCnt As Integer
For Each Ctrl In Form1.Controls
Select Case typeof ctrl
    Case textbox
      for intcnt = 1 to 20 ' seems like you should be doing 0 to 19 to me as your index should be starting at 0 but I digress
         Form1.LL1L(IntCnt).Caption = Form2.TB01(intCnt).Value
       Next intCnt
    Case Label
       for intCnt 1 to 20
          'do your thing
      next intcnt
    Case thenextone
      'etc. ad infinitum
End Select
next ctrl

循环中的循环仍然是一件坏事,但我现在想不出该怎么办。 明天睡一觉后,我会努力做得更好。
FWIW,这样做
   For Labls = 1 To 20
    For Tboxs = 1 To 20
   Form1.LL1L(Labls).Caption = Form2.TB01(Tboxs).Value
    Next Labls
   Next Tboxs

将把Form1.LL1L(1)的值写在Form2.TB01(1-20)上,(2)将用该值覆盖它们,并且直到完成为止,Form2.TB01(1-20)都将具有与Form1.LL1L(20)相同的值
来循环它
   For Labls = 1 To 20
    For Tboxs = 1 To 20
   Form1.LL1L(Labls).Caption = Form2.TB01(Tboxs).Value
    Next Tboxs
   Next Labls
,但是由于它们将具有相同的值,因此没有理由运行两个循环。

SomeCallMeDave 发表于 2007-11-12 23:36:40

我也不确定我是否真的理解ML想要实现的目标。但这从来没有阻止过我。
我认为控件不能被Form1.LL1L(一些整数值)访问,因为名称是LL1L2作为字符串,并且控件在按名称调用时不会作为数组进行索引。(这有意义吗?)控件可以通过名称访问。Form.Controls集合的项目属性(控件(名称作为字符串))。您必须使用索引整数构建名称,例如
BaseName & indexInteger
我认为您必须获取两个表单的控件数组,然后假设该数组的索引从表单到下一个表单匹配。IOW一个表单上的第一个控件(无论是文本框还是命令按钮或您拥有的任何内容)与另一个表单上的第一个控件匹配。我认为这是一个很大的假设。
如果该假设有效,则此代码会将值从一个表单传输到另一个表单。
如果该假设无效,则必须对表单名称进行一些检查以确保匹配。这可能意味着从Form1中获取一个控件,确保它是所需的控件,然后循环遍历Form2上的所有控件,直到我们找到相应的名称,然后插入正确的数据。继续到Form1上的下一个控件,循环通过控件-2寻找它的匹配项等。
这些是一个困倦的人醉醺醺的胡言乱语,所以要自行承担风险。
页: [1] 2
查看完整版本: 使用数组循环遍历控件