Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Последние темы форума

Показать новые сообщения »

Почтовая рассылка

Подписчиков: 6457
Последний выпуск: 19.06.2015

Как обработать 22 TextBox'а в цикле?

77K
09 августа 2013 года
EsEr
20 / / 17.02.2013
Имеются 22 textbox связанные с 6 checkbox и 16 combobox, после заполнения нужно передать значения TextBox'ов и связанных с ними ComboBox в соответствующие свойства объектов. Свойства Index нет....
есть код, где TBx(i) и CBx(i) массивы объектов TextBox и ComboBox, код рабочий конечно, но для его работы потребовалось построчное присваивание вида -
set CBx(1)=ComboBox1.
Собственно сам код:

Код:
For i = 1 To 22
lenst = Len(TBx(i).Value)
If lenst <> 0 Then
                ii = ii + 1
                fullsostavprod(2, i) = Val(TBx(i).Value)
                If i >= 17 Then
                        fullsostavprod(1, i) = "Крем№" + Str(i - 16)
                    Else
                    fullsostavprod(1, i) = CBx(i).Text
                End If
End If
Next i
85K
10 августа 2013 года
Алексей Иевенко
16 / / 06.08.2013
Извините, ошибся... Не ControlCollection, а Controls... Он как раз с индексатором... Пример приведу на C# ... Тут два списка типизированных. Первый список для объектов типа TextBox, а второй для объектов типа ComboBox. У созданной формы есть Controls (коллекция содержащая все добавленные в форму контролы). В цикле выбираем все контролы... Если тип контрола TextBox, то добавляем в список с соответствующими объектами, если же тип контрола ComboBox, тогда добавляем в список с объектами типа Combobox....


Код:
List<TextBox> t = new List<TextBox>();
 List<ComboBox> c = new List<ComboBox>();

 for (int i = 0; i < Controls.Count; i++)
    {
             if (Controls[i] is TextBox)
          {
                    t.Add(Controls[i] as TextBox);
          }
             else if(Controls[i] is ComboBox)
          {

                    c.Add(Controls[i] as ComboBox);
          }
     }
85K
09 августа 2013 года
Алексей Иевенко
16 / / 06.08.2013
Если я правильно понял вопрос..., у каждой формы есть массив контролов, выраженный коллекцией ControlCollection... При обработке коллекции придется выяснять тип i-го элемента коллекции: textbox или же combobox... , а далее уже заносить требуемые элементы в ваши свойства....
77K
10 августа 2013 года
EsEr
20 / / 17.02.2013
Если я правильно понял вопрос..., у каждой формы есть массив контролов, выраженный коллекцией ControlCollection... При обработке коллекции придется выяснять тип i-го элемента коллекции: textbox или же combobox... , а далее уже заносить требуемые элементы в ваши свойства....


То есть индексация TextBox имеется, но общая для всех контролов формы ? Если не трудно, приведите пример такой индексации, в книгах которые у меня есть подобного не нашел(имеется только вариант кода с копированием объекта в переменные, как я и решил свою задачу).

77K
11 августа 2013 года
EsEr
20 / / 17.02.2013
Благодарю за помощь. Получается что способ с Controls просто занимает меньше места в коде, все равно ведь приходится использовать массивы, только в вашем случае хранящие не сами объекты, а их индексы.
451
11 августа 2013 года
QWERYTY
595 / / 25.03.2012
Ну можно сразу выполнять работу и ничего не хранить(если скорость программы не сильно критична).
Например писал вот такие функции для выделения и снятия выделения с 24-х чекбоксов:
Код на Delphi, не знаю на сколько будет вам полезен

Код:
procedure AllCheckBoxesChecked();
var
I: BYTE;
begin
   for I := 1 to 24 do (Form1.FindComponent(Format('CheckBox%d', [I])) as TCheckBox).Checked := TRUE;
end;



procedure AllCheckBoxesUnChecked();
var
I: BYTE;
begin
   for I := 1 to 24 do (Form1.FindComponent(Format('CheckBox%d', [I])) as TCheckBox).Checked := FALSE;
end;
Просто тут не перебор всех контролов, а поиск конкретных
85K
11 августа 2013 года
Алексей Иевенко
16 / / 06.08.2013
Цитата: EsEr
Благодарю за помощь. Получается что способ с Controls просто занимает меньше места в коде, все равно ведь приходится использовать массивы, только в вашем случае хранящие не сами объекты, а их индексы.



В данном случае, я просто привел пример обработки в цикле контролов с их разделением по "листам", я не решал конкретно вашу задачу. Ведь в любом случае прежде чем вы сможете обрабатывать контролы, они должны будут оказаться у вас на форме. Их добавление вы осуществляете хоть программно, хоть при помощи конструктора среды программирования — это не важно.... Важно то, что они в любом случае оказываются в коллекции Controls, через которую вы можете получить к ним доступ, зная тип контрола.... Мой пример — это пример такого доступа и разделения, а для решения вашей проблемы можно обойтись и без списков, находя требуемый контрол, по заданным заранее свойствам... Вот...

77K
12 августа 2013 года
EsEr
20 / / 17.02.2013
Алексей, QWERYTY, я вас понял. О языках С# и Delphi имею общее представление. Решение с коллекцией Controls как я сказал уже более короткое и удобочитаемое.
Могу просто уточнить задачу:
после заполнения всех ТекстБоксов, ЧекБоксов и Комбобоксов необходима проверка на суммарную правильность заполнения, а также передача полей ЧекБоксов и соответствующим им ТекстБоксов в массив предварительной обработки, также и с Комбобоксами и соответствующими им ТекстБоксами. При неправильности суммарного заполнения, нужно указать пользователю где он ошибся, при этом возможны и несколько ошибок. Работать в таком случае через индексацию самих контролов было б гораздо проще и удобнее, я решил(не до конца еще, как видно из кода) эту задачу передачей контролов в переменные(массивы объектов), Алексей показал как можно решаются подобные задачи через коллекцию Controls. Код QWERYTY полезен, только, насколько я понял (Form1.FindComponent(Format('CheckBox%d', )) as TCheckBox).Checked- в VBA не позволяется так делать.
77K
12 августа 2013 года
EsEr
20 / / 17.02.2013
благодаря вашим подсказкам усовершенствовал код который до этого тоже выполнялся на каждый СomboBox своим циклом :) :

Код:
Private Sub fillCBx()
Dim i1 As Integer, i2 As Integer

For i = 10 To 26
If necifra Then
            i1 = 151
            i2 = Ингридиенты.Count
            necifra = False
           Else
            i1 = 1
            i2 = 150
            necifra = True
End If
If Me.Controls.Item(i).name = ("ComboBox" + CStr(i - 9)) Then
                 Me.Controls.Item(i).AddItem "Нет"
             For ii = i1 To i2
                 Me.Controls.Item(i).AddItem Ингридиенты(ii).Имя
             Next ii
                Me.Controls.Item(i).ListIndex = 0
 End If
Next i
End Sub

Знаете кого-то, кто может ответить? Поделитесь с ним ссылкой.

Ваш ответ

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог