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

Можно, сделав массив ссылок на них.
Либо установив в Tag нужный номер и перебором ComponentCount.
Либо перебором ComponentCount и анализом Name/Caption
...
Рейтинг: 0 / 0
Динамическое обращение к объектам
    #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
Динамическое обращение к объектам
    #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
Динамическое обращение к объектам
    #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
Динамическое обращение к объектам
    #40092496
Gerasimenko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AnWa,

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

Возможно всё. А если выбирать для каждой задачи правильное решение, то многое возможное становится не нужным.
...
Рейтинг: 0 / 0
Динамическое обращение к объектам
    #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
Динамическое обращение к объектам
    #40092605
Fr0sT-Brutal
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
var Labels := TArray<TLabel>.Create(Label1, Label2, ...)
ну и дальше шуровать по нему
...
Рейтинг: 0 / 0
Динамическое обращение к объектам
    #40092672
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AnWa,

Только каждый FindComponent() - то тоже цикл for с перебором всех компонентов.
...
Рейтинг: 0 / 0
Динамическое обращение к объектам
    #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
Динамическое обращение к объектам
    #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
Динамическое обращение к объектам
    #40092931
AnWa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
makhaon, а как в таком решении убедиться, что Label[I] получила 'Текст ' + IntToStr(I)? Нужен бцдут еще один цикл..
...
Рейтинг: 0 / 0
Динамическое обращение к объектам
    #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
Динамическое обращение к объектам
    #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
Динамическое обращение к объектам
    #40093336
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AnWa,

Использовать Tag. Говорили же уже 5 раз.
Указать его, а затем в цикле на него ориентироваться.
...
Рейтинг: 0 / 0
Динамическое обращение к объектам
    #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
Динамическое обращение к объектам
    #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
Динамическое обращение к объектам
    #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
Динамическое обращение к объектам
    #40093359
AnWa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
YuRock
AnWa,
Использовать Tag. Говорили же уже 5 раз.
Указать его, а затем в цикле на него ориентироваться.


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

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

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


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

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

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


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


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

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


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