Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 10.02.2016, 21:24   #11
min@y™
Цифровой кот
Старожил
 
Аватар для min@y™
 
Регистрация: 29.08.2014
Сообщений: 7,629
По умолчанию

Цитата:
достаточно ли будет обрамить ...блаблабла...
нафига спрашиваешь? просто возьми и попробуй!
Цитата:
Не, Delphi старенькая - 6-ка.
Не надо так!

Расскажу я вам, дружочки, как выращивать грибочки: нужно в поле утром рано сдвинуть два куска урана...
min@y™ вне форума Ответить с цитированием
Старый 21.02.2016, 23:27   #12
ipdd
Пользователь
 
Регистрация: 19.09.2010
Сообщений: 20
По умолчанию

Итак, с RTTI в целом разобрался, свойства по их имени программа "цепляет". Но! Есть проблемы с методами:
есть класс:

Код:
type TParticipant = class(TPersistent)
published
function FreeStyle(template: String): String; virtual; abstract;
end;
у него есть наследник:
Код:
type TFL = class(TParticipant)
published
function FreeStyle(template: String): String; override;
end;
функция:
Код:
type FreeStyle = function(template: String): String of object;
Код:
function Exchange(tag: String; Argument: TObject): String;
var miniTags: String;
Meth: TMethod;
FS: FreeStyle;
FSArg: String;
   begin
   FSArg:=copy(tag,pos('@@',tag)+2,length(tag)-pos('@@',tag)-1);
   Delete(tag,pos('@@',tag),length(tag)-pos('@@',tag)+1);
   Meth:=GetMethodProp(Argument,tag);
   @FS:=Meth.Code;   
   result:=FS(FSArg);
   end;
- сопоставляет с методом, указанным в переменной tag соответствующий метод класса.
При подстановке в качестве аргумента этой функции tag:=FreeStyle@@E:\123.txt программа выдает ошибку типа EPropertyError "Property FreeStyle does not exist". Но ведь этот метод есть и у TParticipant и у его потомка - TFL!!! Почему его не видит программма? Где ошибка?...

Последний раз редактировалось ipdd; 22.02.2016 в 13:58. Причина: не вставил решёточки!
ipdd вне форума Ответить с цитированием
Старый 21.02.2016, 23:42   #13
min@y™
Цифровой кот
Старожил
 
Аватар для min@y™
 
Регистрация: 29.08.2014
Сообщений: 7,629
По умолчанию

Цитата:
функция:
type FreeStyle = function(template: String): String of object;
ой, не надо так! такое именование типов приводит к путанице и багам.
Код:
type 
  TFreeStyleFunc = function(template: String): String of object;
Ну а текст ошибки намекает, что это должно быть свойство процедурного типа, а не явный метод. Могу ошибаться, предупреждаю.

И, таки да, говорю за модератора: я тя прошу, плиз, ну оформляй ты код как врезку (#), иначе хочется просто сломать тебе нос проигнорить твой пост.
Расскажу я вам, дружочки, как выращивать грибочки: нужно в поле утром рано сдвинуть два куска урана...

Последний раз редактировалось min@y™; 21.02.2016 в 23:52.
min@y™ вне форума Ответить с цитированием
Старый 22.02.2016, 00:13   #14
phomm
personality
Старожил
 
Аватар для phomm
 
Регистрация: 28.04.2009
Сообщений: 2,882
По умолчанию

Читая http://docwiki.embarcadero.com/Libra....GetMethodProp ,
я так понял, что это не поиск метода, а поиск ивента (проперти типа метод), чтобы найти то, что Вы ищете, предположу, что надо объявить
Код:
published MahFreeStyle: TFreeStyleFunc; // см коммент выше про тип, я его удваиваю
саму функцию в классе оставить, в конструкторе сделать присвоение MahFreeStyle := FreeStyle; а потом уже поиск и вызов
Код:
Meth := GetMethodProp(Argument,tag);
if not Assigned(Meth) then
// чего-нибудь говорим/эксепшеним
result := TFreeStyleFunc(Meth)(FSArg); // я так кастую тметод'ы для их вызова
за всю цепочку не ручаюсь (чисто по своим соображалкам и понимаю хелпа так написал, без проверки в дельфи), до такого не было надобности, а вот за каст и вызов ручаюсь (использую при мультиподписке на 1 ивент многих обработчиков), а вот Ваш каст (@FS:=Meth.Code) это какой-то мрак.

Последний раз редактировалось phomm; 22.02.2016 в 00:16.
phomm вне форума Ответить с цитированием
Старый 22.02.2016, 14:00   #15
ipdd
Пользователь
 
Регистрация: 19.09.2010
Сообщений: 20
По умолчанию

Цитата:
Сообщение от min@y™ Посмотреть сообщение
И, таки да, говорю за модератора: я тя прошу, плиз, ну оформляй ты код как врезку (#), иначе хочется просто сломать тебе нос проигнорить твой пост.
Виноват-с! Просто не знал, как можно оформить куски кода в такие серенькие поля! Теперь знаю, свой пост поправил, в дальнейшем обязуюсь свято выполнять указанное требование!
ipdd вне форума Ответить с цитированием
Старый 22.02.2016, 14:11   #16
ipdd
Пользователь
 
Регистрация: 19.09.2010
Сообщений: 20
По умолчанию

Вот эту часть кода:
Код:
result := TFreeStyleFunc(Meth)(FSArg);
в упор не могу понять! Можно ка-а-пельку поподробнее?...
Про "проперти типа метод" - здесь Вы очень наглядно объяснили, спасибо огромное!
ipdd вне форума Ответить с цитированием
Старый 22.02.2016, 22:58   #17
phomm
personality
Старожил
 
Аватар для phomm
 
Регистрация: 28.04.2009
Сообщений: 2,882
По умолчанию

Тут кастуется структура(запись/record, тметод не явлется типом функция/процедура/метод) Meth в тип TFreeStyleFunc, получая таким образом указатель на метод конкретного экземпляра класса (указатель неявный, "inplace") и тут же метод вызываем с нужными аргументами.
У Вас примерно то же самое написано, только через явные операции над указателями и с промежуточными переменными, но я такое не пробовал, может быть и так норм, мне просто мой способ видится более понятным.
phomm вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как обратиться к переменной класса в методе, не меняя названия переменных, и убрав модификатор static у переменной класса? nevender Помощь студентам 8 25.01.2016 09:46
C# Как обратиться к методу из другой формы? Таксист Windows Forms 2 24.12.2014 16:59
С++ Builder обращение к методу класса из другого класса Astat Помощь студентам 2 20.01.2013 17:59
Как обратиться к полям базового класса? Azartov Общие вопросы C/C++ 13 03.07.2011 20:32
Как обратиться к методу потомку ? [MI_nor] Общие вопросы по Java, Java SE, Kotlin 4 22.03.2011 08:13