Вниз
Скачать: CL | DM;

Действия над группой объектов   Найти похожие ветки 

← →
StriderMan   (2009-03-20 16:05) [0]

Есть несколько объектов одного класса. Допустим хранятся на них ссылки в листе.
Нужно у всех объектов вызвать один и тот же метод или поменять одинаково одно и то же свойство. Как это можно сделать не описывая перебиралку списка для каждого метода/свойства?


← →
Palladin ©   (2009-03-20 16:15) [1]

еще раз


← →
Медвежонок Пятачок ©   (2009-03-20 16:25) [2]

а никак.
перебиралка будет по любому.


← →
немо2   (2009-03-20 16:36) [3]

есть же возможность ввести св-во одинаковое для всех объектов класса.
или чего путаю?


← →
StriderMan   (2009-03-20 16:42) [4]


> еще раз

пример из жизни: редактор компонентов. выделили 10 кнопок и поставили им всем Left := 10; Или Height := 25; или Сказали им всем BringToFront;
Как такое сделать чтобы НЕ писать под каждое свойство/метод конструкцию типа
for i := 0 to ComponentCount - 1 do
 (Components[1] as TMyControl).MyProperty := MyValue;


← →
Медвежонок Пятачок ©   (2009-03-20 16:45) [5]

если свойства паблишед, то через имена свойств.
если не только паблишед, то  элементарно.

процедура, в ней цикл, перебирающий список и вызывающая колбак функцию переданную параметром.

procedure EnumMyComponentListForSomePurpose(AList : TList; ACallBack : TMyCallback);

И все.
Цикл один.


← →
StriderMan   (2009-03-20 16:46) [6]


> перебиралка будет по любому

понятно что будет, но хотелось бы чтобы не под каждый метод/свойства а одна на всё. ну максимум две-три :)


← →
clickmaker ©   (2009-03-20 16:46) [7]

> поставили им всем Left := 10; Или Height := 25; или Сказали
> им всем BringToFront;

вроде большой, а в сказки веришь.
IDE запускает перебиралку под ковром


← →
Palladin ©   (2009-03-20 16:46) [8]

ясно, переезжаем


← →
Dimka Maslov ©   (2009-03-20 16:46) [9]

Все published свойства и методы досупны по имени через FieldAddress и MethodAddress.


← →
StriderMan   (2009-03-20 16:48) [10]


> процедура, в ней цикл, перебирающий список и вызывающая
> колбак функцию переданную параметром.
> procedure EnumMyComponentListForSomePurpose(AList : TList;
>  ACallBack : TMyCallback);

А это неплохая мысль. Спасибо!


> если свойства паблишед, то через имена свойств.

Делфишный редактор свойств наверное так и действует?


← →
StriderMan   (2009-03-20 16:49) [11]


> ясно, переезжаем

Вот блин, а вдруг пацаны с работы пропалят что я в песочнице тусуюсь :D


← →
StriderMan   (2009-03-20 16:52) [12]


> вроде большой, а в сказки веришь. IDE запускает перебиралку под ковром

Я понимаю что она есть, но ведь не под каждое свойство.

ЗЫ: куда мне до великого мастера, я маленький еще и глупый.


← →
Palladin ©   (2009-03-20 16:52) [13]


> Делфишный редактор свойств наверное так и действует?

А он по другому не умеет. RTTI в IDE зайдействована по максимуму.


← →
StriderMan   (2009-03-20 17:08) [14]


> А он по другому не умеет. RTTI в IDE зайдействована по максимуму.

Конечно я обдумывал вариант с RTTI. Но все это громоздко, кода писать не меньше чем тупо понабрать циклов под все свойства.

Хотелось бы некое изящное решение, абстрагированное от конкретной среды. Но походу его действительно нет.

Вариант с callback интересный, но тут вместо кучи перебиралок писать кучу callback"ов


← →
Palladin ©   (2009-03-20 17:11) [15]


> Конечно я обдумывал вариант с RTTI. Но все это громоздко,
>  кода писать не меньше чем тупо понабрать циклов под все
> свойства.

Uses
TypInfo

Procedure SetProps(p_theList:TList;Const p_strPropName:String;Const p_vPropVal:Variant);
Var
 i:Integer;
Begin
 For i:=0 to p_theList.Count-1 Do
  SetPropValue(TObject(p_theList[i]),p_strPropName,p_vPropVal);
End;


Афикеть как громоздко. Пока напишешь пол жизни потерять можно :)


← →
Palladin ©   (2009-03-20 17:14) [16]

А нужно всего то, унаследоваться от класса с директивой {$M+} и пихануть свойства в published :) А, ну да, для этого вторые пол жизни нужны...


← →
StriderMan   (2009-03-20 17:15) [17]


> p_vPropVal:Variant

блин, а про Variant я и не подумал. Совсем уже мозг закипел %|
Спасибо!


← →
StriderMan   (2009-03-20 17:20) [18]


> унаследоваться от класса с директивой {$M+}

А это зачем?

help:The $M directive specifies an application"s stack allocation parameters


← →
Palladin ©   (2009-03-20 17:26) [19]


> StriderMan   (20.03.09 17:20) [18]

Если ты зайдешь в раздел справки "Предметный указатель" (или как он там на иностранном), наберешь на клавиатуре в поле ввода под подписью "1. Введите первые буквы нужного слова" два символа $M, потом наведя указатель мыши на найденный пункт дважды нажмешь левую (или правую если ты левша) кнопку мыши, то перед тобой появится выбор из двух разделов. С одним ты уже ознакомлен. Пришла пора ознакомится со вторым. :)


← →
StriderMan   (2009-03-20 17:34) [20]

$M
Премного благодарен, вашшсство...Не соблаговолит ли объяснить достопочтенный мастер недостойному падавану в чем отличие процедуры RegisterClasses от директивы {$M+}?


← →
Palladin ©   (2009-03-20 17:43) [21]


> в чем отличие процедуры RegisterClasses от директивы {$M+}?

))) А в чем отличие теплого от мягкого?
Но так как у меня сегодня ХММП в одно рыло, то сблаговолю.

RegisterClasses, в отличие от своего гордого названия, всего лишь заносит (это действо гордо названно Регистрацией) соответствие имени файла и ссылки класса в список. Что бы позже по имени класса определить ссылку на класс и вызвать нужный конструктор для создания с использованием функции FindClass (котора всего лишь ищет сопоставление в списке).

Директива {$M+} никаким боком этого процесса не касается, она указывает компилятору рассматривать этот класс как не простой, а золотой, что его нужно холить лелеять и всю информацию о нем, которая находится в секции Published, занести в исполняемый файл, что бы позже можно было к ней обращатся во времени исполнения.

Доступно? :)


← →
Palladin ©   (2009-03-20 17:44) [22]


> соответствие имени файла и ссылки класса в список

тьфу млин... имени класса конечно :)


← →
Jack128_   (2009-03-20 17:50) [23]


>
> procedure EnumMyComponentListForSomePurpose(AList : TList;
>  ACallBack : TMyCallback);
>
> И все.
> Цикл один.

в дельфи проще цикл написать...


← →
StriderMan   (2009-03-20 17:51) [24]


> Доступно? :)

Вполне

Иными словами RTTI для класса, зарегистрированного при помощи RegisterClass недоступно?
тем не менее я использую компоненты, загружаемые из блоб-полей базы с помощью ReadComponent из соответствующего потока. Эти компоненты регистрируются как раз таки процедурой RegisterClasses, директиву не применял (потому как не знал :))


← →
Palladin ©   (2009-03-20 17:59) [25]


> Иными словами RTTI для класса, зарегистрированного при помощи
> RegisterClass недоступно?

Почему, вполне доступно, RegisterClass вещь хитрая, потому что принимает не любые классы, а классы - наследники от TPersistent, а класс TPersistent тот самый золотой класс, поменченый директивой {$M+}, что в свою очередь означает (как видно из справки по директиве), что все его наследники тоже золотые.
Я то тебе толкую вообще про любой класс, а не только наследник TPersistent.


← →
StriderMan   (2009-03-20 18:03) [26]


> а класс TPersistent тот самый золотой класс, поменченый директивой {$M+}

все, теперь понял :) Я-то от TControl вообще наследовался.

Спасибо!



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

Скачать: CL | DM;



Память: 0.51 MB
Время: 0.009 c
15-1235981006
БарЛог
2009-03-02 11:03
2009.05.03
Может ли скрипт узнать, для какой страницы его вызывают?


2-1234419532
vegarulez
2009-02-12 09:18
2009.05.03
Как правильно разбирать xml?


2-1237446555
D@nger
2009-03-19 10:09
2009.05.03
Форматирование чисел


15-1235943001
Юрий
2009-03-02 00:30
2009.05.03
С днем рождения ! 2 марта 2009 понедельник


15-1235856601
Юрий
2009-03-01 00:30
2009.05.03
С днем рождения ! 1 марта 2009 воскресенье




   Наверх