Средства разработки приложений


Организация горячего канала Excel – приложение DDE.


В этой главе вкратце описано, как осуществить корректное подключение и отключение от ячеек Excel. Например, необходимо получить доступ к ячейке, расположенной во втором столбце и первой строке на странице с названием «Лист1» рабочей книги «Книга1». Для начала необходимо зарегистрироваться в библиотеке DDEML и получить программный идентификатор idInst:

// Создаем делегат-переходник для функции обратного вызова

_DDECallBack = new DDECallBackDelegate(DDECallBack);

// Регистрация в библиотеке DDEML

DDEML.DdeInitialize(ref idInst, _DDECallBack, 0, 0);

После этого создаем канал связи с нужным разделом. В нашем случае, как было упомянуто выше, название сервиса: «EXCEL», а название раздела «[Книга1.xls]Лист1». Необходимо помнить, что расширение файла необходимо указывать, если эта книга открыта из файла. Если осуществляется подключение к созданной, но еще не сохраненной книге, то расширение не указывается.

// Формируем название раздела

string szTopic = “[Книга1.xls]Лист1”;

// Получение идентификатора сервиса

IntPtr hszService = DDEML.DdeCreateStringHandle(_idInst, "EXCEL", DDEML.CP_WINANSI);

// Получаем идентификатор раздела

IntPtr hszTopic = DDEML.DdeCreateStringHandle(_idInst, szTopic, DDEML.CP_WINANSI);

// Подключаемся к разделу

IntPtr hConv = DDEML.DdeConnect(_idInst, hszService, hszTopic , (IntPtr) null);

// Проверяем результат

if(hConv!=IntPtr.Zero)

{

...

}

// Освобождаем идентификаторы строк

DDEML.DdeFreeStringHandle(_idInst, hszService);

DDEML.DdeFreeStringHandle(_idInst, hszTopic);

После создания канала информируем Excel о том, чтобы приложение получало содержимое нужной ячейки, как только оно изменится («горячий канал»). Для этого посылаем Excel транзакцию XTYP_ADVSTART:

// Формируем название ячейки

string szItem = “R1C2”;

// Создаем идентификатор строки

IntPtr hszItem = DDEML.DdeCreateStringHandle(_idInst, szItem, DDEML.CP_WINANSI);

// Подписываемся на тему

uint pwdResult = 0;

IntPtr hData = DDEML.DdeClientTransaction((IntPtr)null, 0, hConv, hszItem, DDEML.CF_TEXT, DDEML.XTYP_ADVSTART, 1000,ref pwdResult);




Начало  Назад  Вперед



Книжный магазин