|
Как узнать, находится ли в переменной типа Any массив или скаляр?
|
|||
---|---|---|---|
#18+
В функцию в аргументе типа Any передается либо массив либо скаляр разных типов данных. Далее это значение будет передано во внешнюю ф-ю, где Any не поддерживается. Поэтому необходимо привести к явному типу данных путем присвоения в массив или скаляр нужного типа. Определить тип данных можно : ClassName(). Как определить массив или нет? К сожалению избавиться от Any и применить перегрузку функций не выйдет - таких параметров несколько и Any используется чтобы исключить размножение комбинаций разных типов (их было бы тысячи). Есть один хак - ф-я UpperBound() в PB9 возвращает "-1" для скаляра. Однако в PB6 приложение вылетает с GPF, а в PB6 тоже должно работать. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.05.2009, 14:48 |
|
Как узнать, находится ли в переменной типа Any массив или скаляр?
|
|||
---|---|---|---|
#18+
Anatoly MoskovskyВ функцию в аргументе типа Any передается либо массив либо скаляр разных типов данных. Далее это значение будет передано во внешнюю ф-ю, где Any не поддерживается. Поэтому необходимо привести к явному типу данных путем присвоения в массив или скаляр нужного типа. Определить тип данных можно : ClassName(). Как определить массив или нет? Идея №1 Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19.
PS. Идея №1 на PB6 работает. PSS. По ночам лучше спать ;))) ... |
|||
:
Нравится:
Не нравится:
|
|||
01.05.2009, 15:33 |
|
Как узнать, находится ли в переменной типа Any массив или скаляр?
|
|||
---|---|---|---|
#18+
Локшин Марк Идея №2 - ловить ошибку в systemerror при попытке обратиться как к массиву и таким образом выяснять. +1. Локшин Марк PSS. По ночам лучше спать ;))) Спокойно Эполит, спокойно!!! ... |
|||
:
Нравится:
Не нравится:
|
|||
01.05.2009, 17:05 |
|
Как узнать, находится ли в переменной типа Any массив или скаляр?
|
|||
---|---|---|---|
#18+
Идея №2 имеет следующие недостатки: 1. Частые заходы в systemerror в PB 6 череваты крахом приложения. 2. Функциональность нельзя реализовать в отдельном объекте. 3. Необходимо будет использовать какой-то глобальный объект. 4. Если используется многопоточность, то придется делать дополнительные телодвижения. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.05.2009, 18:22 |
|
Как узнать, находится ли в переменной типа Any массив или скаляр?
|
|||
---|---|---|---|
#18+
Если б речь не шла о РВ6!!!?, то Try Catch прекрасно для этих целей работает :-) ... |
|||
:
Нравится:
Не нравится:
|
|||
01.05.2009, 18:43 |
|
Как узнать, находится ли в переменной типа Any массив или скаляр?
|
|||
---|---|---|---|
#18+
Локшин Марк Идея №1 Код: plaintext 1. 2. 3. 4. 5. 6. 7.
Спасибо! Это подходит полностью. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.05.2009, 19:18 |
|
Как узнать, находится ли в переменной типа Any массив или скаляр?
|
|||
---|---|---|---|
#18+
ФилиппЕсли б речь не шла о РВ6!!!?, то Try Catch прекрасно для этих целей работает :-) Согласен. Исключения были рассмотрены мной в первую очередь. Правда у исключений в PB есть одна неприятная особенность: при запуске приложения в IDE со включенным Just in time debugging, даже если есть Catch исключения все равно генерируют сообщения об ошибках да еще и включают режим отладки. Не знаю какое из этих двух действий более идиотское :) А насчет почему PB6 - зачем ограничивать себе круг потенциальных клиентов? А их с PB6 достаточно, судя по статистике продаж DW2XLS. Вот если бы выяснилось что нельзя такое на 6 делать тогда - да :-) ... |
|||
:
Нравится:
Не нравится:
|
|||
01.05.2009, 19:33 |
|
Как узнать, находится ли в переменной типа Any массив или скаляр?
|
|||
---|---|---|---|
#18+
Локшин МаркPSS. По ночам лучше спать ;))) Вот закончу эту программулину - буду все лето по ночам спать, а днем на море :) ... |
|||
:
Нравится:
Не нравится:
|
|||
01.05.2009, 19:36 |
|
Как узнать, находится ли в переменной типа Any массив или скаляр?
|
|||
---|---|---|---|
#18+
Кстати, (опять же забыв о РВ6), в PBNI есть IsArray method for the IPB_Arguments interfacе... ... |
|||
:
Нравится:
Не нравится:
|
|||
01.05.2009, 19:54 |
|
Как узнать, находится ли в переменной типа Any массив или скаляр?
|
|||
---|---|---|---|
#18+
Anatoly MoskovskyФилиппЕсли б речь не шла о РВ6!!!?, то Try Catch прекрасно для этих целей работает :-) Согласен. Исключения были рассмотрены мной в первую очередь. Правда у исключений в PB есть одна неприятная особенность: при запуске приложения в IDE со включенным Just in time debugging, даже если есть Catch исключения все равно генерируют сообщения об ошибках да еще и включают режим отладки. Не знаю какое из этих двух действий более идиотское :) Just in time debugging просто говорит, что Systemeerror и РВшный режим отладки и есть first chance exception handler, так что ничего идиотского я тут не вижу :-) ... |
|||
:
Нравится:
Не нравится:
|
|||
01.05.2009, 19:56 |
|
Как узнать, находится ли в переменной типа Any массив или скаляр?
|
|||
---|---|---|---|
#18+
Филипп Just in time debugging просто говорит, что Systemeerror и РВшный режим отладки и есть first chance exception handler, так что ничего идиотского я тут не вижу :-) Если бы не было обработчика ошибки - да. Но если обработчик есть, значит он туда поставлен для нормального восстановления после ошибки, а значит остановка и какие-то сообщения - не в тему. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.05.2009, 20:11 |
|
Как узнать, находится ли в переменной типа Any массив или скаляр?
|
|||
---|---|---|---|
#18+
А вот подробнейшее обсуждение темы . Там самое последнее (я не пробовал), может работает... ... |
|||
:
Нравится:
Не нравится:
|
|||
01.05.2009, 20:14 |
|
Как узнать, находится ли в переменной типа Any массив или скаляр?
|
|||
---|---|---|---|
#18+
Локшин МаркИдея №2 имеет следующие недостатки: 1. Частые заходы в systemerror в PB 6 череваты крахом приложения. 1.Об этом не знал. Локшин Марк2. Функциональность нельзя реализовать в отдельном объекте. 3. Необходимо будет использовать какой-то глобальный объект. 2. Можно 3. Совершенно верно. Унаследовать от error и данный объект со своей обработкой systemerror использовать. Плюс в том, что вставил в проект и забыл про проверку во всех возможных появлениях необходимости проверки на что там в any? Локшин Марк4. Если используется многопоточность, то придется делать дополнительные телодвижения. 4. Сказать нечего. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.05.2009, 20:15 |
|
Как узнать, находится ли в переменной типа Any массив или скаляр?
|
|||
---|---|---|---|
#18+
Anatoly MoskovskyФилипп Just in time debugging просто говорит, что Systemeerror и РВшный режим отладки и есть first chance exception handler, так что ничего идиотского я тут не вижу :-) Если бы не было обработчика ошибки - да. Но если обработчик есть, значит он туда поставлен для нормального восстановления после ошибки, а значит остановка и какие-то сообщения - не в тему. Не согласен. Раз Just in time debugging включен, ВСЕ ошибки в него, просто и ясно... ... |
|||
:
Нравится:
Не нравится:
|
|||
01.05.2009, 20:15 |
|
Как узнать, находится ли в переменной типа Any массив или скаляр?
|
|||
---|---|---|---|
#18+
ФилиппНе согласен. Раз Just in time debugging включен, ВСЕ ошибки в него, просто и ясно... Мне не ясно и не просто. Ведь код написан, отлажен и работает правильно - какие еще ошибки? Почему я вообще должен каждый раз при выполнении программы в этот код лезть? Посмотрите на JIT-дебагер Visual Studio: он работает без этого маразма - переключение в дебаггер происходит только если исключение НЕ обработано. То что для вас это поведение PB нормально говорит о том что либо вы JITD не используете в проектах где активно используются исключения, либо это мазохизм какой-то :). ... |
|||
:
Нравится:
Не нравится:
|
|||
01.05.2009, 21:05 |
|
Как узнать, находится ли в переменной типа Any массив или скаляр?
|
|||
---|---|---|---|
#18+
Э, батенька, чего с VStudio сравнивать, да и вообще это некорректное сравнение, в ней у вас полный контроль над тем КАКИЕ именно exceptions выбрасывают вас в отладчик. В РВ этого контроля нет, что означает ВСЕ exceptions выбрасывают вас в отладчик... ... |
|||
:
Нравится:
Не нравится:
|
|||
01.05.2009, 21:43 |
|
Как узнать, находится ли в переменной типа Any массив или скаляр?
|
|||
---|---|---|---|
#18+
ФилиппЭ, батенька, чего с VStudio сравнивать, да и вообще это некорректное сравнение, в ней у вас полный контроль над тем КАКИЕ именно exceptions выбрасывают вас в отладчик. В РВ этого контроля нет, что означает ВСЕ exceptions выбрасывают вас в отладчик... Я и говорю - в VS нормально сделано. А в PB - через ж... - практической пользы нет, одни проблемы. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.05.2009, 22:56 |
|
Как узнать, находится ли в переменной типа Any массив или скаляр?
|
|||
---|---|---|---|
#18+
maxATC Локшин Марк2. Функциональность нельзя реализовать в отдельном объекте. 3. Необходимо будет использовать какой-то глобальный объект. 2. Можно 3. Совершенно верно. Унаследовать от error и данный объект со своей обработкой systemerror использовать. Плюс в том, что вставил в проект и забыл про проверку во всех возможных появлениях необходимости проверки на что там в any? Я сильно подозреваю, что все это делается в каком-то другом объекте, поэтому придется делать еще один объект для обработки systemerror и подключать его (а допустим там уже что-то есть другое, тогда изначально разрабатываемый объект будет сложнее интегрировать в уже существующее приложение). ... |
|||
:
Нравится:
Не нравится:
|
|||
02.05.2009, 09:28 |
|
Как узнать, находится ли в переменной типа Any массив или скаляр?
|
|||
---|---|---|---|
#18+
Локшин Марк , Реализация такова, наследую от стандартного объекта ERROR nv_error прописываю в Variable Types Error: данный объект, создаю в наследнике допустим функцию of_systemerror там необходимая мне обработка, в объекте Application в событии systemerror прописываю error.of_systemerror(), теперь все ошибки systemerror будут обрабатываться моей of_systemerror(), там и ловлю определенные ошибки и реагирую на них. Мой краткий скрипт of_systemerror(), просто управление сообщением. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41.
Инициализация переменных данного объекта в евенте Open App. При возникновении какой либо ошибки где нибудь в скрипте приложения и я его хочу отследить, в данной функции прописываю отслеживания по номеру (допустим несоответствие типов), ну и например в какой нибудь объект,структуру, переменную (gb_ошибочка) пишется допустим True. В скрипте где необходима проверка на соответствие типов li_integer = any: if gb_ошибочка then и далее li_integer != any обрабатываю. Согласен возможно и не лишено недостатков но пока в моих проектах данной реализации хватает за глаза. Строго не судить и если есть какие либо огрехи не поленитесь отписаться. Заранее благодарен. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.05.2009, 11:01 |
|
Как узнать, находится ли в переменной типа Any массив или скаляр?
|
|||
---|---|---|---|
#18+
Локшин Марк , Вариант в предложенной мной реализации не катит , не учел, что из скрипта по systemerror вываливаемся и соответственно никакого продолжения скрипта нет. Как всегда в голове работает, а на практике нет. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.05.2009, 14:26 |
|
Как узнать, находится ли в переменной типа Any массив или скаляр?
|
|||
---|---|---|---|
#18+
Товарищи, а зачем все это, Systemerror, глобальные обработчики? Решение с динамическим вызовом перегруженных методов (вариант №1 Марка) и быстрее и проще и не требует от других модулей маршрутизации обработки ошибки в мой модуль (т.е. фактически нарушения инкапсуляции, т.к. это не интерфейс модуля, а всего лишь часть его реализации). Ну и о наболевшем - Systemerror, также как и исключения, выкидывает в дебаггер при включенном JITd. А я не позволю чтобы какая-то глючная программа, написанная за гроши толпой индокитайцев ЗА МЕНЯ решала нужен ли мне дебагер или нет :) ... |
|||
:
Нравится:
Не нравится:
|
|||
02.05.2009, 15:11 |
|
Как узнать, находится ли в переменной типа Any массив или скаляр?
|
|||
---|---|---|---|
#18+
Anatoly MoskovskyРешение с динамическим вызовом перегруженных методов (вариант №1 Марка) и быстрее и проще Согласен, ну так ведь интересно, а можно ли вот так. Оказалось, что проблематично, ну и и это результат на будущее, не изобретать велосипед.:) ... |
|||
:
Нравится:
Не нравится:
|
|||
02.05.2009, 17:26 |
|
Как узнать, находится ли в переменной типа Any массив или скаляр?
|
|||
---|---|---|---|
#18+
Anatoly Moskovsky Ну и о наболевшем - Systemerror, также как и исключения, выкидывает в дебаггер при включенном JITd. А я не позволю чтобы какая-то глючная программа, написанная за гроши толпой индокитайцев ЗА МЕНЯ решала нужен ли мне дебагер или нет :) А она за тебя и не решает, ты ей сам сказал - ВКЛЮЧИ JIT debugging :-))) ... |
|||
:
Нравится:
Не нравится:
|
|||
04.05.2009, 18:29 |
|
Как узнать, находится ли в переменной типа Any массив или скаляр?
|
|||
---|---|---|---|
#18+
ФилиппА она за тебя и не решает, ты ей сам сказал - ВКЛЮЧИ JIT debugging :-))) из справки PB Just-in-time debugging [1] If you want to be able to enter the debugger while running in normal mode, select Just In Time Debugging on the General page of the System Options dialog box. Checking this option enables the Debug button on the dialog box that displays when you click the PowerBuilder icon in the Windows taskbar when your application is running. [2] The Debug window also opens automatically if a system error occurs. Так вот п.1 - это единственное для чего пригодна реализация JITD в PB. И именно ради него я и включаю эту опцию. На нем и надо было остановиться. Но какой-то ... придумал еще и п.2. В нормальной реализации п.2 звучал бы так: [2] The Debug window also opens automatically if an unhandled system error occurs. А если кому-то понадобилось бы чтобы перехваченные ошибки тоже вызывали дебагер, то для этого в обработчике ставится вызов DebugBreak(), который как раз и предназначен для вызова дебагера. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.05.2009, 20:10 |
|
Как узнать, находится ли в переменной типа Any массив или скаляр?
|
|||
---|---|---|---|
#18+
На чем мы там остановились? Ага, так вот смигрировал я проект из PB9 в PB6 и выяснилось, что то место где проверяется, находится ли в переменной типа Any объект, перестало работать. Для определения я использовал IsValid() и в PB9 это работало, а в PB6 IsValid возвращает True не только для объектов но и для других типов данных. Вернее для простых типов данных результат зависит от значения хранящегося в any. (Оно приводится к типу bool: 0, false -> false, остальные значения -> true) Это нормальное поведение или глюк? Кто-то в курсе в какой версии поведение изменилось? Придется и это переделать на динамический вызов перегруженных ф-й. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.05.2009, 00:39 |
|
|
start [/forum/topic.php?fid=15&msg=35964787&tid=1336292]: |
0ms |
get settings: |
8ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
54ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
63ms |
get tp. blocked users: |
1ms |
others: | 14ms |
total: | 176ms |
0 / 0 |