Свое меню(панель) в ArcMap

0 голосов
спросил 27 Авг, 09 от filippov70 (5,320 баллов) в категории Программные продукты Esri
Доброго дня.
Я решил сделать собственное меню в ArcMap'е на С#.
И хочу сделать так: у меня есть моя библиотека, она выполняет аутентификацию юзера в базе данных и еще кучу других функций. Так вот на все эти функции, в том числе и на логин, сделать свои Command'ы, которы будут в моем новом меню.
Далее.
Я создал все как предлагает EDN: меню от :BaseMenu, ESRI.ArcGIS.Framework.IRootLevelMenu и кнопки от : BaseCommand.
Как я понимаю при старте хост-процесса ArcMap.exe подключается моя dll(с меню и кнопками) и они инициализируются (public override void OnCreate(object hook)).
Затем, на OnClick конпки логина, создается нужный мне объект из сторонней dll. И вот как этот объект сделать доступным в других Command'ах это объект, если они уже проинициализированы.
Создавать динамически? Тогда как получить объект Command'а "логин" и объект моего меню?
Может кто сталкивался с подобной проблемемой или она решается как то по другому?
Всем спасибо

7 Ответы

0 голосов
ответил 28 Авг, 09 от TDenis (42,620 баллов)
Откровенно говоря, я ничего не понял, но попробую что-то ответить :)
Вижу два варианта.
1. Есть одна сборка, внутри которой находится куча кнопок. К примеру (к примеру!), первая кнопка - устанавливает соединение с БД, вторая кнопка - пересылает данные, третья кнопка - соединение закрывает.
Такое можно реализовать с помощью статических классов/методов или же паттерна Singleton.
2. Кнопки находятся в разных сборках. Установка соединения в одной dll, пересылка данных - в другой, закрытие соединения - в третьей. В этом случае, при нажатии, например, на вторую кнопку, мы должны найти первую кнопку и вызвать в ней произвольный (!) метод (не объявленный в ICommand), название и сигнатуру которого мы заранее знаем, который вернет нам активное соединение. Т.е. без использования явной сериализации в общую память (оперативной, hdd), а именно вызовом метода. Как такое сделать - мне самому интересно, присоединяюсь к вопросу :-)
    
    
    
0 голосов
ответил 28 Авг, 09 от filippov70 (5,320 баллов)

Вроде получается вот так:
//этот код добавляю в OnClick() кнопки логина
ICommandBar MegaBar = m_application.Document.CommandBars.Create("My", ESRI.ArcGIS.SystemUI.esriCmdBarType.esriCmdBarTypeToolbar);// решил создать панель
                  
                   
                    Tune tune = new Tune(); это класс от Command
                    tune.set_ExtClass(ref ExtClass);//произвольный (!) метод, в который я передаю по ссылке класс той самой dll в которой работает весь мой функционал
                    UID tuneUid = new UIDClass();
                    tuneUid.Value = "{37FEAD05-F740-4673-8AC8-7929AC6AA692}";// это [Guid("37FEAD05-F740-4673-8AC8-7929AC6AA692")] объявленный в классе Tune, так можно искать нужную кнопку, созданую самомтоятельно(как с ESRIвскими пока не знаю)
                    object Missing = Type.Missing;
                    MegaBar.Add(tuneUid, ref Missing);

т.е. нужно создавать динамически кнопки, и передавать ссылку на нужный объект через свой метод, типа tune.set_ExtClass(ref ExtClass);
0 голосов
ответил 28 Авг, 09 от TDenis (42,620 баллов)
Ну а при завершении работы вы что ли удаляете панель с кнопкой?
Я правильно понимаю, что все кнопки у вас определены внутри одной сборки?
0 голосов
ответил 28 Авг, 09 от filippov70 (5,320 баллов)
ну да, все кнопки, панели, меню в отдельной сборке.
По дефолту есть, к примеру, меню с парой кнопок - Login'а и Настройка, они есть всегда.
В методе OnClick() Login'а создается нужный объект из сторонней сборки и далее при динамическом создании остальных кнопок в их объекты, через свой метод передается ссылка на этот объект, чтобы объекты каждой кнопки могли им пользоваться.
0 голосов
ответил 28 Авг, 09 от TDenis (42,620 баллов)
А почему статическим этот объект не хотите объявить?
0 голосов
ответил 28 Авг, 09 от TDenis (42,620 баллов)
Тогда не будет необходимости регистрировать ваш объект в каждой кнопке. Да и пересоздавать кнопки - я бы не назвал эту идею однозначно хорошей. Потому что надо следить за этими кнопками, плюс вы лишаете пользователя возможности самому настраивать отображаемые кнопки, их размещение, иконки...
0 голосов
ответил 01 Сен, 09 от filippov70 (5,320 баллов)
собственно, мой объект я объявляю статическим, иначе никак
спасибо за дискуссию, удачи Smile
Добро пожаловать на сайт Вопросов и Ответов, где вы можете задавать вопросы по GIS тематике и получать ответы от других членов сообщества.
...