:: Visual Foxpro, Foxpro for DOS
Как узнать существует ли oSecond в составе oFirst и если да, существует ли Property1 в составе oFirst.oSecond?:
AdamAry

Сообщений: 843
Дата регистрации: 14.12.2015
Всем привет.

Имеем гарантировано oFirst и код, где надо проверять на oFirst.oSecond.Property1:

Как узнать существует ли oSecond в составе oFirst и если да, существует ли Property1 в составе oFirst.oSecond?:
1. oFirst.oSecond
2. oFirst.oSecond.Property1
Ratings: 0 negative/0 positive
Re: Как узнать существует ли oSecond в составе oFirst и если да, существует ли Property1 в составе oFirst.oSecond?:
ssa

Сообщений: 12999
Откуда: Москва
Дата регистрации: 23.03.2005
FAQ, как обычно, не смотрим...
Как проверить факт существования переменной памяти, поля таблицы, метода формы


------------------
Лень - это неосознанная мудрость.




Исправлено 1 раз(а). Последнее : ssa, 25.04.17 14:33
Ratings: 0 negative/1 positive
Re: Как узнать существует ли oSecond в составе oFirst и если да, существует ли Property1 в составе oFirst.oSecond?:
Владимир Максимов

Сообщений: 14095
Откуда: Москва
Дата регистрации: 02.09.2000
Как проверить факт существования переменной памяти, поля таблицы, метода формы

В самом конце про форму, но можно использовать с любым объектом. Тебе нужно Type() и PEMStatus()
Ratings: 0 negative/1 positive
Re: Как узнать существует ли oSecond в составе oFirst и если да, существует ли Property1 в составе oFirst.oSecond?:
AdamAry

Сообщений: 843
Дата регистрации: 14.12.2015
?VARTYPE(_screen.oFirst.oSecond)
исправил: вместо TYPE я тестировал VARTYPE.
Unknown member OFIRST (Error 1925)



Исправлено 1 раз(а). Последнее : AdamAry, 25.04.17 15:54
Ratings: 0 negative/0 positive
Re: Как узнать существует ли oSecond в составе oFirst и если да, существует ли Property1 в составе oFirst.oSecond?:
ssa

Сообщений: 12999
Откуда: Москва
Дата регистрации: 23.03.2005
AdamAry
?TYPE(_screen.oFirst.oSecond)
Unknown member OFIRST (Error 1925)
Справку по функции читать не пробовали?
?TYPE('_screen.oFirst.oSecond')


------------------
Лень - это неосознанная мудрость.
Ratings: 0 negative/1 positive
Re: Как узнать существует ли oSecond в составе oFirst и если да, существует ли Property1 в составе oFirst.oSecond?:
Sawradym

Сообщений: 2244
Откуда: Винница
Дата регистрации: 15.05.2007
ssa
AdamAry
?TYPE(_screen.oFirst.oSecond)
Unknown member OFIRST (Error 1925)
Справку по функции читать не пробовали?
?TYPE('_screen.oFirst.oSecond')

Вдогонку, как вариант:
?VARTYPE(_screen.oFirst.oSecond)

но я бы использовал "матрешку" с PEMstatus()
If PEMstatus(_screen,'oFirst',5)
If PEMstatus(_screen.oFirst,'oSecond',5)
...
Ratings: 0 negative/1 positive
Re: Как узнать существует ли oSecond в составе oFirst и если да, существует ли Property1 в составе oFirst.oSecond?:
Igor Korolyov
Автор

Сообщений: 34580
Дата регистрации: 28.05.2002
vartype выкидывает ошибку если нет объекта "по пути". Type просто пытается достучаться, и гасит все возникающие по ходу дела ошибки - если ошибки были то вернёт 'U' и всё.
Писать кучу pemstatus как по мне так непродуктивно (один - т.е. когда нет никакой "цепочки" - другое дело). Тем более что "наличие" свойства ещё не гарантирует что там будет ссылка на объект - т.е. без type/vartype всё одно не обойтись.
И я не в курсе как каждый из них поведёт себя если у "промежуточного" свойства будет _access метод чего-то там возвращающий в зависимости от внешних условий.
Кроме того не факт что это всё адекватно работает с нефоксовыми объектами (если речь про COM-сервера).


------------------
WBR, Igor
Ratings: 0 negative/1 positive
Re: Как узнать существует ли oSecond в составе oFirst и если да, существует ли Property1 в составе oFirst.oSecond?:
Sawradym

Сообщений: 2244
Откуда: Винница
Дата регистрации: 15.05.2007
Igor Korolyov
vartype выкидывает ошибку если нет объекта "по пути". Type просто пытается достучаться, и гасит все возникающие по ходу дела ошибки - если ошибки были то вернёт 'U' и всё.
Писать кучу pemstatus как по мне так непродуктивно (один - т.е. когда нет никакой "цепочки" - другое дело). Тем более что "наличие" свойства ещё не гарантирует что там будет ссылка на объект - т.е. без type/vartype всё одно не обойтись.

ну если уж копать до самого дна, то type/vartype для объекта возвращают 'O' даже в случае если там реально null, следовательно не помешает проверить type('object.Name'), а для класса Empty и это не выход. Вобщем универсального решения нет. Какие уж тут могут быть универсальные формы для справочников.
Ratings: 0 negative/1 positive
Re: Как узнать существует ли oSecond в составе oFirst и если да, существует ли Property1 в составе oFirst.oSecond?:
Igor Korolyov
Автор

Сообщений: 34580
Дата регистрации: 28.05.2002
Ну, автору нужен был не промежуточный результат, а "окончательный" - так что один "общий" TYPE() должен сработать.

VARTYPE() для переменной/свойства типа Object но содержащей NULL (например ссылка на уже закрытую форму или уничтоженный объект) возвращает не 'O' по умолчанию, а 'X' - только если второй параметр указать .T. то вернёт 'O' аналогично TYPE()


------------------
WBR, Igor
Ratings: 0 negative/2 positive
Re: Как узнать существует ли oSecond в составе oFirst и если да, существует ли Property1 в составе oFirst.oSecond?:
AdamAry

Сообщений: 843
Дата регистрации: 14.12.2015
Igor Korolyov
vartype выкидывает ошибку если нет объекта "по пути". Type просто пытается достучаться, и гасит все возникающие по ходу дела ошибки - если ошибки были то вернёт 'U' и всё.
Писать кучу pemstatus как по мне так непродуктивно (один - т.е. когда нет никакой "цепочки" - другое дело). Тем более что "наличие" свойства ещё не гарантирует что там будет ссылка на объект - т.е. без type/vartype всё одно не обойтись.
И я не в курсе как каждый из них поведёт себя если у "промежуточного" свойства будет _access метод чего-то там возвращающий в зависимости от внешних условий.
Кроме того не факт что это всё адекватно работает с нефоксовыми объектами (если речь про COM-сервера).

Цитата:
Ну, автору нужен был не промежуточный результат, а "окончательный" - так что один "общий" TYPE() должен сработать.

Получается самый универсальный метод это ?type("o1.o2.o3.o4.o4"), не так ли?:
если "U" значит нет такова объекта.

И для проверки существования свойства?:
?type("o1.o2.o3.o4.o4.Property1")
если "U" значит нет такова свойства, не так ли?

И для проверки существования метода?:
?type("o1.o2.o3.o4.o4.Method1")
если "U" значит нет такова метода, не так ли?



Исправлено 5 раз(а). Последнее : AdamAry, 26.04.17 08:19
Ratings: 0 negative/0 positive
Re: Как узнать существует ли oSecond в составе oFirst и если да, существует ли Property1 в составе oFirst.oSecond?:
AdamAry

Сообщений: 843
Дата регистрации: 14.12.2015
ssa
FAQ, как обычно, не смотрим...
Как проверить факт существования переменной памяти, поля таблицы, метода формы

Спасибо, просмотрел.
Просто многоэтажность объектов смутило.

public aa
aa = NEWOBJECT("clsm")
DEFINE CLASS clsm as CUSTOM
Name="clsm"
MyProperty = "No"
PROCEDURE myMethod
Messagebox("Hi.")
ENDPROC
ENDDEF
MESSAGEBOX(TYPE("aa")) && O
MESSAGEBOX(TYPE("aa.dd")) && U
MESSAGEBOX(TYPE("aa.mymethod")) && U
MESSAGEBOX(PEMSTATUS(aa, "mymethod",5)) && .T.
aa.AddObject('bb')
aa.AddObject('bb','custom')
MESSAGEBOX(TYPE("aa.bb")) && O
MESSAGEBOX(TYPE("aa.mypROPERTY")) && C

Получается существование метода нельзя проверить используя TYPE,
это возможно только с помощью PEMSTATUS(aa, "mymethod",5) на возврат .T., не так ли?

А существование объекта, а также существование свойства объекта легко и просто проверяется при помощи TYPE на возврат "U", не так ли?

Кстати,
Name="clsm"
здесь Name это что то типа
Function Error
в классе
или то же что и?:
MyProperty = "No"



Исправлено 9 раз(а). Последнее : AdamAry, 26.04.17 09:38
Ratings: 0 negative/0 positive
Re: Как узнать существует ли oSecond в составе oFirst и если да, существует ли Property1 в составе oFirst.oSecond?:
Влад Колосов

Сообщений: 22664
Откуда: Ростов-на-Дону
Дата регистрации: 05.05.2005
AdamAry
существует ли oSecond в составе oFirst

У Вас какие-то архитектурные ошибки, т.к. "родитель" всегда знает о существовании "детей", т.к. он же их и создаёт. Такая проверка не нужна при правильно разработанной иерархии исполнения. Если "дети" самоликвидируются, то они обязаны уведомить об этом "родителя".


------------------
Совершенство - это не тогда, когда нельзя
ничего прибавить, а тогда, когда нечего убавить.
Ratings: 0 negative/1 positive
Re: Как узнать существует ли oSecond в составе oFirst и если да, существует ли Property1 в составе oFirst.oSecond?:
of63

Сообщений: 25161
Откуда: Н.Новгород
Дата регистрации: 13.02.2008
Не обязательно "знает". Обьекты типа "Empty" наполняются... чем только не наполняются, в т.ч и такими же "Empty"-обьектами. И вот этот обьект поступает на вход некой программе, программа хочет знать, есть ли такое-то свойство у обьекта (например, этот свойство появилось только недавно, в новое версии программы, а обьект изготовлен в старой). Да хоть тот же SCATTER MEMO NAME m.o - почему бы не проверить наличие необязательного поля в m.o.
Ratings: 0 negative/1 positive
Re: Как узнать существует ли oSecond в составе oFirst и если да, существует ли Property1 в составе oFirst.oSecond?:
Igor Korolyov
Автор

Сообщений: 34580
Дата регистрации: 28.05.2002
Наличие методов TYPE, естественно, не проверяет. И вообще в нормальной программе крайне низка надобность в подобной проверке. Архитектурные уродцы, конечно, потребуют не только проверки на "наличие метода", но и массы другого г*нокода для своей работы


------------------
WBR, Igor
Ratings: 0 negative/1 positive
Re: Как узнать существует ли oSecond в составе oFirst и если да, существует ли Property1 в составе oFirst.oSecond?:
AdamAry

Сообщений: 843
Дата регистрации: 14.12.2015
Igor Korolyov
Наличие методов TYPE, естественно, не проверяет.
Ну и оставим
TYPE:
только для проверки наличия:
1. объекта в сложной иерархии объектов:
IF NOT TYPE("o1.o2.o3.o4") == "U"
или
TYPE:
2. свойства в сложной иерархии объектов
IF NOT TYPE("o1.o2.o3.o4.property1" == "U" )
PEMSTATUS:
3. а для метода придётся поступить по другому (ефстественно только после проверки наличия иерархии объектов: IF NOT ( TYPE("o1.o2.o3.o4.o5") == "U" )):
IF PEMSTATUS(o1.o2.o3.o4.o5, "method1",5) == .T.

Частично исправил, спасибо Игорь:
"Назад в будущее", вот она машина времени:



Исправлено 12 раз(а). Последнее : AdamAry, 27.04.17 14:23
Ratings: 0 negative/0 positive
Re: Как узнать существует ли oSecond в составе oFirst и если да, существует ли Property1 в составе oFirst.oSecond?:
Igor Korolyov
Автор

Сообщений: 34580
Дата регистрации: 28.05.2002
1-й параметр PEMSTATUS это либо ссылка на объект (тогда кавычки лишние), либо имя класса (тогда там явно не "o1.o2.o3" будет т.к. это недопустимый идентификатор).

Писать логическое_выражение==.T. избыточно. Во-первых для логических выражений нет разницы между оператором сравнения = и ==, во-вторых сам смысл сравнения логического выражения с .T. отсутствует - оно может использоваться само по себе.
Т.е. IF PEMSTATUS(...,5)==.T. полностью аналогично IF PEMSTATUS(...,5)
для сравнения с .F. можно просто применить оператор ! он же NOT. Т.е. писать IF !PEMSTATUS(...,5) вместо IF PEMSTATUS(...,5)=.F.

Скобки для выражения NOT TYPE(...)="U" не нужны, т.к. согласно приоритету операций NOT будет вычислен после вычисления результата сравнения. И == для TYPE(...)="U" избыточно, т.к. TYPE всегда возвращает один символ, и справа у тебя тоже чётко прописан один символ.

Естественно, кроме первого замечания это лишь улучшение/упрощение читаемости кода - работать будет и так, в "избыточном" варианте.


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


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

On-line: 21 akvvohinc  (Гостей: 20)

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