Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2009.05.03;
Скачать: 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 вся ветка

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

Наверх




Память: 0.53 MB
Время: 0.016 c
15-1235975335
QuickReport
2009-03-02 09:28
2009.05.03
QuickReport в Delphi 2009


2-1237298818
chubb
2009-03-17 17:06
2009.05.03
запретить два пробела подряд


2-1237800927
Iriss
2009-03-23 12:35
2009.05.03
InputBox


10-1148459999
irena_ok
2006-05-24 12:39
2009.05.03
Создание и заполнениев таблиц в Ворде


4-1208928035
AlexK
2008-04-23 09:20
2009.05.03
TSWStringArray (LPWSTR)