:: Архив конференции по VFP до 2005 года
Runtime. Список измененных методов
Aijik

Сообщений: 2145
Откуда: Ростов-на-Дону
Дата регистрации: 08.01.2002
Привет всем!

Есть вот какая задача. Надо в ран-тайме получить список методов, которые были изменены у некоего объекта на форме. Для свойств эта задача решается просто:

oGridSource = ThisForm.myGrid
AMEMBERS(aInfo,oGridSource,0,"C")
После этого в массиве aInfo будет список свойств, которые изменены (по сравнению с родителем) у данного объекта.
К сожалению, AMEMBERS не предоставляет того же механизма для методов. Потому как
AMEMBERS(aInfo,oGridSource,1,"C")
помимо измененных базовых методов (что есть лишь часть ответа) добавляет в список просто унаследованные методы, которые собственно у самого объекта не были даже тронуты, НО поскольку были изменены у родителей - то изменения эти достались объекту по наследству. Но реально на этой форме, у этого объекта их не меняли - меня не интересует что там было у родительских классов, меня интересует что менялось именно у этого потомка. В общем, хотелось бы получить полный аналог вышеприведенного
AMEMBERS(aInfo,oGridSource,0,"C"), но не для свойств, а для методов. PEMSTATUS имеет поведение полностью аналогичное AMEMBERS. Единственный способ решения который я вообще вижу, это пробежаться по списку методов AMEMBERS(aInfo,oGridSource,1,"C") и проверить их на предмет возвращения пустой строки из oGridSource.ReadMethod("тра-та-та"). Это работает - ReadMethod, в отличие от AMEMBERS и PEMSTATUS не волнует что там было в родителях, если метод в потомке никак не был перегружен - то он вернет пустую строку. Вроде бы все замечательно, но(!) - ReadMethod работает только в дизайн-тайме, а мне надо получить эту инфу в ран-тайме. Какие будут идеи?



Отредактировано (17.02.05 16:46)


------------------
Ratings: 0 negative/0 positive
Re: Runtime. Список измененных методов
PaulWist

Сообщений: 14601
Дата регистрации: 01.04.2004
Не проверял, по хелпу

9-ка

Цитата:
0
Changed.

If the property value, method, or event has changed, PEMSTATUS( ) returns a logical True (.T.). Otherwise, PEMSTATUS( ) returns logical False (.F.).

7-ка

Цитата:
0 Changed (properties only). A logical true (.T.) is returned if the property value has changed from its original, default value; otherwise a logical false (.F.) is returned.

Ещё

если форма Scx , то выгрузить как таблицу и посмотреть SCX.Metods и разобрать строку на предмет вхождения метода.




------------------
Есть многое на свете, друг Горацио...
Что и не снилось нашим мудрецам.
(В.Шекспир Гамлет)
Ratings: 0 negative/0 positive
Re: Runtime. Список измененных методов
Aijik

Сообщений: 2145
Откуда: Ростов-на-Дону
Дата регистрации: 08.01.2002
PaulWist писал(а):
Цитата:
Не проверял, по хелпу

9-ка

Цитата:
0
Changed.

If the property value, method, or event has changed, PEMSTATUS( ) returns a logical True (.T.). Otherwise, PEMSTATUS( ) returns logical False (.F.).

7-ка
Цитата:
0 Changed (properties only). A logical true (.T.) is returned if the property value has changed from its original, default value; otherwise a logical false (.F.) is returned.


0 работает и в восьмерке для методов, хотя и не документировано. 0 как я уже говорил не подходит, т.к. считает измененнием просто унаследованный код


Цитата:
Ещё
если форма Scx , то выгрузить как таблицу и посмотреть SCX.Metods и разобрать строку на предмет вхождения метода.
Да, наверное, но слишком уж через ж... получается , к тому же не будет работать для невизуальных решений
Ratings: 0 negative/0 positive
Re: Runtime. Список измененных методов
PaulWist

Сообщений: 14601
Дата регистрации: 01.04.2004
Цитата:
т.к. считает измененнием просто унаследованный код

Те BaseClass -> FirstChidren -> SecondChildren, и FirstChidren имеет какой-то код в SomeMethod, а мы используем обьект созданный на основе SecondChildren, кот не имеет кода в SomeMethod то PEMSTATUS( ) вернет истину, так что ли.




------------------
Есть многое на свете, друг Горацио...
Что и не снилось нашим мудрецам.
(В.Шекспир Гамлет)
Ratings: 0 negative/0 positive
Re: Runtime. Список измененных методов
Aijik

Сообщений: 2145
Откуда: Ростов-на-Дону
Дата регистрации: 08.01.2002
PaulWist писал(а):
Цитата:
Те BaseClass -> FirstChidren -> SecondChildren, и FirstChidren имеет какой-то код в SomeMethod, а мы используем обьект созданный на основе SecondChildren, кот не имеет кода в SomeMethod то PEMSTATUS( ) вернет истину, так что ли.
Да, к сожалению
Ratings: 0 negative/0 positive
Re: Runtime. Список измененных методов
PaulWist

Сообщений: 14601
Дата регистрации: 01.04.2004
Игорь, слушай, конечно задача описана классически-утилитарно, но какова конечная цель, например построение своего форм-дизайнера, м.б. что-то другое взять за точку отсчета.




------------------
Есть многое на свете, друг Горацио...
Что и не снилось нашим мудрецам.
(В.Шекспир Гамлет)
Ratings: 0 negative/0 positive
Re: Runtime. Список измененных методов
Igor Korolyov
Автор

Сообщений: 34580
Дата регистрации: 28.05.2002
Hi, Aijik!

Дабы жизнь совсем мёдом не казалась, могу сказать что SYS(1269), PEMSTATUS()
и AMEMBERS()
работают весьма разно для vcx и prg классов! GETPEM() НЕ работает для prg
(по крайней мере в части методов) даже в дизайнтайме (что понятно, но не
оправдывает вводящую в заблуждение статью хелпа).
ReadMethod это естественно нехорошее решение, он и в дизайн-тайм странновато
себя ведёт для живых объектов.
А вообще было-бы полезно узнать что именно ты хочешь сделать - зачем тебе
нужна эта информация... Скажем часть проблем решается посредством введения
дополнительных свойств в класс - показывающих есть ли в некотором методе код
или нет, но я вот так с ходу не могу придумать где бы это могло быть
применимо...




------------------
WBR, Igor
Ratings: 0 negative/0 positive
Re: Runtime. Список измененных методов
Aijik

Сообщений: 2145
Откуда: Ростов-на-Дону
Дата регистрации: 08.01.2002
Привет!


PaulWist писал(а):
Цитата:
Игорь, слушай, конечно задача описана классически-утилитарно, но какова конечная цель, например построение своего форм-дизайнера, м.б. что-то другое взять за точку отсчета.
Igor Korolyov писал(а):
Цитата:
А вообще было-бы полезно узнать что именно ты хочешь сделать - зачем тебе
нужна эта информация... Скажем часть проблем решается посредством введения
дополнительных свойств в класс - показывающих есть ли в некотором методе код
или нет, но я вот так с ходу не могу придумать где бы это могло быть
применимо...

Ну дык эта.... Все как всегда проще Причиной изврата, является, как обычно, лень (ну та, которая двигатель прогресса ;)) Влом было класс подменять однотипным контролам, сделал измененный экземпляр и хотел прибиндить его методы к существующим. Ну, такое своебразное "хакерство по-быстрому". Для этого, собственно и нужен был список измененнных методов у нового, чтобы циклом по списку пройтись, да все прибиндить. Ну, в общем, красивого и быстрого решения хотелось - AMEMBERS и вперед. Не тут-то было... В общем, как и положено, классы заменил в результате


Цитата:
Дабы жизнь совсем мёдом не казалась, могу сказать что SYS(1269), PEMSTATUS()
и AMEMBERS()
работают весьма разно для vcx и prg классов! GETPEM() НЕ работает для prg
(по крайней мере в части методов) даже в дизайнтайме (что понятно, но не
оправдывает вводящую в заблуждение статью хелпа)
.....
он (ReadMethod) и в дизайн-тайм странновато
себя ведёт для живых объектов.
Интересно. Можно подробнее?

Цитата:
ReadMethod это естественно нехорошее решение
Другими словами GETPEM хорошее?
"Какие ващи дакасатийльства?" (с) Вопрос на засыпку миллиционеру Шварценеггеру в к/ф "Красная жара"



Отредактировано (21.02.05 08:41)


------------------
Ratings: 0 negative/0 positive
Re: Runtime. Список измененных методов
Igor Korolyov
Автор

Сообщений: 34580
Дата регистрации: 28.05.2002
Hi, Aijik!

Цитата:
Цитата:
он (ReadMethod) и в дизайн-тайм странновато себя ведёт
для живых объектов.
Интересно. Можно подробнее?
Дык посмотри сам как он работает, и когда НЕ работает Всяко проще чем
расписывать в деталях...
Цитата:
Другими словами GETPEM хорошее?
Нет конечно! Я не это имел в виду! Они равноценно плохие И применять их
не нужно.




------------------
WBR, Igor
Ratings: 0 negative/0 positive


Извините, но у вас нет прав для того, чтобы оставлять сообщения в этом форуме.

On-line: 3 (Гостей: 3)

© 2000-2024 Fox Club 
Яндекс.Метрика