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

Тема в разделе "Общие вопросы по С и С++", создана пользователем Kassad, 19 ноя 2006.

Статус темы:
Закрыта.
  1. Kassad

    Kassad Гость

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

    LAW Гость

    Не знаю как реализовать конкретно, но подозреваю, что нужно создать массив-структуру, в которую поместить объекты, а потом обращиться к ним по индексу.

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

    grigsoft Well-Known Member

    Регистрация:
    15 ноя 2005
    Сообщения:
    735
    Симпатии:
    0
    Если ты под Windows, то GetTopWindow\GetNextWindow(GW_HWNDNEXT) + GetClassName.
     
  4. SNike

    SNike Гость

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

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

    Код (Text):
     for I:= 0 to Form1.ControlCount-1 do
    if Form1.Controls[i].ClassNameIs('TButton')
    then ShowMessage('Нашли кнопку');
    Для сравнения так же можно использовать такие методы контролов как Class, ClassType.
    Просто стоит поискать их аналоги в на языке С, думаю они есть
     
  5. LAW

    LAW Гость

    Хм. Искать компоненты на своей же форме, а потом по Name разбираться то я нашёл или нет - это интересный способ, но я бы предпочёл способ, когда можно самому из нужных компонентов создать массив указателей на компоненты тех же радио-баттон и обращаться к ним типа:
    Код (Text):
    if (myRadioButtons[1]->Checked)
    if (myRadioButtons[2]->Checked)
    if (myRadioButtons[3]->Checked)
    Вот только что это за myRadioButtons и как его описать?
     
  6. European

    Регистрация:
    4 сен 2006
    Сообщения:
    2.580
    Симпатии:
    0
    В Билдере есть функция FindComponent, которая решает похожие задачи. К сожалению Билдера рядом нет, так что подробнее не скажу
     
  7. grigsoft

    grigsoft Well-Known Member

    Регистрация:
    15 ноя 2005
    Сообщения:
    735
    Симпатии:
    0
    Если такой подход интересует, то надо тщательнее описывать. Тогда уж лучше так:
    Код (Text):
    UINT anIDs[]={ID1, ID2, ID3};
    ...
    for (int i=0; i<sizeof(anIDs)/sizeof(anIDs[0]); i++)
    {
    CWnd* pW = GetDlgItem(anIDs[i]);
    ....
    }
     
  8. zubr

    zubr Гость

    Плохо искал. Посмотри здесь
     
  9. LAW

    LAW Гость

    FindComponent решает мои проблемы, но мой вопрос (выше) по поводу массива указателей на компоненты остаётся открытым.
    С ним бы было просто удобней работать. Я не знаю, может это и просто невозможно спрограммировать?
     
  10. European

    Регистрация:
    4 сен 2006
    Сообщения:
    2.580
    Симпатии:
    0
    Так а что, нельзя получить адреса экземпляров компонент? Ну вот и положи их в массив, если очень надо
     
  11. SNike

    SNike Гость

    Сравнение идет не по Name, а по ClassName, что совсем разные вещи. И это лишь вариант, а не руководство к действию. Есть другие способы. Например, сравнивать с существующим классом, использовать AS с контролем на ошибку и т.д.
    А вот если использовать FindComponent - то тогда точно придется использовать Name, что нибудь типа TEdit1. И стоит сделать осмысленные названия тогда унифицированность пропадет.

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

    Мое мнение - всеж сравнивать по имени класса. Или использовать коллекцию указателей где будут только нужные данные и тогда поиск отпадет.
     
  12. zubr

    zubr Гость

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

    LAW Гость

    Именно такую коллекцию я и хочу создать.

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

Поделиться этой страницей