![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Действия над группой объектов [D7]
StriderMan © (2009-03-20 16:05:00)Есть несколько объектов одного класса. Допустим хранятся на них ссылки в листе.
Нужно у всех объектов вызвать один и тот же метод или поменять одинаково одно и то же свойство. Как это можно сделать не описывая перебиралку списка для каждого метода/свойства?
StriderMan (2009-03-20 18:03:00) [1]
> а класс TPersistent тот самый золотой класс, поменченый директивой {$M+}
все, теперь понял :) Я-то от TControl вообще наследовался.
Спасибо!
Palladin (2009-03-20 17:59:00) [2]
> Иными словами RTTI для класса, зарегистрированного при помощи
> RegisterClass недоступно?
Почему, вполне доступно, RegisterClass вещь хитрая, потому что принимает не любые классы, а классы - наследники от TPersistent, а класс TPersistent тот самый золотой класс, поменченый директивой {$M+}, что в свою очередь означает (как видно из справки по директиве), что все его наследники тоже золотые.
Я то тебе толкую вообще про любой класс, а не только наследник TPersistent.
StriderMan (2009-03-20 17:51:00) [3]
> Доступно? :)
Вполне
Иными словами RTTI для класса, зарегистрированного при помощи RegisterClass недоступно?
тем не менее я использую компоненты, загружаемые из блоб-полей базы с помощью ReadComponent из соответствующего потока. Эти компоненты регистрируются как раз таки процедурой RegisterClasses, директиву не применял (потому как не знал :))
Jack128_ (2009-03-20 17:50:00) [4]
>
> procedure EnumMyComponentListForSomePurpose(AList : TList;
> ACallBack : TMyCallback);
>
> И все.
> Цикл один.
в дельфи проще цикл написать...
Palladin (2009-03-20 17:44:00) [5]
> соответствие имени файла и ссылки класса в список
тьфу млин... имени класса конечно :)
Palladin (2009-03-20 17:43:00) [6]
> в чем отличие процедуры RegisterClasses от директивы {$M+}?
))) А в чем отличие теплого от мягкого?
Но так как у меня сегодня ХММП в одно рыло, то сблаговолю.
RegisterClasses, в отличие от своего гордого названия, всего лишь заносит (это действо гордо названно Регистрацией) соответствие имени файла и ссылки класса в список. Что бы позже по имени класса определить ссылку на класс и вызвать нужный конструктор для создания с использованием функции FindClass (котора всего лишь ищет сопоставление в списке).
Директива {$M+} никаким боком этого процесса не касается, она указывает компилятору рассматривать этот класс как не простой, а золотой, что его нужно холить лелеять и всю информацию о нем, которая находится в секции Published, занести в исполняемый файл, что бы позже можно было к ней обращатся во времени исполнения.
Доступно? :)
StriderMan (2009-03-20 17:34:00) [7]$M
Премного благодарен, вашшсство...Не соблаговолит ли объяснить достопочтенный мастер недостойному падавану в чем отличие процедуры RegisterClasses от директивы {$M+}?
Palladin (2009-03-20 17:26:00) [8]
> StriderMan (20.03.09 17:20) [18]
Если ты зайдешь в раздел справки "Предметный указатель" (или как он там на иностранном), наберешь на клавиатуре в поле ввода под подписью "1. Введите первые буквы нужного слова" два символа $M, потом наведя указатель мыши на найденный пункт дважды нажмешь левую (или правую если ты левша) кнопку мыши, то перед тобой появится выбор из двух разделов. С одним ты уже ознакомлен. Пришла пора ознакомится со вторым. :)
StriderMan (2009-03-20 17:20:00) [9]
> унаследоваться от класса с директивой {$M+}
А это зачем?
help:The $M directive specifies an application's stack allocation parameters
StriderMan (2009-03-20 17:15:00) [10]
> p_vPropVal:Variant
блин, а про Variant я и не подумал. Совсем уже мозг закипел %|
Спасибо!
Palladin (2009-03-20 17:14:00) [11]А нужно всего то, унаследоваться от класса с директивой {$M+} и пихануть свойства в published :) А, ну да, для этого вторые пол жизни нужны...
Palladin (2009-03-20 17:11:00) [12]
> Конечно я обдумывал вариант с 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;
Афикеть как громоздко. Пока напишешь пол жизни потерять можно :)
StriderMan (2009-03-20 17:08:00) [13]
> А он по другому не умеет. RTTI в IDE зайдействована по максимуму.
Конечно я обдумывал вариант с RTTI. Но все это громоздко, кода писать не меньше чем тупо понабрать циклов под все свойства.
Хотелось бы некое изящное решение, абстрагированное от конкретной среды. Но походу его действительно нет.
Вариант с callback интересный, но тут вместо кучи перебиралок писать кучу callback'ов
Palladin (2009-03-20 16:52:00) [14]
> Делфишный редактор свойств наверное так и действует?
А он по другому не умеет. RTTI в IDE зайдействована по максимуму.
StriderMan (2009-03-20 16:52:00) [15]
> вроде большой, а в сказки веришь. IDE запускает перебиралку под ковром
Я понимаю что она есть, но ведь не под каждое свойство.
ЗЫ: куда мне до великого мастера, я маленький еще и глупый.
StriderMan (2009-03-20 16:49:00) [16]
> ясно, переезжаем
Вот блин, а вдруг пацаны с работы пропалят что я в песочнице тусуюсь :D
StriderMan (2009-03-20 16:48:00) [17]
> процедура, в ней цикл, перебирающий список и вызывающая
> колбак функцию переданную параметром.
> procedure EnumMyComponentListForSomePurpose(AList : TList;
> ACallBack : TMyCallback);
А это неплохая мысль. Спасибо!
> если свойства паблишед, то через имена свойств.
Делфишный редактор свойств наверное так и действует?
Dimka Maslov (2009-03-20 16:46:00) [18]Все published свойства и методы досупны по имени через FieldAddress и MethodAddress.
Palladin (2009-03-20 16:46:00) [19]ясно, переезжаем
clickmaker (2009-03-20 16:46:00) [20]> поставили им всем Left := 10; Или Height := 25; или Сказали
> им всем BringToFront;
вроде большой, а в сказки веришь.
IDE запускает перебиралку под ковром