Форум программистов, компьютерный форум, киберфорум
Microsoft Access
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.88/34: Рейтинг темы: голосов - 34, средняя оценка - 4.88
 Аватар для capup
5 / 5 / 0
Регистрация: 29.06.2011
Сообщений: 78

Перебор элементов управления в цикле

08.07.2014, 14:28. Показов 7574. Ответов 10
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день!
Подскажите каким образом перебрать поля на форме на предмет заполнения
и формирования фильтра.
У меня настраиваемый фильтр по 12 критериям, которые заполняются в полях (Edit).
Хочу сформировать строку для фильтра типа

Visual Basic
1
2
3
4
FilterStr =F0.text & AND1  & F1.text & AND2 & ... & AND11 & F12
Me.SearchLine.Value = FilterStr
Me.Filter = FilterStr
Me.FilterOn = True
Штука в том, что нужно формировать переменные AND1=" AND " или AND1="".
Поэтому решил в цикле ... а то много строк получается.
Заранее благодарен за помощь.
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
08.07.2014, 14:28
Ответы с готовыми решениями:

Перебор названий элементов в цикле
Допустим, есть массив A из десяти элементов string и есть десять элементов label, названные label1, label2, label3, ..., label10. Можно...

Перебор элементов управления на форме
Нужно подобрать элементы (button, label), чтото вроде этого: foreach (int i in Label) { MessageBox.Show(label.Text); }

Как происходит перебор элементов в цикле for?
Доброго времени суток, недавно столкнулся с интересной ситуацией при изменении 0-вого элемента списка он не записывается в текстовый файл....

10
4089 / 1469 / 401
Регистрация: 07.08.2013
Сообщений: 3,670
08.07.2014, 16:37
типа как вы предлагаете - не получится
Цитата Сообщение от capup Посмотреть сообщение
F0.text & AND1 *& F1.text & AND2 & ... & AND11 & F12
свойству filter нужно что-то типа [имя поля1]=значение 1 and [имя поля2]=значение 2 и т.д.
можно попробывать так
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
dim FilterStr$
dim a(12) as string
a(1)="[поле1]="
a(2)="[поле2]="
.....
a(12)="[поле12]="
FilterStr=""
for i=0 to 12
if  nz(me("F"& i),"")<>"" then
    if FilterStr="" then
      FilterStr=a(i) & me("F" & i)
    else
      FilterStr=FilterStr & " and " & a(i) & me("F" & i)
    end if
end if
next i
0
 Аватар для capup
5 / 5 / 0
Регистрация: 29.06.2011
Сообщений: 78
08.07.2014, 17:15  [ТС]
Да, конечно, предполагается, что
Visual Basic
1
F1=Me.Edit1.Text & "="
Код хороший, но как на счет автоматизации верхней части присвоения, именно обход всех элементов управления.
Возможно все сделать в одном цикле?
Может использовать какое- Свойство типа Tag для элемента управления.
Я знаю в С++Builder такое есть.

Есть еще маленькая проблемка, если будут пустые некоторые поля,
как сформируется фильтр (см. стр.10).

У меня в ручном режиме сейчас так пока для 3-х критериев:

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
Private Sub Search_BTN_Click()
 
Dim F0, F1, F2,  AND1, AND2 As String
 
If Me.Fam.Value <> "" Then F0 = "Family='" & Me.Fam.Value & "'"
If Me.Nam.Value <> "" Then F1 = "NameSPA='" & Me.Nam.Value & "'"
If Me.Com.Value <> "" Then F2 = "Complectation='" & Me.Com.Value & "'"
 
If F1 <> "" And F0 <> "" Then AND1 = " AND "
If F2 <> "" And (F1 <> "" Or F0 <> "") Then AND2 = " AND "     ' каждый раз нарастает как снежный ком!!!!
 
FilterStr = F0 & AND1 & F1 & AND2 & F2 
Me.SearchLine.Value = FilterStr
Me.Filter = FilterStr
Me.FilterOn = True
 
End Sub
Спасибо.
0
1181 / 632 / 39
Регистрация: 30.05.2010
Сообщений: 715
08.07.2014, 20:54
Лучший ответ Сообщение было отмечено capup как решение

Решение

Здравствуйте capup.
Если имена контролов (полей ввода формы) и имена полей набора данных поместить в равно-размерные массивы
конструкция сборки строки фильтра, не зависимо от количества полей, может быть подобной:
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
Dim vA(), vB(), i%, s$, b As Boolean
vA = Array("Fam", "Nam", "Com")
vB = Array("Family", "NameSPA", "Complectation")
For i = LBound(vA) To UBound(vA)
    If Len(Controls(vA(i)) & "") > 0 Then
        s = s + " and " + vB(i) + "='" + Controls(vA(i)) + "'"
    End If
Next
If Len(s) Then s = Mid(s, 6): b = True
Me.SearchLine = s
Me.Filter = s
Me.FilterOn = b
Евгений.
1
4089 / 1469 / 401
Регистрация: 07.08.2013
Сообщений: 3,670
09.07.2014, 10:21
capup,
а зачем вам обходить все контролы формы
вы знаете имена полей по которым надо пробежать причем тут надписи кнопки и другие контролы?
ну если конечно это так принципиально
то цикл для обхода ВСЕХ контролов формы будет такой
Visual Basic
1
2
3
4
dim ictrl as control
for each ictrl in forms![имя формы].controls
msgbox ictrl.name
next
но поверьте - Вам это не надо
гораздо проще создать массив с именами нужных контролов и другой нужной инфой
и дергать в нужный момент нужную информацию
(вам предложили для реализации 2 варианта)
2
 Аватар для capup
5 / 5 / 0
Регистрация: 29.06.2011
Сообщений: 78
09.07.2014, 10:50  [ТС]
Да, спасибо, snipe!
Я думал, что есть возможность ограничить пробежку по всем элементам, как я уже говорил свойством типа Tag (ярлычок для элементов управления). Кстати говоря есть такое свойство в VBA?
Огромное спасибо за код!
0
4089 / 1469 / 401
Регистрация: 07.08.2013
Сообщений: 3,670
09.07.2014, 10:50
и еще
смотрите что вы пытаетесь сделать
есть набор неких переменных
если поле1 заполнено то переменной1 присваивается значение если нет то не присваивается
и так 12 раз
потом определяется нужно ставить and или не нужно
вопрос - где цикл?
(так конечно можно сделать - но не продуктивно)

в предложенных вам вариантах
производится обход нужных контролов(еще раз повторюсь не всех а именно нужных) и собирается строчка фильтра т.е. сначала если строчка фильтра пустая и найденное первое не пустое поле то вносится инфа без and
в последующих случаях с and

есть конечно еще более хитрый вариант
выглядеть он будет так (покажу для 3 полей)
Visual Basic
1
FilterStr =mid(" and [поле1]="+nz(me.поле1,null)+" and [поле2]="+nz(me.поле2,null)+" and [поле1]="+nz(me.поле1,null)+",6)
0
 Аватар для capup
5 / 5 / 0
Регистрация: 29.06.2011
Сообщений: 78
09.07.2014, 10:54  [ТС]
Teslenko_EA, Ваш код очень красивый и умный!
Не знаю что там проценты и доллары делают, но код работает и удоборасширяем!
Спасибо за оперативность!
0
4089 / 1469 / 401
Регистрация: 07.08.2013
Сообщений: 3,670
09.07.2014, 11:05
проценты и доллары - это тип переменных
integer и string соответственно
0
 Аватар для capup
5 / 5 / 0
Регистрация: 29.06.2011
Сообщений: 78
09.07.2014, 11:24  [ТС]
snipe, да, бомба!
Спасибо! Четно не знаю все способы хороши!
0
58 / 1 / 1
Регистрация: 12.01.2015
Сообщений: 10
06.09.2017, 23:09
А я так ещё делал, в названия контролов добавил - П59
Visual Basic
1
2
3
4
5
6
7
8
9
Dim ictrl As Control
For Each ictrl In Forms![Название формы].Controls
If InStr(1, ictrl.Name, "П59", vbTextCompare) <> 0 Or IsNull(InStr(1, ictrl.Name, "П59", vbTextCompare)) Then
If Not IsNull(ictrl) Then
'MsgBox ictrl.Name
MsgBox ictrl ' или показывает значение поля если оно заполнено
End If
End If
Next
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
06.09.2017, 23:09
Помогаю со студенческими работами здесь

Перебор элементов поимённо в цикле с помощью итератора
вопрос: на форме есть десять элементов: txtBox1 txtBox2 txtBox3 ... txtBox10 можно ли к ним обращаться в цикле?

Обновление формы при изменении в цикле свойств элементов управления
Есть например такой код: for ( int i = 1; i &lt; 100; i++ ) { textBox1.Text = i.ToString(); ... }Видимое на форме изменение...

Перебор в цикле
Есть такой код Form2.ADOQuery1.SQL.Text:='select * from 7DTD where STEAM='+QuotedStr(STEAMID); Form2.ADOQuery1.Open; steamdb2:=...

Перебор ячеек в цикле
Доброго времени суток. нужна помощь) каким образом я могу в цикле задать ячейку чтобы она с каждым циклом бралась следующая. Пробовал по...

Перебор TextBox в цикле
Есть форма в VS2012. Сделанная для языка C++. На ней много textBox. Необходимо в цикле, меняя идентификатор textBox, заполнить их данными....


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
SDL3 для Web (WebAssembly): Работа со звуком через SDL3_mixer
8Observer8 08.02.2026
Содержание блога Пошагово создадим проект для загрузки звукового файла и воспроизведения звука с помощью библиотеки SDL3_mixer. Звук будет воспроизводиться по клику мышки по холсту на Desktop и по. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru