Цикл по однотипным компонентам формы

  • Автор темы Kassad
  • Дата начала
Статус
Закрыто для дальнейших ответов.
K

Kassad

#1
Поискал по форуму, но ответа не нашёл. Нужно организовать цикл по однотипным компонентам формы чтобы менять/проверять их параметры. Например узнать состояние 32 радио-баттон на форме. Не могу сообразить как такое сделать в цикле.
 
L
#2
Не знаю как реализовать конкретно, но подозреваю, что нужно создать массив-структуру, в которую поместить объекты, а потом обращиться к ним по индексу.

Народ! Кто знает? Откликнитесь! Мне тоже такая штука нужна будет скоро. :)
 
S

SNike

#4
В Delphi это можно сделать так:

Код:
 for I:= 0 to Form1.ControlCount-1 do
ShowMessage(Form1.Controls[i].ClassName);
Думаю что в С тоже такое есть.
Просто используем свойство формы ControlCount. А контролировать тот ли это тип контрола - дело прикладное. Например, можно вот так:

Код:
 for I:= 0 to Form1.ControlCount-1 do
if Form1.Controls[i].ClassNameIs('TButton')
then ShowMessage('Нашли кнопку');
Для сравнения так же можно использовать такие методы контролов как Class, ClassType.
Просто стоит поискать их аналоги в на языке С, думаю они есть
 
L
#5
Хм. Искать компоненты на своей же форме, а потом по Name разбираться то я нашёл или нет - это интересный способ, но я бы предпочёл способ, когда можно самому из нужных компонентов создать массив указателей на компоненты тех же радио-баттон и обращаться к ним типа:
Код:
if (myRadioButtons[1]->Checked) 
if (myRadioButtons[2]->Checked) 
if (myRadioButtons[3]->Checked)
Вот только что это за myRadioButtons и как его описать?
 
04.09.2006
2 566
3
#6
В Билдере есть функция FindComponent, которая решает похожие задачи. К сожалению Билдера рядом нет, так что подробнее не скажу
 

grigsoft

Well-known member
15.11.2005
735
0
#7
Если такой подход интересует, то надо тщательнее описывать. Тогда уж лучше так:
Код:
UINT anIDs[]={ID1, ID2, ID3};
...
for (int i=0; i<sizeof(anIDs)/sizeof(anIDs[0]); i++)
{
CWnd* pW = GetDlgItem(anIDs[i]);
....
}
 
L
#9
FindComponent решает мои проблемы, но мой вопрос (выше) по поводу массива указателей на компоненты остаётся открытым.
С ним бы было просто удобней работать. Я не знаю, может это и просто невозможно спрограммировать?
 
04.09.2006
2 566
3
#10
Так а что, нельзя получить адреса экземпляров компонент? Ну вот и положи их в массив, если очень надо
 
S

SNike

#11
Хм. Искать компоненты на своей же форме, а потом по Name разбираться то я нашёл или нет - это интересный способ, но я бы предпочёл способ, когда можно самому из нужных компонентов создать массив указателей на компоненты тех же радио-баттон и обращаться к ним типа:
Код:
if (myRadioButtons[1]->Checked) 
if (myRadioButtons[2]->Checked) 
if (myRadioButtons[3]->Checked)
Вот только что это за myRadioButtons и как его описать?
Сравнение идет не по Name, а по ClassName, что совсем разные вещи. И это лишь вариант, а не руководство к действию. Есть другие способы. Например, сравнивать с существующим классом, использовать AS с контролем на ошибку и т.д.
А вот если использовать FindComponent - то тогда точно придется использовать Name, что нибудь типа TEdit1. И стоит сделать осмысленные названия тогда унифицированность пропадет.

По поводу myRadioButtons[1] - никто не мешает создать скажем коллекцию или какой нибудь лист чтоб в нем хранить указатели на нужные элементы.

Мое мнение - всеж сравнивать по имени класса. Или использовать коллекцию указателей где будут только нужные данные и тогда поиск отпадет.
 
Z
#12
Компонент является объектом, а значит с ним можно связать какие нибудь данные, в частном случае номер в массиве. К примеру у всех компонентов есть пустое свойство Tag. Что мешает в данном свойстве запоминать индекс компонента в массиве? С помощью перечисления в цикле, проверяем нужного ли класса компонент, если нужного, читаем его свойство Tag, то бишь определяем индекс компонента в массиве.
 
L
#13
Или использовать коллекцию указателей где будут только нужные данные и тогда поиск отпадет.
Именно такую коллекцию я и хочу создать.

2SNike & zubr
Спасибо. Интересные мысли. Бум пробовать :)
 
Статус
Закрыто для дальнейших ответов.