Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.04.01;
Скачать: CL | DM;

Вниз

Массив объектов.   Найти похожие ветки 

 
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)
Спасибо! Все так и есть.
Мне, видимо, бог ума не дал проверить. :))



Страницы: 1 вся ветка

Текущий архив: 2002.04.01;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.008 c
3-9
Андре
2002-03-04 12:07
2002.04.01
IBSQL


3-62
АндрейР
2002-03-08 20:00
2002.04.01
Как выбрать максимальное значение поля?


1-155
SB.John
2002-03-21 12:47
2002.04.01
как узнать сколько памяти занимает какой-либо объект?


1-97
Fredericco
2002-03-21 12:45
2002.04.01
Кто-нибудь знает возможно ли следуещее: написать класс в dll и потом его использовать?


1-208
anod
2002-03-20 12:06
2002.04.01
OpenDialog