Как узнать существует ли 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 |
Re: Как узнать существует ли oSecond в составе oFirst и если да, существует ли Property1 в составе oFirst.oSecond?: | |
---|---|
ssa Сообщений: 12999 Откуда: Москва Дата регистрации: 23.03.2005 |
FAQ, как обычно, не смотрим...
Как проверить факт существования переменной памяти, поля таблицы, метода формы ------------------ Лень - это неосознанная мудрость. Исправлено 1 раз(а). Последнее : ssa, 25.04.17 14:33 |
Re: Как узнать существует ли oSecond в составе oFirst и если да, существует ли Property1 в составе oFirst.oSecond?: | |
---|---|
Владимир Максимов Сообщений: 14095 Откуда: Москва Дата регистрации: 02.09.2000 |
Как проверить факт существования переменной памяти, поля таблицы, метода формы
В самом конце про форму, но можно использовать с любым объектом. Тебе нужно Type() и PEMStatus() |
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 |
Re: Как узнать существует ли oSecond в составе oFirst и если да, существует ли Property1 в составе oFirst.oSecond?: | |
---|---|
ssa Сообщений: 12999 Откуда: Москва Дата регистрации: 23.03.2005 |
Справку по функции читать не пробовали?
------------------ Лень - это неосознанная мудрость. |
Re: Как узнать существует ли oSecond в составе oFirst и если да, существует ли Property1 в составе oFirst.oSecond?: | |
---|---|
Sawradym Сообщений: 2244 Откуда: Винница Дата регистрации: 15.05.2007 |
Вдогонку, как вариант:
но я бы использовал "матрешку" с PEMstatus()
|
Re: Как узнать существует ли oSecond в составе oFirst и если да, существует ли Property1 в составе oFirst.oSecond?: | |
---|---|
Igor Korolyov Автор Сообщений: 34580 Дата регистрации: 28.05.2002 |
vartype выкидывает ошибку если нет объекта "по пути". Type просто пытается достучаться, и гасит все возникающие по ходу дела ошибки - если ошибки были то вернёт 'U' и всё.
Писать кучу pemstatus как по мне так непродуктивно (один - т.е. когда нет никакой "цепочки" - другое дело). Тем более что "наличие" свойства ещё не гарантирует что там будет ссылка на объект - т.е. без type/vartype всё одно не обойтись. И я не в курсе как каждый из них поведёт себя если у "промежуточного" свойства будет _access метод чего-то там возвращающий в зависимости от внешних условий. Кроме того не факт что это всё адекватно работает с нефоксовыми объектами (если речь про COM-сервера). ------------------ WBR, Igor |
Re: Как узнать существует ли oSecond в составе oFirst и если да, существует ли Property1 в составе oFirst.oSecond?: | |
---|---|
Sawradym Сообщений: 2244 Откуда: Винница Дата регистрации: 15.05.2007 |
ну если уж копать до самого дна, то type/vartype для объекта возвращают 'O' даже в случае если там реально null, следовательно не помешает проверить type('object.Name'), а для класса Empty и это не выход. Вобщем универсального решения нет. Какие уж тут могут быть универсальные формы для справочников. |
Re: Как узнать существует ли oSecond в составе oFirst и если да, существует ли Property1 в составе oFirst.oSecond?: | |
---|---|
Igor Korolyov Автор Сообщений: 34580 Дата регистрации: 28.05.2002 |
Ну, автору нужен был не промежуточный результат, а "окончательный" - так что один "общий" TYPE() должен сработать.
VARTYPE() для переменной/свойства типа Object но содержащей NULL (например ссылка на уже закрытую форму или уничтоженный объект) возвращает не 'O' по умолчанию, а 'X' - только если второй параметр указать .T. то вернёт 'O' аналогично TYPE() ------------------ WBR, Igor |
Re: Как узнать существует ли oSecond в составе oFirst и если да, существует ли Property1 в составе oFirst.oSecond?: | |
---|---|
AdamAry Сообщений: 843 Дата регистрации: 14.12.2015 |
Цитата: Получается самый универсальный метод это ?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 |
Re: Как узнать существует ли oSecond в составе oFirst и если да, существует ли Property1 в составе oFirst.oSecond?: | |
---|---|
AdamAry Сообщений: 843 Дата регистрации: 14.12.2015 |
Спасибо, просмотрел. Просто многоэтажность объектов смутило.
Получается существование метода нельзя проверить используя TYPE, это возможно только с помощью PEMSTATUS(aa, "mymethod",5) на возврат .T., не так ли? А существование объекта, а также существование свойства объекта легко и просто проверяется при помощи TYPE на возврат "U", не так ли? Кстати,
или то же что и?:
Исправлено 9 раз(а). Последнее : AdamAry, 26.04.17 09:38 |
Re: Как узнать существует ли oSecond в составе oFirst и если да, существует ли Property1 в составе oFirst.oSecond?: | |
---|---|
Влад Колосов Сообщений: 22664 Откуда: Ростов-на-Дону Дата регистрации: 05.05.2005 |
У Вас какие-то архитектурные ошибки, т.к. "родитель" всегда знает о существовании "детей", т.к. он же их и создаёт. Такая проверка не нужна при правильно разработанной иерархии исполнения. Если "дети" самоликвидируются, то они обязаны уведомить об этом "родителя". ------------------ Совершенство - это не тогда, когда нельзя ничего прибавить, а тогда, когда нечего убавить. |
Re: Как узнать существует ли oSecond в составе oFirst и если да, существует ли Property1 в составе oFirst.oSecond?: | |
---|---|
of63 Сообщений: 25161 Откуда: Н.Новгород Дата регистрации: 13.02.2008 |
Не обязательно "знает". Обьекты типа "Empty" наполняются... чем только не наполняются, в т.ч и такими же "Empty"-обьектами. И вот этот обьект поступает на вход некой программе, программа хочет знать, есть ли такое-то свойство у обьекта (например, этот свойство появилось только недавно, в новое версии программы, а обьект изготовлен в старой). Да хоть тот же SCATTER MEMO NAME m.o - почему бы не проверить наличие необязательного поля в m.o.
|
Re: Как узнать существует ли oSecond в составе oFirst и если да, существует ли Property1 в составе oFirst.oSecond?: | |
---|---|
Igor Korolyov Автор Сообщений: 34580 Дата регистрации: 28.05.2002 |
Наличие методов TYPE, естественно, не проверяет. И вообще в нормальной программе крайне низка надобность в подобной проверке. Архитектурные уродцы, конечно, потребуют не только проверки на "наличие метода", но и массы другого г*нокода для своей работы
------------------ WBR, Igor |
Re: Как узнать существует ли oSecond в составе oFirst и если да, существует ли Property1 в составе oFirst.oSecond?: | |
---|---|
AdamAry Сообщений: 843 Дата регистрации: 14.12.2015 |
Ну и оставим
1. объекта в сложной иерархии объектов:
Частично исправил, спасибо Игорь: "Назад в будущее", вот она машина времени: Исправлено 12 раз(а). Последнее : AdamAry, 27.04.17 14:23 |
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 |
© 2000-2024 Fox Club  |