Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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.006 c
4-366
JAndrey
2002-01-31 01:18
2002.04.01
Как сделать автозапуск при загрузке?


1-109
YanKY
2002-03-13 09:22
2002.04.01
Интперпритатор языка Паскаль


3-41
iea
2002-03-07 12:20
2002.04.01
Teкущее значение записи в ADO?


3-4
Daiz13
2002-03-05 10:58
2002.04.01
Создание пользователей Interbase


1-116
Sergy
2002-03-21 16:36
2002.04.01
Длина переменной типа string





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский