![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Обход в цикле элементов (Edit1, Edit2, Edit3 и т.д.)одного класса [D6, WinXP]
Евгений11111 © (2009-12-22 13:12:00)Добрый день.
Подскажите, пожалуйста, можно ли пробежать в цикле по элементам одного класса (Edit1, ..., Edit10)?
Например так
for i:=1 to 10 do
Edit(i).Text:=IntToStr(i);
Anatoly Podgoretsky (2009-12-23 12:12:00) [1]> Ega23 (23.12.2009 08:09:27) [27]
А тебя бы не удивила гигантская утечка, если бы это не было сделано. Чем тебя не устраивает удаление по Controls, а не Components, в котором может не быть всех контролов на форме?
Ega23 (2009-12-23 08:09:00) [2]
> Anatoly Podgoretsky © (22.12.09 20:57) [23]
> Германн © (23.12.09 01:29) [25]
> Джо © (23.12.09 04:10) [26]
Гхм... Хотел сказать одно, а ляпнул другое. Сорри.
destructor TWinControl.Destroy;
var
I: Integer;
Instance: TControl;
begin
Destroying;
........
I := ControlCount;
while I <> 0 do
begin
Instance := Controls[I - 1];
Remove(Instance);
Instance.Destroy;
I := ControlCount;
end;
Просто вот это в своё время крайне неприятно удивило.
Джо (2009-12-23 04:10:00) [3]
> Ega23 © (22.12.09 20:22) [20]
> Просто мне крайне не нравится то, что если я создам
> контрол без Owner и назначу ему Parent - ему и Owner тоже
> назначится.
procedure TForm1.Button1Click(Sender: TObject);
var
Ctrl: TControl;
begin
Ctrl := TControl.Create(nil);
Ctrl.Parent := Self;
if Ctrl.Owner <> nil then
ShowMessage ('Хм')
end;
Германн (2009-12-23 01:29:00) [4]
> Anatoly Podgoretsky © (22.12.09 20:57) [23]
>
> > Ega23 (22.12.2009 20:22:20) [20]
>
> Owner ему не назначается.
>
Я тоже удивился ответу Ёжки. Наверно он что-то не договаривает.
Плохиш (2009-12-22 21:21:00) [5]
> Aleks (22.12.09 20:31) [21]
О, что это?
Anatoly Podgoretsky (2009-12-22 20:57:00) [6]> Ega23 (22.12.2009 20:22:20) [20]
Owner ему не назначается.
Ega23 (2009-12-22 20:41:00) [7]
> Aleks (22.12.09 20:31) [21]
Какой ужас....
Aleks (2009-12-22 20:31:00) [8]var
A: array [1..MaxEditCount] of TEdit;
Begin
if(Form1.ActiveControl is TEdit) then
Edit21.Text:=(Form1.ActiveControl as TEdit).Text;
End;
Ega23 (2009-12-22 20:22:00) [9]
> Это я оперировал Parent-ом, а ты оперировал Owner-ом.
Я в курсе. Просто мне крайне не нравится то, что если я создам контрол без Owner и назначу ему Parent - ему и Owner тоже назначится.
Anatoly Podgoretsky (2009-12-22 20:04:00) [10]> Ega23 (22.12.2009 19:55:18) [18]
Это я оперировал Parent-ом, а ты оперировал Owner-ом.
Ega23 (2009-12-22 19:55:00) [11]
> Почему неправильно?
Ну потому, что я Owner-а "не заказывал", оперировал только Parent-ом.
Anatoly Podgoretsky (2009-12-22 19:06:00) [12]> Ega23 (22.12.2009 18:45:16) [16]
Почему неправильно?
Вот наоборот точно будет неправильно.
Ega23 (2009-12-22 18:45:00) [13]
> Anatoly Podgoretsky © (22.12.09 17:56) [14]
И это (на мой взгляд) неправильно.
Григорьев Антон (2009-12-22 18:04:00) [14]http://www.delphikingdom.com/asp/answer.asp?IDAnswer=71458
Anatoly Podgoretsky (2009-12-22 17:56:00) [15]
begin
for i := 1 to 10 do
TEdit.Create(nil).Parent := Self;
ShowMessage("Прощай, Мемлик!");
end;
Ega23 (2009-12-22 16:38:00) [16]
> да есть, я точно видел.
procedure TForm1.CreateNewTimer(aOwner : TComponent; Iteration : Integer);
var
tmr : TTimer;
begin
if (Iteration >= 10) then Exit;
if not Assigned(aOwner) then
tmr := TTimer.Create(Self)
else
tmr := TTimer.Create(aOwner);
CreateNewTimer(tmr, Iteration + 1);
end;
procedure TForm1.FormCreate(Sender : TObject);
begin
CreateNewTimer(nil, 0);
end;
AntonioBanderas (2009-12-22 16:26:00) [17]
> Евгений11111 (22.12.09 13:12)
if (controls[i] is TEdit) then TEdit(controls[i]).любое_поле&метод
Ega23 (2009-12-22 15:19:00) [18]
> Они находятся в одном из контейнеров Controls, вот по нему
> и делать иттерацию
begin
for i := 1 to 10 do
TEdit.Create(nil);
ShowMessage("Превед, Мемлик!");
end;
Kyn66 (2009-12-22 13:54:00) [19]Пардонс, скобка лишняя
for i := 1 to 10 do
TEdit(FindComponent('Edit' + IntToStr(i)).Text) := IntToStr(i);
Kyn66 (2009-12-22 13:51:00) [20]Если количество явно указано, то можно через FindComponent
for i := 1 to 10 do
TEdit(FindComponent('Edit' + IntToStr(i)).Text]) := IntToStr(i);