Консультация № 54919
10.09.2006, 13:30
0.00 руб.
0 2 1
Мир вам, уважаемые эксперты!
Такой вопросик: есть у меня объект TObjectList. Он основательно забит разными объектами большого числа классов. Мне необходима возможность запускать любой метод у всех объектов, лежащих в TObjectList, разом (если, конечно, у объекта данный метод есть). Фактически это система сообщений - т.е. все объекты получают сообщение и те у кого имеется на него обработчик - реагируют.
В принципе, код я написал (см. приложение), он даже работает. Но он мне не нравится - должен быть способ проще. А кроме того хотелось бы иметь возможность задавать методы с различными формальными параметрами.
Что посоветуете?
С уважением, Лука.

Приложение:
//Сейчас сделано следующим образом:varUniversum : TObjectList;// Процедура запускает метод объекта по его имениprocedure TUni.GetBroadcast(mess:string;Subj,Obj:TObject);type PYourMethod = ^TYourMethod; TYourMethod = procedure(Subj,Obj:TObject) of Object;var PAddr: PYourMethod; M: TMethod;begin PAddr := MethodAddress(mess); if PAddr <> nil then begin M.Code := PAddr; M.Data := Self; TYourMethod(M)(Subj,Obj); end;end{GetBroadcast};// Раздача сообщений по всем объектамprocedure Broadcast(mess:string;Subj,Obj:TObject);var i:integer;BEGIN for i:=0 to Universum.Count-1 do begin if Universum.Items[i]=nil then continue; (Universum.Items[i] as TUni).GetBroadcast(mess,Subj,Obj); end{for i};END;

Обсуждение

Неизвестный
10.09.2006, 15:12
общий
это ответ
Здравствуйте, Лука!
Посмотрел код и если честно, непонятно, куда уж проще? Нормальный код. По-поводу "задавать методы с различными формальными параметрами" могу только присоветовать перегрузку (overload) - и далее через try - except.
Неизвестный
10.09.2006, 15:15
общий
Да, ещё. Проверьте, как у вас передаётся параметр mess, может, его лучше по ссылке передавать? (это с ключевым словом var)
Форма ответа