Форум: "Основная";
Текущий архив: 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)
Спасибо! Все так и есть.
Мне, видимо, бог ума не дал проверить. :))
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2002.04.01;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.008 c