Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Действия над группой объектов [D7]


Страницы:   1 2

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 запускает перебиралку под ковром


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо