Перебор элементов формы
Задачка известная - при изменении размеров формы мнеять пропорционально размеры контролов.
Не подскажете, как лучше организовать перебор контролов.
Я пользовалась таким методом,
this->SelectFirst();
do {
.......
CurrentInd++;
this->SelectNext(this->ActiveControl, true, false);
} while (CurrentInd < qual);
но он не обрабатывает элементы типа label, например, а идет по табуляции
Задачка известная - при изменении размеров формы мнеять пропорционально размеры контролов.
А не проще пользоваться Align-ами и Anchors-ами?
А не проще пользоваться Align-ами и Anchors-ами?
Наверно это не проще, легче написать одну процедуру, чем менять 30 форм
Наверно это не проще, легче написать одну процедуру, чем менять 30 форм
Можно рекурсивно гулять по Controls у каждого WinControl-а.
Можно рекурсивно гулять по 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);}
-аналогично
Можно пример кода, я уже задолбалась нужный метод искать.. Пожалуйса!!!
Можно пример кода, я уже задолбалась нужный метод искать.. Пожалуйса!!!
Можно двигаться по компонентам и проверять, являются ли они контролами. Все компоненты на форме принадлежат форме. А вот контролы - каждый лежит на своем родителе. Если у тебя есть вкладки 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) и поэтому не могут принимать фокус.
Наверно это не проще, легче написать одну процедуру, чем менять 30 форм
Кстати, за это время можно было бы уже перепроектировать дизайн.
Кстати, за это время можно было бы уже перепроектировать дизайн.
За код спасибо огромное, :)
а про дизайн..
ну во-первых я пока другую часть писала
а во-вторых все равно интересно было как это делается :P
а это я в отладчике заметила, что он по табу перебирает элементы... ток это не помоголо, для решения P(
Кстати, за рекурсию - отдельное спосибо!!!
Главная форма приложения является Owner'ом для всех Design time компонентов по умолчанию. Так вот,
формация типа this->ComponentCount отображает количество всех расположенных на форме компонентов.
Ну и далее по аналогии this->Components...
Только надо озаботиться приведением от TComponent* к классу нужному, но это по моему проблемы не создает
Информация к сведению:
Главная форма приложения является Owner'ом для всех Design time компонентов по умолчанию. Так вот,
формация типа this->ComponentCount отображает количество всех расположенных на форме компонентов.
Ну и далее по аналогии this->Components...
Только надо озаботиться приведением от TComponent* к классу нужному, но это по моему проблемы не создает
Спасибо, к сведению принято :)