04.04.2013, 18:25 | #1 |
Участник
|
Продолжаем неделю каверзных вопросов.
Небольшое вступление (в начале думал что не большое, но не большое не получается). В некоторых языках программирования, в частности на VB (совсем в частности VBA) есть такое понятие, как не обязательные именованные параметры. Например, есть какая-нить функция с 20-ю параметрами. А Вам то и нужно что один в неё передать, 13-ый по счёту. Что делать? Перечислять все 20 параметров ради одного? Нет и ещё раз нет! Всем двадцати параметрам можно дать имена и передавать параметры в функцию можно будет поимённо! Например так: FuncWith20Params(ThirteenthParam:=value); Красота? Красота! Но что же делать языкам, которые не знают что такое не обязательные, а тем более именованные параметры? Если я в Наве напишу такую конструкцию, он только пальцем у виска покрутит. Можно конечно забыть о красоте и перечислить все 20 параметров (не будем сейчас вспоминать про ограничение в 16 параметров). Можно, да не всегда. Дело в том, что именованные не обязательные параметры используются не только для того что бы меньше приходилось стучать по клаве. И яркий тому пример, метод Copy принадлежащий объекту WorkSheet из Excel. Этот метод принимает 2 необязательных именованных параметра типа WorkSheet с именами Before и After. Логика проста, если прилетел параметр Before, то копируем Лист и вставляем его перед Листом, который скопировали, если же прилетел параметр After, то вставляем после. Если прилетают оба параметра - ошибка. Поговорим об этом методе в контексте Нава. Нав, к счастью, может пропускать последние параметры (т.е. он частично знает, что бывают необязательные параметры, но только не подозревает, что они могут идти и в начале, а не только в конце), поэтому мы можем спокойно вызвать метод Copy(wrkSheet), подразумевая что это параметр Before, а вот параметр After мы никак не вызовем. Бяда? Бяда. Насколько это бяда я и пытаюсь выяснить и надеюсь на вашу помощь! Ну так вот, не один Нав не знает что такое необязательные именованные параметры и разработчики Excel не расисты решившие устроить бойкот языкам не знающим что это такое. Поэтому в системной библиотеке, доступной всем и каждому есть такой объект как Type, а объект этот в свою очередь содержит такую переменную как Missing. Эту вот самую переменную и нужно передавать в тех случая, когда ничего передавать не нужно. Т.е. наш метод теперь мы можем вызвать так: Copy(Type.Missing, wrkSheet). Ура? Со вступлением покончили и нет, не ура. Т.к. проблемы на этом только начинаются. Системная библиотека о которой я писал выше, называется mscorlib, можно объявить Automation с этой библиотекой и найти в нём объект Type, только вот члена Missing в этом объекте почему-то не находится Можно в этой библиотеке найти и объект Missing, но если в метод передавать его, то получаем неизвестную ошибку выполнения Я в тупике. |
|
04.04.2013, 19:26 | #2 |
Участник
|
А что собственно за библиотека? mscorlib.dll? Напишите пожта точное название, т.к. я не вижу метода Copy в этой библиотеке. Пробовали пользоваться DotNet, а не Automation?
|
|
05.04.2013, 09:36 | #3 |
Участник
|
Цитата:
DotNet тоже пробовал. |
|