Форум: "Основная";
Текущий архив: 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.54 MB
Время: 0.04 c