Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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
2-1237538453
igorntk
2009-03-20 11:40
2009.05.03
Уникальные поля в DBase


2-1238013715
mreg
2009-03-25 23:41
2009.05.03
Не удается вывести изображение на форму Без VCL!


11-1200007217
!Pharaon!
2008-01-11 02:20
2009.05.03
ListView и Thumbnail (Эскизы изображений)


2-1237265570
petvv
2009-03-17 07:52
2009.05.03
Вопрос по потокам


15-1235949803
Германн
2009-03-02 02:23
2009.05.03
Опять о программистах





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский