Discussion:
in welcher Reihenfolge wird eine Control-Auflistung mit for each durchlaufen?
(zu alt für eine Antwort)
Helge Fechner
2007-09-15 17:38:47 UTC
Permalink
A2003, SP2

Hallo Gemeinde,


Hintergrund:

In einem Formular muß ich die controls durchlaufen und Werte zuweisen.
Die Controls sind jeweils mit _xx benannt, xx steht für eine Zahl von 01 -
50.
Beispiel:

t_01
abholung_01
R_beginn_01
R_Ende_01

t_02
usw.

Ich habe zwei Zähler, einmal i für die Datenfelder und clt_zaehler, um den
Index für die Controls zu bestimmen


i = 1
ctl_zaehler = 0
Me!form_close.SetFocus
For Each ctl In Me.Controls
If ctl.ControlType = acCommandButton Or ctl.ControlType =
acTextBox Then

If Right(ctl.Name, 2) = Format(CStr(i), "00") And
Left(ctl.Name, 1) = "t" Then
Me.Controls.Item(ctl_zaehler).Caption =
teppichnummer(i)
End If

If Right(ctl.Name, 2) = Format(CStr(i), "00") And
Left(ctl.Name, 2) = "ab" Then
Me.Controls.Item(ctl_zaehler).ControlSource =
auftragsdatum(i)
End If

If Right(ctl.Name, 2) = Format(CStr(i), "00") And
Left(ctl.Name, 3) = "R_b" Then
Me.Controls.Item(ctl_zaehler).ControlSource =
reinigungsbeginn(i)
End If

If Right(ctl.Name, 2) = Format(CStr(i), "00") And
Left(ctl.Name, 3) = "R_E" Then
Me.Controls.Item(ctl_zaehler).ControlSource =
reinigungsende(i)
i = i + 1
End If
End If
ctl_zaehler = ctl_zaehler + 1
Next ctl


die Reihenfolge ist durchlaufend vergeben (im Beispiel mit [x] angegeben,
somit müsste es eigentlich mit t_1 [0] beginnen dann abholung_01 [1] ,
R_beginn_01 [2] , R_Ende_01 [3] - soweit ist es ok.
Dann geht es aber nicht mit t_2 [4] weiter, sonder mit t_3 [8] . Und damit
kommt die gesamte Reihenfolge durcheinander.


Wenn die vergebene Reihenfolge nicht relevant ist, was kann ich dann tun?


mfg

Helge
Thomas Möller
2007-09-15 19:00:33 UTC
Permalink
Hallo Helge,
Post by Helge Fechner
In einem Formular muß ich die controls durchlaufen und Werte zuweisen.
Die Controls sind jeweils mit _xx benannt, xx steht für eine Zahl von
01 - 50.
t_01
abholung_01
R_beginn_01
R_Ende_01
die Reihenfolge ist durchlaufend vergeben (im Beispiel mit [x]
angegeben, somit müsste es eigentlich mit t_1 [0] beginnen dann
abholung_01 [1] , R_beginn_01 [2] , R_Ende_01 [3] - soweit ist es ok.
Dann geht es aber nicht mit t_2 [4] weiter, sonder mit t_3 [8] . Und
damit kommt die gesamte Reihenfolge durcheinander.
IMHO ist die Reihenfolge abhängig von der Reihenfolge, in der die
Steuerelemente auf das Formular eingefügt worden sind.
Post by Helge Fechner
Wenn die vergebene Reihenfolge nicht relevant ist, was kann ich dann tun?
Wahrscheinlich hilft Dir so etwas hier:
www.donkarl.com?FAQ6.5


HTH
--
Thomas

Homepage: www.Team-Moeller.de
Helge Fechner
2007-09-16 17:55:48 UTC
Permalink
Hi Thomas,

"Thomas Möller" schrieb
Post by Thomas Möller
IMHO ist die Reihenfolge abhängig von der Reihenfolge, in der die
Steuerelemente auf das Formular eingefügt worden sind.
Das wäre natürlich schlecht, insgesamt sind es über 200 Steuerelemente,
die habe ich natütlich mit C&P eingefügt und dann händisch benamst.
Post by Thomas Möller
Post by Helge Fechner
Wenn die vergebene Reihenfolge nicht relevant ist, was kann ich dann tun?
www.donkarl.com?FAQ6.5
Ok, das könnte helfen, kann ich aber erst morgen ausprobieren.



mfg

Helge
Michel Fouquet
2007-09-16 09:42:55 UTC
Permalink
Hallo,
Post by Helge Fechner
Ich habe zwei Zähler, einmal i für die Datenfelder und clt_zaehler, um
den Index für die Controls zu bestimmen
i = 1
ctl_zaehler = 0
Me!form_close.SetFocus
For Each ctl In Me.Controls
If ctl.ControlType = acCommandButton Or ctl.ControlType =
acTextBox Then
If Right(ctl.Name, 2) = Format(CStr(i), "00") And
Left(ctl.Name, 1) = "t" Then
Me.Controls.Item(ctl_zaehler).Caption = teppichnummer(i)
End If
If Right(ctl.Name, 2) = Format(CStr(i), "00") And
Left(ctl.Name, 2) = "ab" Then
Me.Controls.Item(ctl_zaehler).ControlSource =
auftragsdatum(i)
End If
If Right(ctl.Name, 2) = Format(CStr(i), "00") And
Left(ctl.Name, 3) = "R_b" Then
Me.Controls.Item(ctl_zaehler).ControlSource =
reinigungsbeginn(i)
End If
If Right(ctl.Name, 2) = Format(CStr(i), "00") And
Left(ctl.Name, 3) = "R_E" Then
Me.Controls.Item(ctl_zaehler).ControlSource =
reinigungsende(i)
i = i + 1
?????
Post by Helge Fechner
End If
Das Inkrementieren von i sollte vermutlich erst hier erfolgen, oder?
Post by Helge Fechner
End If
ctl_zaehler = ctl_zaehler + 1
Next ctl
die Reihenfolge ist durchlaufend vergeben (im Beispiel mit [x]
angegeben, somit müsste es eigentlich mit t_1 [0] beginnen dann
abholung_01 [1] , R_beginn_01 [2] , R_Ende_01 [3] - soweit ist es ok.
Dann geht es aber nicht mit t_2 [4] weiter, sonder mit t_3 [8] . Und
damit kommt die gesamte Reihenfolge durcheinander.
Das Inkrementieren von i an die richtige Stelle platzieren, würde ich
meinen.

mfg,
Michel
--
Informationen für Newbies (Neulinge) in den Access-Newsgroups
http://www.doerbandt.de/Access/Newbie.htm

FAQ: http://www.donkarl.com/AccessFAQ.htm
KnowHow.mdb: http://www.freeaccess.de/knowhow.asp
Helge Fechner
2007-09-16 17:34:05 UTC
Permalink
"Michel Fouquet" schrieb
Post by Michel Fouquet
Das Inkrementieren von i an die richtige Stelle platzieren, würde ich
meinen.
Hi Michel,

nee, das passt schon. Ich habe ja jeweils 4 Elemente mit _xx, deshalb soll
der Zähler i ja auch dann erst inkrementiert werden, wenn das vierte
Elemet mit _xx (beispielsweise _01) durchlaufen wurde. Deshalb ja auch
zwei Zähler.
Uwe Ricken
2007-09-16 13:35:41 UTC
Permalink
Hallo Helge,

die Controls werden in der Reihenfolge ihres TabIndexwertes
durchlaufen.
I. d. R. ist der Wert immer identisch mit der Reihenfolge der
Platzierung der Objekte auf dem Formular, kann aber in dem
Moment abweichen, wie Du die Tabfolge änderst.

HTH ;-)
--
Gruß, Uwe Ricken
MCP for SQL Server 2000 Database Implementation

db-Berater GmbH i. G. 64390 Erzhausen
http://www.db-berater.de
http://www.memberadmin.de
http://www.conferenceadmin.de
____________________________________________________
dbdev: http://www.dbdev.org
APP: http://www.AccessProfiPool.de
FAQ: http://www.donkarl.com/AccessFAQ.htm
Helge Fechner
2007-09-16 17:52:11 UTC
Permalink
"Uwe Ricken" schrieb
Post by Uwe Ricken
die Controls werden in der Reihenfolge ihres TabIndexwertes
durchlaufen.
I. d. R. ist der Wert immer identisch mit der Reihenfolge der
Platzierung der Objekte auf dem Formular, kann aber in dem
Moment abweichen, wie Du die Tabfolge änderst.
Hi Uwe,

Den Tabindex habe ich schon so geändert, wie die Controls durchlaufen
werden sollen, trotzdem werden Controls übersprungen.


mfg

Helge
Henry Habermacher
2007-09-17 02:19:38 UTC
Permalink
Hallo Uwe
Post by Uwe Ricken
die Controls werden in der Reihenfolge ihres TabIndexwertes
durchlaufen.
I. d. R. ist der Wert immer identisch mit der Reihenfolge der
Platzierung der Objekte auf dem Formular, kann aber in dem
Moment abweichen, wie Du die Tabfolge änderst.
Das mag an der Oberfläche so sein, nicht aber, wenn Du die
Controls-Collectioin in VBA durchgehst. Habe das gerade nochmals
ausgetestet. Das Ändern der Tab-Reiehnfolge hat keinen Einfluss auf die
Reihenfolge, wie die Controls in der Controls Collection drin aufgeführt
sind.

Ich vermute, die Reihenfolge ist die, wie die Controls bei der Erzeugung
hinzugefügt wurden und daher ziemlich willkürlich. Die Reihenfolge
entspricht, soweit ich gesehen habe, der Reihenfolge der Controls, wie sie
im Application.SaveAsText aufgeführt sind.

Die Controls-Collection lässt sich nicht sortieren. Wer diese Sortiert haben
will, wird wohl oder übel die ganze Controls Collection einlesen (z.B. in
einen Array) und dann dieses Array sortieren müssen. Eine Möglichkeit wäre,
den Namen der Controls in ein String Array einzulesen und dieses dann über
die Methode WizHook.SortStringArray (hidden) sortieren zu lassen.

Wenn's die Tab-Reihenfolge sein soll, dann geht's noch einfacher. Einfach
einen Array genügend gross anlegen und Control für Control an das Element
mit dem Tab-Index abfüllen und dannach das Array über einen Loop auslesen.
Das heisst, dass Du Dir damit eine eigene Controlls "Collection" erstellst,
die gemäss TabIndex sortiert ist.

Hier ein Beispiel:

Public Function debugControlsInTabOrder(frm As Form) As Long
Dim arrCtls() As Control
Dim ctl As Control
Dim I As Long
ReDim arrCtls(0 To 0)
On Error Resume Next
For Each ctl In frm.Controls
I = ctl.TabIndex
If Err = 0 Then
If ctl.TabIndex > UBound(arrCtls()) Then
ReDim Preserve arrCtls(0 To ctl.TabIndex)
End If
Set arrCtls(ctl.TabIndex) = ctl
Else
Err.Clear
End If
Next
For I = 0 To UBound(arrCtls)
Debug.Print arrCtls(I).Name
Next
debugControlsInTabOrder = I
End Function

Gruss
Henry
--
Microsoft MVP Office Access
Keine E-Mails auf Postings in NGs. Danke.
Access FAQ www.donkarl.com
Helge Fechner
2007-09-18 12:00:29 UTC
Permalink
"Henry Habermacher" schrieb
Post by Henry Habermacher
Ich vermute, die Reihenfolge ist die, wie die Controls bei der Erzeugung
hinzugefügt wurden und daher ziemlich willkürlich.
Jo, so ist es wohl, hab es auch noch mal getestet.
Naja, ich habe mir dann zwei Schleifen gebaut, eine äußere für die
notwendige Anzahl der Durchläufe, in der inneren wird mit for each jedes
control abkeplappert.

Vielleicht nicht sehr performant, aber es erfüllt seinen Zweck.

Vielen Dank für eure Hilfe.

mfg

Helge
Paul Rohorzka
2007-09-18 20:20:11 UTC
Permalink
Hallo Helge,
In welcher Reihenfolge wird eine Control-Auflistung mit for each durchlaufen?
nach meinen einstens durchgeführten Forschungen zu dem Thema bestimmt
die z-Reihenfolge die Position innerhalb der Controls-Collection.

Den Code verstehe ich ehrlich gesagt nicht so ganz. Erwartest du nicht
(als Anlass deines Postings), dass ctl und
Me.Controls.Item(ctl_zaehler) immer auf das selbe Steuerelement
verweisen? Falls nicht, bitte ich um Erklärung des Codes, ansonst
frage ich, warum du beide Varianten verwendest. Reicht für dein
Ansinnen nicht eine For-Schleife, in der du direkt die richtigen
Steuerelemente ansprichst?

Vielleicht kannst du noch ein paar weitere Worte zu deinem Code
verlieren. :)

LG,
Paul

Loading...