crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в данную темуНачать новую тему
> Создание RTD клиента, RTD - обёртка над COM для передачи данных из RTD сервера в MS Excel
rominf
  опции профиля:
сообщение 20.8.2011, 10:59
Сообщение #1


Студент
*

Группа: Участник
Сообщений: 20
Регистрация: 20.8.2011
Пользователь №: 2820

Спасибо сказали: 1 раз(а)




Репутация:   0  


Здравствуйте!
Есть сторонняя программа с закрытыми исходниками, являющаяся RTD сервером. Требуется получать от неё моей программой данные в реальном времени. Про RTD можно прочитать здесь: MSDN. Microsoft предполагал, что RTD сервер сможет сделать любой, а клиентом будет являться Excel. В связи с этим есть 2 варианта:
  1. Принимать данные с помощью Excel и получать их через ActiveQt из моей программы
  2. Создать RTD клиент (но документации по этому нет) и получать данные напрямую

Первый вариант представлялся мне более простым и был почти реализован. Я создал файл data.xls с листом list и в ячейку (1, 1) записал "=ДРВ("server.rtd";;"param1";"param2")". Данные пошли. Почти написал программу (спасибо авторам статьи Работа с MS Office с помощью ActiveQt!). Соединил сигнал propertyChanged ячейки со слотом, для того, чтобы определять изменение данных в ячейке, однако в обработчик слота не заходит. Ниже сокращённый код (без проверок и т.п.).
Раскрывающийся текст
MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow)
{
  ...
  // Присоединяюсь к уже открытому Excel
  // excel, cell - поля класса, чтобы иметь доступ из деструктора и из слота
  excel = new QAxObject("{00024500-0000-0000-C000-000000000046}&", this);
  QAxObject *workbooks = excel->querySubObject("Workbooks");
  QAxObject *workbook = workbooks->querySubObject("Item(const QVariant&)", QVariant("data.xls") );
  QAxObject *sheets = workbook->querySubObject("Sheets");
  QAxObject *sheet = sheets->querySubObject("Item(const QVariant&)", QVariant("list") );
  cell = sheet->querySubObject("Cells(QVariant,QVariant)", 1, 1);
  QVariant result = cell->property("Value"); // result успешно получает значение ячейки (1, 1)
  if (connect(cell, SIGNAL(propertyChanged(const QString&)), SLOT(valueChanged())))
    ui->label->setText("Slot connected"); // заходит, слот якобы присоединяется к сигналу
  ...
}

void MainWindow::valueChanged() // Не заходит при изменении значения ячейки
{
  ui->label->setText(cell->property("Value").toString());
}

Вариант с таймером вместо обработки сигнала изменения данных в ячейке не устраивает, т.к. данные изменяются около раза в секунду (с переменной частотой). Да и к тому же значение ячейки может измениться, к примеру, с "100" на "100" и мне надо понять, что это новые данные, а не старые, которые ещё не успели обновиться.

Второй вариант, т.е. получение данных напрямую, мне нравится больше, однако я нигде не смог найти примера, как реализуется RTD клиент не то что на Qt, даже на чистом C++. Нашёл на python, но я не знаю его (собирался изучать через пару лет), поэтому переделать на Qt не могу (хотя кода немного).

Скажите, пожалуйста, почему может не обрабатываться сигнал. Есть ли у кого-нибудь опыт создания RTD клиента?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 29.3.2017, 2:22