Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Можно ли имена компонентов формировать программго?


Константин ©   (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]

можно, но не нужно, наоборот нужно приучать себя к мысли, что имена не нужны...


Наверх

Титульная страница Поиск, карта сайта Написать письмо