Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Имена компонентов в массиве


Автор: CODARZ 4.10.2003, 13:29
У меня следущая проблема:

Есть цикл. С помощью этого цикла несколько однотипных
компонентов должны совершить одно и тоже действие.
Все имена компонентов должны содержатся в массиве
components типа string.

Цикл должен увеличивать переменную i
и тем самым сменять компонент...

Как это сделать?... confused.gif

Автор: <Spawn> 4.10.2003, 13:43
Думаю, что для этого не нужно содержать имена компонентов в стринговом массиве.

задаешь массив компонентов(на примере с TLabel):

Код
Components:array[0..3] of TLabel;


затем, допустим, на OnCreate формы заполняешь этот массив нужными тебе компонентами:

Код
Components[0]:=Label1;
Components[1]:=Label2;
Components[2]:=Label3;
Components[3]:=Label4;


Затем когда тебе нужно обратиться к какому нить свойству\методу всех этих компонентов, запускаешь цикл:

Код
for i:=0 to 3 do
Comonents[i].Caption:=Format('TestCaption%d',[i]);

Автор: CODARZ 4.10.2003, 13:51
А как быть если компоненты разных типов?

Автор: CODARZ 4.10.2003, 14:04
Все, спасибо, я уже разоюрался.
Для использования различных типов компонентов
можно сделать вот так

Код

Components:array[0..3] of TComponent;

Автор: CODARZ 4.10.2003, 14:44
Цитата(CODARZ @ 4.10.2003, 14:04)
Все, спасибо, я уже разоюрался.
Для использования различных типов компонентов
можно сделать вот так

Код

Components:array[0..3] of TComponent;

Не... все-таки это всеравно не работает... только что проверил...
Оказывается не пашет... sad.gif

Автор: <Spawn> 4.10.2003, 15:36
какие компоненты используешь?

Автор: CODARZ 4.10.2003, 16:07
Цитата
какие компоненты используешь?

Из библиотеки компонентов DCPCrypt.
Компоненты для шифрования файлов,
для каждого алгоритма свой компонент...

Автор: <Spawn> 4.10.2003, 16:16
Посмотри какой у них общий предок и его используй. Нажми Ctrl и кликни на название обьекта - там видно будет от какого класса он наследуется.

Автор: CODARZ 4.10.2003, 16:28
Цитата
Посмотри какой у них общий предок и его используй. Нажми Ctrl и кликни на название обьекта - там видно будет от какого класса он наследуется.

Там у каждого компонента разные классы у одних TDCP_blockcipher128 у
других TDCP_blockcipher64, поэтому не можешь сказать как вызвать
компонент просто по номеруconfused.gif

Например:
Я переименую все компоненты как CryptComponent1,2,3,4,5,6,7 и т.д.
и чтобы можно было просто подставить номер и вызвать компонет,
вот по такому шаблону:

CryptComponent[номер копонента].EncryptString(F.Text);


Скажи если знаешь, plz...


Автор: <Spawn> 4.10.2003, 16:35
Ну дак посмотри какой предок у этих TDCP_blockciper128, TDCP_blockciper64 до тех пор пока не найдешь общего(TObject ты точно найдешь ))))) ). Если их общий предок не будет обладать нужным тебе методом, то можно сделать так:
Код
for i:=0 to 3 do
 if Components[i] is TDCP_blockciper128 then
   TDCP_blockciper128(Components[i]).EncryptString(F.Text)
 else
 if Components[i] is TDCP_blockciper64 then
   TDCP_blockciper64(Components[i]).EncryptString(F.Text)
//и т.д.

Автор: CODARZ 4.10.2003, 16:40
Цитата
Ну дак посмотри какой предок у этих TDCP_blockciper128, TDCP_blockciper64 до тех пор пока не найдешь общего(TObject ты точно найдешь ))))) ). Если их общий предок не будет обладать нужным тебе методом, то можно сделать так:
Код
for i:=0 to 3 do
 if Components[i] is TDCP_blockciper128 then
   TDCP_blockciper128(Components[i]).EncryptString(F.Text)
 else
 if Components[i] is TDCP_blockciper64 then
   TDCP_blockciper64(Components[i]).EncryptString(F.Text)
//и т.д.

Я нашел, это - TDCP_cipher
надеюсь сработает biggrin.gif

Автор: CODARZ 4.10.2003, 16:44
Цитата
Ну дак посмотри какой предок у этих TDCP_blockciper128, TDCP_blockciper64 до тех пор пока не найдешь общего(TObject ты точно найдешь ))))) ). Если их общий предок не будет обладать нужным тебе методом, то можно сделать так:
Код
for i:=0 to 3 do
 if Components[i] is TDCP_blockciper128 then
   TDCP_blockciper128(Components[i]).EncryptString(F.Text)
 else
 if Components[i] is TDCP_blockciper64 then
   TDCP_blockciper64(Components[i]).EncryptString(F.Text)
//и т.д.

Кажется работает, вот только боюсь как бы не было проблем
в способах шифрования, а то вдруг чего неправильно зашифруется...

Автор: <Spawn> 4.10.2003, 16:53
Ну говорю же проверяй операцией is на принадлежность к тому или иному классу и затем делай так как я уже писал.

Автор: CODARZ 4.10.2003, 17:07
Цитата
Ну говорю же проверяй операцией is на принадлежность к тому или иному классу и затем делай так как я уже писал.

Да, все работает, судя по тестам кажется правильно.
Спасбо тебе, из этой темы я узнал много нового и полезного
для себя smile.gif

Автор: <Spawn> 4.10.2003, 17:25
Всегда пожалста smile.gif

Автор: var-alex 7.10.2003, 08:14
Слушайте, народ. а компоненты на форме лежат?? Тогда может проще было так:

Код

for i:=0 to 3 do
 begin
    Comp := FindComponent(format('component%d',[i]));
    if comp <> nil then
       begin
          // Делаем что надо с этим компонентом....
       end;
 end;

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)