Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2006.10.22;
Скачать: [xml.tar.bz2];

Вниз

Как получить инфо о 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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.59 MB
Время: 0.037 c
2-1160023802
aries
2006-10-05 08:50
2006.10.22
FireBird и Делфи


15-1159283412
TStas
2006-09-26 19:10
2006.10.22
неужели на самом деле что-то может быть за зловредные проги?


2-1159974459
Juri
2006-10-04 19:07
2006.10.22
сортировка итемсов в ListBox


15-1158128560
cyborg
2006-09-13 10:22
2006.10.22
Вон какой бардак творится.


15-1159547174
Makhanev Alexander
2006-09-29 20:26
2006.10.22
Delphi and MS Project





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский