Гость
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Динамическое обращение к объектам / 24 сообщений из 24, страница 1 из 1
22.08.2021, 08:18
    #40092469
AnWa
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Динамическое обращение к объектам
На форме имеется 10 объектов TLabel, возможно ли в цикле через переменную обращаться к свойстам данных объектов?
Например,
Код: pascal
1.
2.
3.
var I: byte;
for I := 1 to 10 do
Label[I].Caption:='Текст ' + I;
...
Рейтинг: 0 / 0
22.08.2021, 10:59
    #40092487
Gerasimenko
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Динамическое обращение к объектам
AnWa,

Можно, сделав массив ссылок на них.
Либо установив в Tag нужный номер и перебором ComponentCount.
Либо перебором ComponentCount и анализом Name/Caption
...
Рейтинг: 0 / 0
22.08.2021, 12:10
    #40092491
AnWa
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Динамическое обращение к объектам
Gerasimenko


Насколько я понял, если перебором, то Component[i] не обязательно равен Label[i]

А в массив ссылок получается можно привязать индекс к конкретному объекту?
Т.е.:
Код: pascal
1.
2.
3.
4.
5.
0      1        2
1, Label1, Edit1
2, Label2, Edit2
...
N, LabelN, EditN
...
Рейтинг: 0 / 0
22.08.2021, 12:54
    #40092494
Gerasimenko
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Динамическое обращение к объектам
AnWa
Gerasimenko


Насколько я понял, если перебором, то Component[i] не обязательно равен Label[i]

А в массив ссылок получается можно привязать индекс к конкретному объекту?
Т.е.:
Код: pascal
1.
2.
3.
4.
5.
0      1        2
1, Label1, Edit1
2, Label2, Edit2
...
N, LabelN, EditN


1. Если использовать Tag в качестве индекса, то можно перебором
2. Да

ps
в твоем случае лучше использовать массив record - ов
типа
Код: pascal
1.
2.
3.
4.
5.
6.
recLblEdt = record
pLabel: ^Tlabel;
pEdit: ^TEdit;
end;
...
arLblEdt: array [0..9] of recLblEdt
...
Рейтинг: 0 / 0
22.08.2021, 13:01
    #40092495
x1ca4064
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Динамическое обращение к объектам
AnWa
На форме имеется 10 объектов TLabel, возможно ли в цикле через переменную обращаться к свойстам данных объектов?


Возможно, но массив именно TLabel нужно построить:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
var
  Labels:array of TLabel;
  i,n:integer;
begin
  SetLength(Labels,ComponentCount);
  n:=0;
  for i:=0 to ComponentCount-1 do
  if Components[i] is TLabel then
  begin
    Labels[n]:=Components[i] as TLabel;
    inc(n);
  end;
  SetLength(Labels,n);
end;
...
Рейтинг: 0 / 0
22.08.2021, 13:02
    #40092496
Gerasimenko
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Динамическое обращение к объектам
AnWa,

И, да, если использовать в имени компонента нумерацию, то можно через FindComponent
...
Рейтинг: 0 / 0
22.08.2021, 13:33
    #40092498
softwarer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Динамическое обращение к объектам
AnWa
На форме имеется 10 объектов TLabel, возможно ли в цикле через переменную обращаться к свойстам данных объектов?

Возможно всё. А если выбирать для каждой задачи правильное решение, то многое возможное становится не нужным.
...
Рейтинг: 0 / 0
22.08.2021, 16:00
    #40092512
AnWa
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Динамическое обращение к объектам
Gerasimenko

То, что нужно, благодарю.

Код: pascal
1.
2.
3.
var I: byte;
for I := 1 to 10 do
(findcomponent('Label'+I) as TLabel).Caption:='Текст ' + I;
...
Рейтинг: 0 / 0
23.08.2021, 10:22
    #40092605
Fr0sT-Brutal
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Динамическое обращение к объектам
var Labels := TArray<TLabel>.Create(Label1, Label2, ...)
ну и дальше шуровать по нему
...
Рейтинг: 0 / 0
23.08.2021, 13:54
    #40092672
alekcvp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Динамическое обращение к объектам
AnWa,

Только каждый FindComponent() - то тоже цикл for с перебором всех компонентов.
...
Рейтинг: 0 / 0
23.08.2021, 15:59
    #40092718
DmSer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Динамическое обращение к объектам
Gerasimenko

1. Если использовать Tag в качестве индекса, то можно перебором
2. Да

ps
в твоем случае лучше использовать массив record - ов
типа
Код: pascal
1.
2.
3.
4.
5.
6.
recLblEdt = record
pLabel: ^Tlabel;
pEdit: ^TEdit;
end;
...
arLblEdt: array [0..9] of recLblEdt



Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
И для верности заполнять массив таким образом:
var
  ed: TEdit;
  I: Integer;
begin
  for I := 0 to 9 do
  begin
    ed := TEdit.Create(nil);
    ed.Name := 'MyEdit' + IntToStr(I);
    arLblEdt[I] := @ed;
  end;
end;



шутка
...
Рейтинг: 0 / 0
23.08.2021, 17:55
    #40092756
makhaon
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Динамическое обращение к объектам
AnWa
Gerasimenko

То, что нужно, благодарю.

Код: pascal
1.
2.
3.
var I: byte;
for I := 1 to 10 do
(findcomponent('Label'+I) as TLabel).Caption:='Текст ' + I;



плохое решение. лучше так:

Код: pascal
1.
2.
3.
4.
5.
6.
var
 i: integer;
begin
 for i := 0 to ComponentCount - 1 do
  if Components[i] is TLabel then
   with TLabel(Components[i]) do
...
Рейтинг: 0 / 0
24.08.2021, 15:50
    #40092931
AnWa
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Динамическое обращение к объектам
makhaon, а как в таком решении убедиться, что Label[I] получила 'Текст ' + IntToStr(I)? Нужен бцдут еще один цикл..
...
Рейтинг: 0 / 0
26.08.2021, 17:01
    #40093324
makhaon
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Динамическое обращение к объектам
AnWa,

Ну добавь еще одну переменную:

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
var
 i, j: integer;
begin
 j := 0;
 for i := 0 to ComponentCount - 1 do
  if Components[i] is TLabel then
   with TLabel(Components[i]) do
   begin
    Caption := j.ToString;
    Inc(j);
   end;
...
Рейтинг: 0 / 0
26.08.2021, 18:36
    #40093331
AnWa
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Динамическое обращение к объектам
makhaon,

мне надо, чтобы Label1.Caption := 'Текст 1', Label2.Caption := 'Текст 2', ..., Labeli.Caption := 'Текст i'
Код: pascal
1.
(findcomponent('Label'+IntToStr(I)) as TLabel).Caption:='Текст ' + IntToStr(I);


а как тут, я могу быть уверен, что Components[1]==Label1, Components[2]==Label2, ..., Components[i]==Labeli?
...
Рейтинг: 0 / 0
26.08.2021, 19:19
    #40093336
YuRock
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Динамическое обращение к объектам
AnWa,

Использовать Tag. Говорили же уже 5 раз.
Указать его, а затем в цикле на него ориентироваться.
...
Рейтинг: 0 / 0
26.08.2021, 19:26
    #40093337
makhaon
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Динамическое обращение к объектам
AnWa
makhaon,

мне надо, чтобы Label1.Caption := 'Текст 1', Label2.Caption := 'Текст 2', ..., Labeli.Caption := 'Текст i'
Код: pascal
1.
(findcomponent('Label'+IntToStr(I)) as TLabel).Caption:='Текст ' + IntToStr(I);


а как тут, я могу быть уверен, что Components[1]==Label1, Components[2]==Label2, ..., Components[i]==Labeli?


Код: pascal
1.
2.
3.
4.
5.
6.
7.
var
 i: integer;
begin
 for i := 0 to ComponentCount - 1 do
  if Components[i] is TLabel then
   with TLabel(Components[i]) do
    Caption := ReplaceStr(Name, 'Label', 'Текст');
...
Рейтинг: 0 / 0
26.08.2021, 20:09
    #40093342
x1ca4064
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Динамическое обращение к объектам
AnWa

Код: pascal
1.
2.
3.
4.
5.
0      1        2
1, Label1, Edit1
2, Label2, Edit2
...
N, LabelN, EditN


Судя по наличию TLabel и TEdit - Вам бы очень подошел какой-либо Grid (самое простое - TStringGrid, но могут быть и ньюансы)
...
Рейтинг: 0 / 0
27.08.2021, 00:21
    #40093358
AnWa
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Динамическое обращение к объектам
makhaon
AnWa,
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
var
 i, j: integer;
begin
 j := 0;
 for i := 0 to ComponentCount - 1 do
  if Components[i] is TLabel then
   with TLabel(Components[i]) do
   begin
    Caption := j.ToString;
    Inc(j);
   end;


До меня дошло, если имена объектов возрастают соответственно их добавлению, а не были присвоены после и в разброс, то код справидлив, только j начинать с 1

makhaon

Код: pascal
1.
2.
3.
4.
5.
6.
7.
var
 i: integer;
begin
 for i := 0 to ComponentCount - 1 do
  if Components[i] is TLabel then
   with TLabel(Components[i]) do
    Caption := ReplaceStr(Name, 'Label', 'Текст');


Своим примером я хотел показать, что в конкретный лэйбел, мне нужно конкретное значение, а не так буквально)))
...
Рейтинг: 0 / 0
27.08.2021, 00:24
    #40093359
AnWa
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Динамическое обращение к объектам
YuRock
AnWa,
Использовать Tag. Говорили же уже 5 раз.
Указать его, а затем в цикле на него ориентироваться.


А если findcomponent тот же цикл, если ли смысл использовать другой цикл? Но, да, вариант с Tag я как то пропустил
...
Рейтинг: 0 / 0
27.08.2021, 00:30
    #40093360
AnWa
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Динамическое обращение к объектам
[quot x1ca4064#22364365]
AnWa

Судя по наличию TLabel и TEdit - Вам бы очень подошел какой-либо Grid (самое простое - TStringGrid, но могут быть и ньюансы)

Да, я тоже начинаю склоняться к использованию Grid, вот можно было бы там также просто менять цвет яцейки свойством Color(
Код: pascal
1.
StringGrid1.Cells[i,j].Color;
...
Рейтинг: 0 / 0
27.08.2021, 03:01
    #40093361
northener
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Динамическое обращение к объектам
AnWa
YuRock
AnWa,
Использовать Tag. Говорили же уже 5 раз.
Указать его, а затем в цикле на него ориентироваться.


А если findcomponent тот же цикл, если ли смысл использовать другой цикл? Но, да, вариант с Tag я как то пропустил

Лично я уже давно говорил, что findcomponent это функция придуманная троешниками для троешников. Грамотному разработчику она никогда не может быть необходима. И с очень большой вероятностью никогда не может быть полезна.
...
Рейтинг: 0 / 0
27.08.2021, 09:33
    #40093382
rgreat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Динамическое обращение к объектам
AnWa

Да, я тоже начинаю склоняться к использованию Grid, вот можно было бы там также просто менять цвет яцейки свойством Color(
Код: pascal
1.
StringGrid1.Cells[i,j].Color;


http://avemey.narod.ru/zcolorstringgrid/zcolorstringgrid.html
...
Рейтинг: 0 / 0
27.08.2021, 16:21
    #40093507
YuRock
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Динамическое обращение к объектам
AnWa
YuRock
AnWa,
Использовать Tag. Говорили же уже 5 раз.
Указать его, а затем в цикле на него ориентироваться.


А если findcomponent тот же цикл, если ли смысл использовать другой цикл? Но, да, вариант с Tag я как то пропустил

1. findcomponent ты вызываешь уже в цикле. В итоге у тебя N+1 циклов.
2. findcomponent сравнивает строки, что намного хуже, чем числа.
...
Рейтинг: 0 / 0
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Динамическое обращение к объектам / 24 сообщений из 24, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]