Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум на CrossPlatform.RU _ Qt Общие вопросы _ Создание RTD клиента

Автор: rominf 20.8.2011, 10:59

Здравствуйте!
Есть сторонняя программа с закрытыми исходниками, являющаяся RTD сервером. Требуется получать от неё моей программой данные в реальном времени. Про RTD можно прочитать здесь: http://msdn.microsoft.com/en-us/library/aa140060(v=office.10).aspx. Microsoft предполагал, что RTD сервер сможет сделать любой, а клиентом будет являться Excel. В связи с этим есть 2 варианта:

  1. Принимать данные с помощью Excel и получать их через ActiveQt из моей программы
  2. Создать RTD клиент (но документации по этому нет) и получать данные напрямую

Первый вариант представлялся мне более простым и был почти реализован. Я создал файл data.xls с листом list и в ячейку (1, 1) записал "=ДРВ("server.rtd";;"param1";"param2")". Данные пошли. Почти написал программу (спасибо авторам статьи http://www.wiki.crossplatform.ru/index.php/Работа_с_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++. Нашёл http://code.google.com/p/pyrtd/, но я не знаю его (собирался изучать через пару лет), поэтому переделать на Qt не могу (хотя кода немного).

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

Форум Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)