![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Можно ли имена компонентов формировать программго?
Константин © (2012-02-10 14:47:00)Здравствуйте, подскажите можно ли обращаться к компонентами яростная их имена в программе? Например у меня есть label1...label10. Мне нужно записать одну и ту же информацию во все label. Можно ли создать цикл и номер label подставлять из переменной
lesstab (2012-02-20 11:03:00) [1]Вопрос отменяю. Проблема была в цикле. Обращался к несуществующему элементу. Прошу прошения.
lesstab (2012-02-20 10:48:00) [2]Извините, тема не попала на первую страницу.
lesstab (2012-02-20 10:44:00) [3]Здравствуйте.
На форме размешен набор панелей. Нужно создать массив панелей и каждый элемент этого массива связывать с отдельной панелью на форме.
Связываю:
FreeTimePanels[1,0] := Panel10;
FreeTimePanels[2,0] := Panel20;
FreeTimePanels[3,0] := Panel30;
FreeTimePanels[4,0] := Panel40;
FreeTimePanels[5,0] := Panel50;
FreeTimePanels[6,0] := Panel60;
Ошибка (Access Violation), когда задаю свойства:
if OnePair = '1' then FreeTimePanels[d,p].Color := clFuchsia;
if OnePair = '0' then FreeTimePanels[d,p].Color := clLime;
Оба отрывки кода размещены в процедурах, принадлежащих форме.
Что делать, чтобы работало?
mamon (2012-02-12 17:07:00) [4]var
i: Integer;
begin
For i:=0 to 2 do
(Components[i] as TLabel).Caption:= '123123';
end;
Германн (2012-02-11 04:47:00) [5]
> sniknik © (10.02.12 21:52) [9]
> Плохиш © (11.02.12 00:21) [10]
А тут нужно прочитать хорошую книжку, в которой есть объяснения когда при присваивании копируется указатель, а когда копируется содержимое.
Плохиш (2012-02-11 00:21:00) [6]
> Константин (10.02.12 21:43) [8]
Может тебе всё-таки основы почитать...
sniknik (2012-02-10 21:52:00) [7]> Хотя не понятно почему...
что может быть не понятного в ссылке?
> У меня есть "Х", я создаю "Y" приравниваю Y=X. А получается что X и Y становятся одним и тем же.
у тебя есть рука, ты указываешь ее пальцем на дом... потом приравнял указание (направление) одного пальца на дом другому пальцу, и теперь указываешь туда же пальцем второй руки.... поменялся ли дом от этого? стало ли их(дома) два?
Константин (2012-02-10 21:43:00) [8]
> FLabels[0]:=Label1; //важно понимать, что это еще одна ссылка
> на тот же самый экземпляр.
Блин, проканало... Хотя не понятно почему... У меня есть "Х", я создаю "Y" приравниваю Y=X. А получается что X и Y становятся одним и тем же.
DVM (2012-02-10 17:40:00) [9]
> Здравствуйте, подскажите можно ли обращаться к компонентами
> яростная их имена в программе? Например у меня есть label1.
> ..label10. Мне нужно записать одну и ту же информацию во
> все label.
Еще стоит упомянуть про свойство Tag, в нем можно вполне себе хранить нечто отличащее одну метку от другой, можно просто число, можно и все что угодно вплоть до указателей на записи или даже объекты или строки. Главное не забывать удалять, если это что-то сложнее числа. В сочетании с перебором компонентов позволит оперировать метками как заблагорассудится.
Anatoly Podgoretsky (2012-02-10 16:44:00) [10]> MBo (10.02.2012 15:47:03) [3]
Массив есть всегда, даже два.
_Юрий (2012-02-10 15:50:00) [11]создаем массив
TForm1 = class(TForm)
private
FLabels: array of TLabel;
..
заполняем его:
SetLength(FLabels, 10);
FLabels[0]:=Label1; //важно понимать, что это еще одна ссылка на тот же самый экземпляр.
FLabels[1]:=Label2;
...
3. Цикл по массиву
for i:=0 to Length(FLabels) - 1 do
FLabels[i].Caption:='123';
---
Можно конечно и цикл по компонентам формы сделать
for I:=0 to Form1.ComponentsCount - 1 do
if Form1.Components[i] is Tlabel then
(Form1.Components[i] as Tlabel).Caption := '123';
Но это дурной путь. Имена не нужны
MBo (2012-02-10 15:47:00) [12]label[i] - это если у тебя массив компонентов (динамически созданных, или внесенных в массив).
Если массива нет, то функция FindComponent ищет по имени.
Как уже сказано в [1] - это весьма плохой дизайн.
sniknik (2012-02-10 15:47:00) [13]
for i:=0 to ComponentCount-1 do
if Components[i] is TLabel then TLabel(Components[i]).Caption:= '111222';
Константин (2012-02-10 15:39:00) [14]А подскажите как? Как записать циклом во все ячейки? Что то вроде
For i:=1 to 10 do label[i] := '111222';
А то код очень разрастается.
sniknik (2012-02-10 14:49:00) [15]можно, но не нужно, наоборот нужно приучать себя к мысли, что имена не нужны...