Форум: "Начинающим";
Текущий архив: 2009.05.03;
Скачать: [xml.tar.bz2];
ВнизДействия над группой объектов Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.51 MB
Время: 0.006 c