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

Ваш аккаунт

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

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

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

Перебор элементов формы

4.2K
13 июня 2005 года
Крыс
98 / / 06.05.2005
Извиняюсь, если нечто подобное уже было, я не нашла.
Задачка известная - при изменении размеров формы мнеять пропорционально размеры контролов.
Не подскажете, как лучше организовать перебор контролов.
Я пользовалась таким методом,

this->SelectFirst();
do {
.......
CurrentInd++;
this->SelectNext(this->ActiveControl, true, false);
} while (CurrentInd < qual);

но он не обрабатывает элементы типа label, например, а идет по табуляции
10
13 июня 2005 года
Freeman
3.2K / / 06.03.2004
Цитата:
Originally posted by Крыс
Задачка известная - при изменении размеров формы мнеять пропорционально размеры контролов.


А не проще пользоваться Align-ами и Anchors-ами?

4.2K
13 июня 2005 года
Крыс
98 / / 06.05.2005
Цитата:
Originally posted by Freeman
А не проще пользоваться Align-ами и Anchors-ами?


Наверно это не проще, легче написать одну процедуру, чем менять 30 форм

10
13 июня 2005 года
Freeman
3.2K / / 06.03.2004
Цитата:
Originally posted by Крыс
Наверно это не проще, легче написать одну процедуру, чем менять 30 форм


Можно рекурсивно гулять по Controls у каждого WinControl-а.

4.2K
13 июня 2005 года
Крыс
98 / / 06.05.2005
Цитата:
Originally posted by Freeman
Можно рекурсивно гулять по Controls у каждого WinControl-а.


Здесьрекурсия не нужна, требуется просто перебрать все элементы формы
Дело в том что приведенный выше код не захватывает Label-ы
GetControl() тоже не захватывает..
TWinControl* CurCont;
CurCont = this->FindNextControl(this,true, false, false);
for (int i = 0; i < 14; i ++) {
CurCont = this->FindNextControl(CurCont,true, false, false);}
-аналогично

Можно пример кода, я уже задолбалась нужный метод искать.. Пожалуйса!!!

10
13 июня 2005 года
Freeman
3.2K / / 06.03.2004
Цитата:
Originally posted by Крыс
Можно пример кода, я уже задолбалась нужный метод искать.. Пожалуйса!!!


Можно двигаться по компонентам и проверять, являются ли они контролами. Все компоненты на форме принадлежат форме. А вот контролы - каждый лежит на своем родителе. Если у тебя есть вкладки TTabSheet или TPanel, только рекурсией и можно их обойти. Вот код на Дельфи:

Код:
// по компонентам

var
  I: Integer;
  C: TComponent;
begin
  for I := 0 to ComponentCount - 1 do
  begin
    C := Components;
    if C is TControl then
    begin
      // изменяем размер
    end;
  end;
end;


// по контролам

procedure ResizeControls(C: TControl);
var
  I: Integer;
begin
  // изменяем размер для W
  if C is TWinControl then
    for I := 0 to TWinControl(C).ControlCount - 1 do
      ResizeControls(TWinControl(C).Controls);
end;

begin  // метод формы (OnCreate?)
  ResizeControls(Self);
end;

Кстати, функции SelectNext предназначены совершенно для другого - для выбора контролов согласно выставленному TabOrder. Поэтому поведение VCL в данном случае верно. Наследники TControl, не являющиеся TWinControl-ами, не имеют окна (HWND) и поэтому не могут принимать фокус.
10
13 июня 2005 года
Freeman
3.2K / / 06.03.2004
Цитата:
Originally posted by Крыс
Наверно это не проще, легче написать одну процедуру, чем менять 30 форм


Кстати, за это время можно было бы уже перепроектировать дизайн.

4.2K
14 июня 2005 года
Крыс
98 / / 06.05.2005
Цитата:
Originally posted by Freeman
Кстати, за это время можно было бы уже перепроектировать дизайн.


За код спасибо огромное, :)
а про дизайн..
ну во-первых я пока другую часть писала
а во-вторых все равно интересно было как это делается :P

4.2K
14 июня 2005 года
Крыс
98 / / 06.05.2005
Цитата:
Кстати, функции SelectNext предназначены совершенно для другого - для выбора контролов согласно выставленному TabOrder. Поэтому поведение VCL в данном случае верно. Наследники TControl, не являющиеся TWinControl-ами, не имеют окна (HWND) и поэтому не могут принимать фокус.


а это я в отладчике заметила, что он по табу перебирает элементы... ток это не помоголо, для решения P(

Кстати, за рекурсию - отдельное спосибо!!!

585
14 июня 2005 года
honeybeer
297 / / 06.09.2004
Информация к сведению:
Главная форма приложения является Owner'ом для всех Design time компонентов по умолчанию. Так вот,
формация типа this->ComponentCount отображает количество всех расположенных на форме компонентов.
Ну и далее по аналогии this->Components...
Только надо озаботиться приведением от TComponent* к классу нужному, но это по моему проблемы не создает
4.2K
14 июня 2005 года
Крыс
98 / / 06.05.2005
Цитата:
Originally posted by honeybeer
Информация к сведению:
Главная форма приложения является Owner'ом для всех Design time компонентов по умолчанию. Так вот,
формация типа this->ComponentCount отображает количество всех расположенных на форме компонентов.
Ну и далее по аналогии this->Components...
Только надо озаботиться приведением от TComponent* к классу нужному, но это по моему проблемы не создает


Спасибо, к сведению принято :)

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