|
Программирование >> Автоматически обновляемые приложения
Позднее связывание в отличие от раннего связывания, позднее связывание сопоставляет вызовы свойств и методов соответствующим объектам в процессе выполнения программы. Для этого в требуемых объектах должен быть реализован специальный интерфейс СОМ IDispatch. МетОД IDispatch:-.GetlDsOfNames позволяет запрашивать объект о поддерживаемых методах и свойствах, а метод IDispatch: : Invoke позволяет вызывать ЭТИ свойства И методы. Это дает возможность при использовании позднего связывания избежать некоторых зависимостей от версии, присущих раннему связыванию. Недостатком позднего связывания является то, что оно не позволяет проверять целостность кода автоматизации на этапе компиляции и не поддерживает возможности IntelliSense, которые могут предоставить сведения для правильного вызова методов и свойств. Для использования позднего связывания Visual С# необходимо применить метод System. Туре. InvokeMember. ЭтоТ метоД ВЫЗЫВает методы IDispatch::GetIDsOfNames И IDispatch::Invoke ДЛЯ привязКИ К методам И свойствам сервера автоматизации. Рассмотрим пример создания клиента автоматизации, использующего позднее связывание (листинг 15.3). 1. Запустите новый проект и добавьте на форму кнопку Buttonl. 2. Откройте окно редактора кода и добавьте код, приведенный в листинге 15.3. MessageBox.Show(errorMessage, Ошибка ); Проверим наш пример в действии. Запустите проект. Щелкните на первой кнопке. Приложение запустит Microsoft Excel, откроет в нем новую книгу и заполнит ячейки первого листа в диапазоне А1:Е5 числовыми данными из массива. Далее щелкните на второй кнопке. Приложение получит данные из ячеек А1:Е5, занесет их в массив и покажет результат в окне сообщения. Теперь поставьте галочку в Fiiiwithstrings и снова нажмите на первую кнопку. Теперь ячейки будут заполнены строковыми данными. Примечание Пример работы с массивами находится в папке ExcelDemo на прилагаемом диске. Листинг 15.3. Пример позднего связывания using System.Reflections-private void buttonl Click(object sender. System.EventArgs e) { object objApp Late; object objBook Late; object objBooks Late; object objSheets Late; object objSheet Late; object objRange Late; object[] Parameters; Получение типа класса и создание экземпляра Excel Туре objClassType; objClassType = Type.GetTypeFromProgID( Excel.Application ); objApp Late = Activator.Createlnstance(objClassType); Получение коллекции рабочих книг objBooks Late = objApp Late.GetType().InvokeMembeг Workbooks , BindingFlags.GetProperty, null, objApp Late, null); Добавление новой рабочей книги objBook Late = objBooks Late.GetType().InvokeMember( Add , BindingFlags.InvokeMethod, null, objBooks Late, null); Получение коллекции рабочих листов obj Sheets Late = objBook Late.GetType() .InvokeMember( Worksheets , BindingFlags.GetProperty, null, objBook Late, null); Получение первого рабочего листа Parameters = new Object[1]; Parameters[0] = 1; objSheet Late = objSheets Late.GetType().InvokeMember( Item , BindingFlags.GetProperty, null, objSheets Late, Parameters) Получение объекта диапазона, содержащего ячейку Al Parameters = new Object[2]; MessageBox.Show(errorMessage, Error Как видите, при работе с поздним связыванием необходимо подключить пространство имен System.Reflection. Далее для запуска Excel мы пользуемся классом Activator, который ВХОДИТ в пространство имен system. После того как вы запустили Excel, вам становится доступна вся объектная модель Excel, в частности: П Workbooks (коллекция рабочих книг); П Worksheets (кОЛЛекцИЯ ЛИСТОВ). Имея В своем распоряжении ссылку на коллекцию рабочих книг, мы можем получить доступ к любой книге. У каждой книги, в свою очередь, есть кол- Parameters[0] = Al ; Parameters[1] = Missing.Value; objRange Late = objSheet Late.GetType().InvokeMember( Range , BindingFlags.GetProperty, null, objSheet Late, Parameters); Написать Hello, World! в ячейке Al Parameters = new Object[1]; Parameters[0] = Hello, World! ; objRange Late.GetType().InvokeMember( Value , BindingFlags.SetProperty, null, objRange Late, Parameters ); Возвращение контроля над Excel пользователю Parameters = new Object[1]; Parameters[0] = true; objApp Late.GetType().InvokeMember( Visible , BindingFlags.SetProperty, null, objApp Late, Parameters); objApp Late.GetType().InvokeMember( UserControl , BindingFlags.SetProperty, null, objApp Late, Parameters); catch( Exception theException ) String errorMessage; errorMessage = Error: ; errorMessage = String.Concat(errorMessage, theException.Message) ; errorMessage = String.Concat(errorMessage, Line: ); errorMessage = String.Concat(errorMessage, theException.Source);
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |