Форум: "Основная";
Поиск по всему сайту: delphimaster.net;
Текущий архив: 2002.04.01;
Скачать: [xml.tar.bz2];




Вниз

Массив объектов. 


MaXie   (2002-03-20 12:50) [0]

Каким образом я могу создать массив разнородных объектов, с целью дальнейшей его передачи в процедуру или функцию?
Речь идет вот о чем. Есть группа элементов Edit и Label расположенных на форме Form1. Я хочу в процедуре, по нажатию кнопки, менять у выбранных элементов менять свойство Color. Как я могу сформировать массив объектов, свойство Color которых подлежит изменению, с целью дальнейшей его передачи в процедуру?



Alx2   (2002-03-20 12:53) [1]

Находим класс с нужным свойством Color, общий для всех объектов, которые собираемся хранить в массиве. И делаем массив, элементы которого являются экземплярами вышеуказанного класса.



Виктор Щербаков   (2002-03-20 12:55) [2]

Вариантов решения много.
Можно использовать массив of TComponent.
Можно изменить свойство Tag у компонентов, свойство Color которых подлежит изменению. А затем искать их через свойство Components у владельца.
Можно еще много всего придумать.



Digitman   (2002-03-20 12:56) [3]

array[..] of TControl;



reonid   (2002-03-20 13:00) [4]

В самом общем случае можно сделать так:

procedure SetPropToObjects(const PropName: string; PropVal: Variant; Objs: array of const);
var i: Integer;
begin
for i := 0 to High(Objs) do
begin
if Objs[i].VType <> vtObject then Continue;
SetPropValue(Objs[i].VObject, PropName, PropVal);
end;
end;



MaXie   (2002-03-20 15:10) [5]

Ни array [..] of TControl, ни array [..] of TComponent не проходит. Оно то и понятно. Элементы класса TEdit и др. размещены на панели Panel1, которая и является собственником оных. В результате свойство Color меняется не у элемента(-ов) класса TEdit, а у самого собственника, т.е. у элемента Panel1.

Есть объявление:
procedure TForm1.TEditActive(W: array of TControl);
var
i : Integer;
begin
for i := 0 to 1 do
begin
with W[i] do
begin
Color := clCaptionText;
Font.Color := clWindowText
end
end;

, а также объявление массива:
W : array [0..1] of TControl;

Если теперь "кликнуть" по кнопке, процедура обработки клика которой выглядит следующим образом:
procedure TForm1.Button2Click(Sender: TObject);
begin
W[0] := Edit1;
W[1] := Edit2;
TEditActive(W)
end;

Изменится цвет панели Panel1, но ни как не цвет элементов Edit1 и Edit2. Как сформировать массив элементов (не только класса TEdit!), с целью дальнейшей передачи в функцию TEditActive?

To reonid: функция SetPropValue стандартная? (просто не нашел в описании к Delphi)

To Виктор Щербаков, Alex2: большое спасибо за ответы, но можно чуть по-подробнее (, если несложно привести фрагмент кода, понятное дело, для ламера :))



MBo   (2002-03-20 15:16) [6]

for i:=0 to Panel1.ControlCount-1 do
if Panel1.Controls[i] is TLabel then
TLabel(Panel1.Controls[i]).Color:=clBlue;



Digitman   (2002-03-20 15:24) [7]

а это уже твои проблемы - как рекурсивно перечислить компоненты перечисляемых владельцев. Способов на то - куча, выбирай сам !
Но ! Вопрос-то твой был поставлен как ?

"Каким образом я могу создать массив разнородных объектов, с целью дальнейшей его передачи в процедуру или функцию?
"
Не заполнить по какому-то алгоритму, а именно - создать !

Вот и создай :

type
TMyArray = array[..] of TControl; // и TEdit и TLabel - наследники TControl !
PMyArray = ^TMyArray;
var
MyArray : TMyArray;
или
MyArray : PMyArray; // с последующим дин.выделением памяти



Alx2   (2002-03-20 15:36) [8]

>MaXie © (20.03.02 15:10)
--------
Ни array [..] of TControl, ни array [..] of TComponent не проходит. Оно то и понятно. Элементы класса TEdit и др. размещены на панели Panel1, которая и является собственником оных. В результате свойство Color меняется не у элемента(-ов) класса TEdit, а у самого собственника, т.е. у элемента Panel1.
------------
Потому что свойство Color - protected

Сохраняя твой подход, внесу поправки:
Пишешь:

type TMyControl = class(tControl)
property Color;
end;




А все остальное, кроме места с жирным шрифтом, как у тебя.

---------------------
Есть объявление:
procedure TForm1.TEditActive(W: array of TControl);
var
i : Integer;
begin
for i := 0 to 1 do
begin
with TMyControl(W[i]) do
begin
Color := clCaptionText;
Font.Color := clWindowText
end
end;

, а также объявление массива:
W : array [0..1] of TControl;

Если теперь "кликнуть" по кнопке, процедура обработки клика которой выглядит следующим образом:
procedure TForm1.Button2Click(Sender: TObject);
begin
W[0] := Edit1;
W[1] := Edit2;
TEditActive(W)
end;

--------------------



Alx2   (2002-03-20 15:39) [9]

Вдогонку: (Alx2 © (20.03.02 15:36))
В этом месте:
type TMyControl = class(tControl)
property Color;
end;

пречисли все свойства TControl, к которым хочешь достучаться.
Так, в случае работы со шрифтом:

type TMyControl = class(tControl)
property Color;
property Font;
end;




reonid   (2002-03-20 15:42) [10]

>Alx2
достаточно
type TMyControl = class(TControl) end;
Все защищённые св-ва класса видны в модуле, в котором он объявлен



Alx2   (2002-03-20 15:47) [11]

>reonid © (20.03.02 15:42)
Спасибо! Все так и есть.
Мне, видимо, бог ума не дал проверить. :))




Форум: "Основная";
Поиск по всему сайту: delphimaster.net;
Текущий архив: 2002.04.01;
Скачать: [xml.tar.bz2];




Наверх





Память: 0.74 MB
Время: 0.024 c
1-207             tovSuhov              2002-03-20 12:29  2002.04.01  
Опять фокус с фокусом...


1-195             Manulo                2002-03-19 23:17  2002.04.01  
Всё теже компоненты!!!!


1-228             Nikolay               2002-03-20 16:54  2002.04.01  
Немного о компонентах.


1-154             FoxerMoxer            2002-03-21 18:44  2002.04.01  
СРОЧНО!


14-299            Igor E. Timofeev      2002-02-19 03:24  2002.04.01  
Время жизни программы.