crossplatform.ru

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


  Ответ в Создание RTD клиента
Введите ваше имя
Подтвердите код

Введите в поле код из 6 символов, отображенных в виде изображения. Если вы не можете прочитать код с изображения, нажмите на изображение для генерации нового кода.
 

Опции сообщения
 Включить смайлы?
Иконки сообщения
(Опционально)
                                
                                
  [ Без иконки ]
 


Последние 10 сообщений [ в обратном порядке ]
rominf Дата 20.8.2011, 10:59
  Здравствуйте!
Есть сторонняя программа с закрытыми исходниками, являющаяся 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 клиента?
Просмотр темы полностью (откроется в новом окне)
RSS Текстовая версия Сейчас: 25.4.2024, 17:45