Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.10.22;
Скачать: CL | DM;

Вниз

Как получить инфо о property, об`явленом НЕ published?   Найти похожие ветки 

 
i-am-vladko ©   (2006-09-07 19:58) [0]

Как получить инфо о property, об`явленом НЕ published, run-time?


 
Loginov Dmitry ©   (2006-09-07 23:42) [1]

Много инфы все-равно не получишь (имена таких свойств точно нигде не хранятся)


 
i-am-vladko ©   (2006-09-07 23:59) [2]

а что можно выжать? и как...


 
Loginov Dmitry ©   (2006-09-08 07:37) [3]

> а что можно выжать? и как...


Прочитать справку о том, как устроен класс, то каким адресам искать нужные таблицы. (Я в подробности не вдавался, но могу предположить, что о НЕ published-свойствах информации вообще никакой не найдешь. Все необходимые ссылки разрешаются еще на эпате компиляции, т.е. вызовы таких свойств превращаются к обращениям к методам (статическим, динамическим, виртуальным), и полям класса. Короче, обрадовал. Теперь хелп читай (и сам пожалуй почитаю) :))


 
dethcon   (2006-09-08 10:51) [4]

sorry, о как же VMT? DMT?


 
Джо ©   (2006-09-08 10:53) [5]

> [4] dethcon   (08.09.06 10:51)
> sorry, о как же VMT? DMT?

А что с ними?


 
Ketmar ©   (2006-09-08 11:06) [6]

> [5] Джо ©   (08.09.06 10:53)
болеют...


 
i-am-vladko ©   (2006-09-08 11:49) [7]

Как я понимаю, при включенной на классе директиве {$M+} происходит создание RTTI для published property`s. При етом методы, реализующие property, об`явлены в VMT. Если метод виртуальный, то он тоже об`является в VMT. ТОГДА ПОЧЕМУ НЕ РАБОТАЕТ (возвращает nil):
TAlphObject =  class
public
   procedure SetID(parID : Int64); virtual;
end;
{...code...................}
procedure TForm1.BitBtn1Click(Sender: TObject);
var
   ss : TAlphObject;
   P : pointer;
begin
 ss := TAlphObject.Create;
 P := ss.MethodAddress("SetID");
end;


 
Ketmar ©   (2006-09-08 11:53) [8]

> [7] i-am-vladko ©   (08.09.06 11:49)
ну и что, что говорили о published, а сделали public? какая нам разница, property это или method? ерунда. мелочи.


 
Джо ©   (2006-09-08 11:53) [9]

> [7] i-am-vladko ©   (08.09.06 11:49)
> Как я понимаю, при включенной на классе директиве {$M+}
> происходит создание RTTI для published property`s. При етом
> методы, реализующие property, об`явлены в VMT. Если метод
> виртуальный, то он тоже об`является в VMT. ТОГДА ПОЧЕМУ
> НЕ РАБОТАЕТ (возвращает nil):
> TAlphObject =  class
> public
>   procedure SetID(parID : Int64); virtual;
> end;
> {...code...................}
> procedure TForm1.BitBtn1Click(Sender: TObject);
> var
>   ss : TAlphObject;
>   P : pointer;
> begin
> ss := TAlphObject.Create;
> P := ss.MethodAddress("SetID");
> end;


Для начала, давай разберемся, где в приведенном коде published property? Пока вижу только public method.


 
i-am-vladko ©   (2006-09-08 11:59) [10]

Сори, не об`яснил - моя вина ))
К проперти никак не доберешся ((
Пробую добраться к методам ;-)


 
Джо ©   (2006-09-08 12:01) [11]

> [10] i-am-vladko ©   (08.09.06 11:59)
> Пробую добраться к методам ;-)

Посоветую начать пробовать с чтения Справки по MethodAddress, в коей ясно написано: "Returns the address of a published method".


 
i-am-vladko ©   (2006-09-08 12:04) [12]

Спасибо, не знал...
А какой тогда может быть выход???


 
Джо ©   (2006-09-08 12:06) [13]

> [12] i-am-vladko ©   (08.09.06 12:04)
> А какой тогда может быть выход???

А какую проблему мы на данном этапе обсуждаем? запамятовал уже, мысли скачут, как блохи :)


 
i-am-vladko ©   (2006-09-08 12:10) [14]

как добраться к методу, без создания для него published property?


 
DiamondShark ©   (2006-09-08 12:17) [15]


> как добраться к методу, без создания для него published
> property?

Объявить его в published секции.


 
Наиль ©   (2006-09-08 12:20) [16]


TYourClass=class
public
procedure Method;
End;

procedure TForm1.Button1Click(Sender:TObject);
begin
YourClass.Method;
End;

Я добрался до не Published-метода, но я подозреваю, что ты не это имел в виду.


 
Джо ©   (2006-09-08 12:20) [17]

> [14] i-am-vladko ©   (08.09.06 12:10)
> как добраться к методу, без создания для него published
> property?

Ну при чем здесь "published property"? Нельзя получить указатель на паблик-метод по его имени. И всё.
А может, лучше "зайти со стороны задачи"? Для какой цели это всё затевается?


 
i-am-vladko ©   (2006-09-08 12:32) [18]

Задача - унифицировать поиск property Field по его имени и типу в базовом классе.


 
i-am-vladko ©   (2006-09-08 12:34) [19]

>Нельзя получить указатель на паблик-метод по его имени. И всё.
ну тогда и задача падает...


 
i-am-vladko ©   (2006-09-08 12:40) [20]

а все-таки ПОЧЕМУ НЕЛЬЗЯ? Если об`явить virtual - будет регистрация в VMT, есть ли способ взять указатель оттуда?


 
default ©   (2006-09-08 12:46) [21]

i-am-vladko ©   (08.09.06 12:40) [20]

> Если об`явить virtual - будет регистрация в VMT, есть ли
> способ взять указатель оттуда?

есть, правда метод, смещение в vmt которого ищется, должен быть задан во время компиляции(с указанием класса)


 
i-am-vladko ©   (2006-09-08 12:47) [22]

O! поподробнее, PLZ )))


 
Джо ©   (2006-09-08 12:55) [23]

> [20] i-am-vladko ©   (08.09.06 12:40)
> а все-таки ПОЧЕМУ НЕЛЬЗЯ? Если об`явить virtual - будет
> регистрация в VMT, есть ли способ взять указатель оттуда?

Опять двадцать пять! VMT! :) А что, в VMT хранятся имена методов?


 
Джо ©   (2006-09-08 12:56) [24]

> [18] i-am-vladko ©   (08.09.06 12:32)
> Задача - унифицировать поиск property Field по его имени
> и типу в базовом классе.

А может, это не "задача", а "способ реализации"? Для чего это нужно на более высоком уровне абстракции?


 
default ©   (2006-09-08 13:02) [25]

I>
> Если об`явить virtual - будет регистрация в VMT, есть ли
> способ взять указатель оттуда?

@TMyClass.MyMethod; :) и пофигу как он там виртуальный или позолоченный


 
i-am-vladko ©   (2006-09-08 13:07) [26]

Куда уж более...


 
i-am-vladko ©   (2006-09-08 13:16) [27]

>@TMyClass.MyMethod; :) и пофигу как он там виртуальный или позолоченный
дык.. проблема-то ето самое MyMethod как parametr задать - имя знать нужно, считать... кто знает откуда...
нигде имени нет ((
полный облом


 
{KRYAK}   (2006-09-08 13:30) [28]

А почему бы не генерить DLL?


 
Наиль ©   (2006-09-08 13:30) [29]


> дык.. проблема-то ето самое MyMethod как parametr задать
> - имя знать нужно, считать... кто знает откуда...

Нам не понятно откуда могла взяться такая задача.
Если класс в программе не используется, то естественно, ты не сможешь вызвать его методы. Если используется, то имена методов класса известны.
Значит можно написть что-то вроде:
Procedure ExecuteProc(ProcName:string)
begin
if ProcName="Metod1" then YourClass.Metod1 else
if ProcName="Metod2" then YourClass.Metod2 else
...
... else TException.Create("ВигВам!");
end;


 
{KRYAK}   (2006-09-08 13:34) [30]

>Procedure ExecuteProc(ProcName:string)
>begin
>if ProcName="Metod1" then YourClass.Metod1 else
>if ProcName="Metod2" then YourClass.Metod2 else
>...
>... else TException.Create("ВигВам!");
>end;

Конечно, можно и так. Идея в другом - унифицировать в ето в базовом классе, не прописывая ЕxecuteProc(...) по всей иерархии


 
Наиль ©   (2006-09-08 13:39) [31]

Расскажи про иерархию по подробней, может чем-то и поможем.


 
Наиль ©   (2006-09-08 13:42) [32]


>  [31] Наиль ©   (08.09.06 13:39)

Думал [30] написано автором ветки. Ошибся.


 
i-am-vladko ©   (2006-09-08 13:45) [33]

Кажется, сама иерархия роли не играет. Class - то самый что ни на есть базовый. Все остальные - потомки


 
Наиль ©   (2006-09-08 13:49) [34]


>  [33] i-am-vladko ©   (08.09.06 13:45)

Всё равно, объясни откуда взялась такая задача?


 
i-am-vladko ©   (2006-09-08 14:00) [35]

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


 
Наиль ©   (2006-09-08 14:02) [36]

Поясняю свой вопрос

> Да вроде ясно должно быть... входящие параметры - имя (Property
> : string, тип : string). Из любого класса пишем имя, тип
> - получаем значение поля для етого класса.

А зачем?


 
Джо ©   (2006-09-08 14:03) [37]

> [35] i-am-vladko ©   (08.09.06 14:00)
> Да вроде ясно должно быть... входящие параметры - имя (Property
> : string, тип : string). Из любого класса пишем имя, тип
> - получаем значение поля для етого класса.

Рискну, еще раз заметить, что это не "задача", а подробности реализации.


 
i-am-vladko ©   (2006-09-08 14:11) [38]

Блин... поиск фильда, сортировки, сравнения - максимально унифщцировать


 
Наиль ©   (2006-09-08 14:15) [39]


> Блин... поиск фильда, сортировки, сравнения - максимально
> унифщцировать

А зачем?


 
Наиль ©   (2006-09-08 14:19) [40]

Мне тут вспомнился Digitman.
Помнится я его пожалел, сказав что ему приходится целыми днями железными клещами вытаскивать информацию у новичков и начинающих.
Теперь и я на его месте.


 
i-am-vladko ©   (2006-09-08 14:21) [41]

за щкафом )) подскажи лучше как сделать


 
DiamondShark ©   (2006-09-08 14:29) [42]


> подскажи лучше как сделать

Уже подсказали: для не-published членов после компиляции никаких имён не существует.

Тебе пытаются помочь решить задачу, не реализовать какой-то узкоспециализированный механизм, а именно прикладную задачу.
А ты упираешься.

Ну, не хочешь -- никто не заставляет.


 
i-am-vladko ©   (2006-09-08 14:31) [43]

ОК. попробую DLL...


 
Наиль ©   (2006-09-08 14:36) [44]


> за щкафом )) подскажи лучше как сделать

Ещё раз повторю. Нет класса - нет доступа к его методам, есть класс (а появиться в RunTime он не может), то имена методов известны заранее, тогда см. [29]
Раз это тебе не подходит, то значит у тебя особая ситуация. Для особой ситуации нужно особое решение. Опиши ситуацию (как так получается, что в твоей программе появляются новые в RunTime), и тогда ты узнаешь "как лучше сделать"


 
Наиль ©   (2006-09-08 14:40) [45]


> программе появляются новые в RunTime

следует читать программе появляются новые классы в RunTime
PS.
1. Ох уж эти железные клещи
2. И чем тебе пожет DLL?


 
Ketmar ©   (2006-09-08 15:31) [46]

"мастера на форуме играли в гестапо"... не в рифму, размер хромает, но как жизненно! %-)


 
i-am-vladko ©   (2006-09-08 16:21) [47]

Пора закрывать тему...
Новые классы в программе не появляются, хотя сделать ето можно (для новичков (шутка ;-) ) http://www.paxscript.com), но не нужно в моей ситуации.
В данной реализации хотелось сократить код, очень уж похожи методы в разных классах. Достаточно было прописать один - в базовом.
Ето никак не получится (не published, невозможно взять имя), а жаль.


 
default ©   (2006-09-08 16:42) [48]

i-am-vladko ©   (08.09.06 16:21) [47]
единообразие обработки объектов достигается через наследование или интерфейсы

классы-то тобой писаны?


 
i-am-vladko ©   (2006-09-08 16:52) [49]

Да, классы наши (совместный проект).


 
default ©   (2006-09-08 16:58) [50]

i-am-vladko ©   (08.09.06 16:52) [49]
рекомендую подробно изложить условия
возможно есть пути оптимизации
что конкретно значит "очень уж похожи методы в разных классах. " и тд и тп


 
i-am-vladko ©   (2006-09-08 17:41) [51]

>что конкретно значит "очень уж похожи методы в разных классах. " и тд и >тп
Конкретый пример:
поиск об`екта класса TF1 в TF1_List, где TF1 - поле, c параметром parObj1:

<цикл>
если (ObjF1.Field_1 = parObj1.Field_1) and
      ......................................
      (ObjF1.Field_n = parObj1.Field_n) then
то искомый об`ект.

принципиально тот же поиск, в том же классе, но TF1_List состоит из об`ектов TF2 :
<цикл>
если (ObjF2.Field2_1 = parObj2.Field2_1) and
      ......................................
      (ObjF2.Field2_n = parObj2.Field2_n) then
то искомый об`ект.

тот же поиск в совершенно другом классе, TF2_list,
если (ObjF3.Field3_1 = parObj3.Field3_1) and
      ......................................
      (ObjF3.Field3_n = parObj3.Field3_n) then
то искомый об`ект.

Причем и TF1_list, TF2_list i TF3_list - наследники TF_Base
Была мысль етот поиск наследовать из TF_Base...


 
default ©   (2006-09-08 18:02) [52]

i-am-vladko ©   (08.09.06 17:41) [51]
тут безусловно можно исправить положение
надо просто иерархию проектировать продуманно
вот посмотреть бы хотя бы на два класса TF_Base и, например,  на TF1_list


 
Джо ©   (2006-09-08 20:34) [53]

> [51] i-am-vladko ©   (08.09.06 17:41)

Что значит "поиск" поля применительно к классу, который известен на этапе компиляции? Если он известен, то уже известны и имена его полей. Тут путаница какая-то, мне кажется.
Если же просто не известен конкретный потомок объекта в списке (например, в обобщенном списке), то всегда можно применить оператор is.


 
DiamondShark ©   (2006-09-09 13:39) [54]


> i-am-vladko ©   (08.09.06 17:41) [51]

Пусть элементы списков реализуют интерфейс

IComparable = interface
 ["{4A41D8E3-BFFE-4D65-B34F-1731FEDCA490}"]
 function IsEqual(AObject: TObject): boolean;
end;

Тогда смело можно выносить в TF_Base обобщённую процедуру поиска



Страницы: 1 2 вся ветка

Текущий архив: 2006.10.22;
Скачать: CL | DM;

Наверх




Память: 0.61 MB
Время: 0.038 c
2-1159978351
Дом
2006-10-04 20:12
2006.10.22
Реестр и бинарные данные


2-1159784197
Димыч
2006-10-02 14:16
2006.10.22
Процессорное время


4-1149959106
suharew
2006-06-10 21:05
2006.10.22
ComPort компонент


1-1156717580
Spirit111
2006-08-28 02:26
2006.10.22
Сишный класс в качестве параметра функции


2-1160297204
WoW
2006-10-08 12:46
2006.10.22
Нужен толковой пример по работе с интерфейсами...