Главная страница
    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.
Помнится я его пожалел, сказав что ему приходится целыми днями железными клещами вытаскивать информацию у новичков и начинающих.
Теперь и я на его месте.



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

Форум: "Основная";
Текущий архив: 2006.10.22;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.55 MB
Время: 0.046 c
15-1159453810
Орион
2006-09-28 18:30
2006.10.22
Информационный объем фразы


1-1158052079
Моновар
2006-09-12 13:07
2006.10.22
Вопрос по TreeView


5-1141655939
werr
2006-03-06 17:38
2006.10.22
Нужен компонент для создания RAR-архивов


2-1160029598
pathfinder
2006-10-05 10:26
2006.10.22
Вопрос по работе с ini-файлами..


15-1159763347
Kati
2006-10-02 08:29
2006.10.22
Нужна помощь





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