Консультация № 143045
04.09.2008, 12:13
0.00 руб.
0 7 2
Уважаемые эксперты, привидите плиз пример кода, в котором бы использовалось перечисление на форме контролов типа Edit. В VBA я это делал так:
for i=1 to 9
x=Form1.Controls("TextBox" & i).Value

А как такой же фокус провернуть в Дельфи?

Обсуждение

Неизвестный
04.09.2008, 12:45
общий
это ответ

Здравствуйте, [b]Maximus777[/b]!

В Delphi это делается примерно так:
Код:
var
i: Integer;
x: String;
begin
for i:= 1 to 9 do
begin
x:= TEdit(Self.FindComponent('Edit' + IntToStr(i))).Text;
// Делаем что-нибудь с х
end;
end;
Функция FindComponent ищет компоненты по их именам. По умолчанию компоненты типа TEdit так и обозначаются в Delphi: Edit1, Edit2, ..., Edit9.
IntToStr преобразует число в текст. TEdit() преобразует класс TComponent в TEdit, что дает доступ к его функциям и свойствам.

Удачи!
Неизвестный
04.09.2008, 12:48
общий
Self в моем примере можно заменить на Form1 или вообще отбросить. Но применять Self немного удобнее:
Во-первых, если захотите сменить имя формы с Form1 на какой-то другой, то текст программы менять не придется.
Во-вторых, если захотите использовать этот кусок программы внутри with, то опять же ничего переделывать не придется.

Но если функция будет внешней (т.е. не будет являться функцией класса TForm1), то обязательно нужно заменить Self на Form1.
Неизвестный
04.09.2008, 13:06
общий
это ответ
Здравствуйте, Maximus777!


Код:
 
procedure AllControls;

function rec(Par: TComponent): Boolean;
var
i: Integer;
begin
for I := 0 to Par.ComponentCount - 1 do begin
if Par.Components[i] is TEdit then begin
//что сделать с компоненттом
end;

end
else
Rec(Par.Components[i]);

end;
end;

var

par: TWinControl;
begin

par := Form1;
rec(Par);

end;



;


этот код должен найти все эдиты те которые находятся на форме даже если они на панелях или на других компонентах
Неизвестный
04.09.2008, 17:54
общий
я не проверял конечно но так на первый взгляд код эксперта denisss будет работать правильно только в случае если все Editы находятся непосредственно на форме, кроме того если вы не знаете сколько у вас на форме эдитов то в цикле for вы что будете писать ?
но выбирать в принципе вам
Неизвестный
04.09.2008, 18:24
общий
У меня пока ещё не было ситуаций чтобы я не знал сколько на форме Edit'ов. В моём случае есть 20 Edit'ов, все на одной форме, просто половина (типа с Edit1 по 10) обрабатываются по одному принципу, а вторая половина по другому. Поэтому в VBA я просто перебирал в цикле числовую составляющую имени и всё было ОК. А в дельфях засада. С ходу не получилось тот же принцип применить, вот и обратился сюда.
Неизвестный
05.09.2008, 16:14
общий
to Кэр Лаэда,
всегда стараюсь размещать различные элементы управления на панелях (TPanel). Приведенный мной пример работает у меня нормально, не смотря на то, что поля ввода размещены не непосредственно на форме. Это происходит оттого, что размещенные на панелях компоненты имеют в качестве родителей (свойство Parent: TWinControl) панели, а в качестве "хозяина" (свойство Owner) - форму.
Мой код может отказаться работать, если сменить "хозяина" или если при динамическом создании компонента конструктору указать не форму, а, например, панель, на которой будет размещен новый компонент. Однако полагаю, что пока еще речи про динамическое создание компонентов не идет.

С уважением,
Denisss
Неизвестный
05.09.2008, 16:19
общий
Denisss

из разговора я понял что речь не идет о динамическом создании компонентов, хотя по вопросу я сделал такой вывод...
Форма ответа