|
Einbindung eigener Dialoge |
Top Previous Next |
|
Sofern in mod_print eigene Dialoge eingebunden werden sollen, müssen in der externen Konfigurationsdatei die Texte der Schalter festgelegt werden.
Die Kommunikation der Programme geschieht auf Dateiebene, das aufrufende Programm muss zuerst eine Datei im Lese- und Schreibmodus öffnen und dann den Dateinamen beim Programmstart als Übergabeparameter angeben. Der gesamte Vorgang ist in unserer C++-API gekapselt, sodaß er normalerweise nicht zusätzlich programmiert werden muss. Ein Beispielprojekt dazu ist ebenfalls verfügbar.
Beispiel in Qt: Definition z.B. in QMainWindow: int timerId; QFile CommunicationFile; QPointer<QProcess> pProcess;
Datei öffnen, Hauptfenster verbergen und den Prozess starten: if(CommunicationFile.isOpen()) { CommunicationFile.close(); CommunicationFile.remove(); }
QString csComFileName; CreateTempFileName(csComFileName); CommunicationFile.setFileName(csComFileName); CommunicationFile.open(QFile::ReadWrite);
Activate(false);
pProcess = new QProcess(); connect(pProcess, SIGNAL(finished(int, QProcess::ExitStatus)), this, SLOT(ProcessFinished(int, QProcess::ExitStatus))); connect(pProcess, SIGNAL(errorOccurred(QProcess::ProcessError)), this, SLOT(ProcessErrorOccurred(QProcess::ProcessError))); pProcess->start(program, arguments);
Timer starten: timerId = startTimer(500);
Timer-Event auswerten: Für jeden Schalter hat mod_print in der Datei eine 32 Bit-Int-Variable angelegt, die mit 0 initialisiert wurde. Beim Betätigen eines Schalters wird die entsprechende Variable auf 1 gesetzt und das Hauptfenster von mod_print deaktiviert. Das aufrufende Programm wartet darauf, dass die Variable auf 1 steht und öffnet z.B. einen Dialog, um anschließend die Tabellendaten neu zu generieren. Danach wird die Variable auf 2 gesetzt, sofern mod_print die Tabellendaten neu einlesen und die Voransicht erstellen soll, oder auf 4 sofern keine Neuberechung notwendig ist.
void MainWindow::timerEvent(QTimerEvent *event) { if(event->timerId()==timerId) { if(nToolButtons>0 && CommunicationFile.isOpen()) { for(int a=0; a<nToolButtons; a++) { quint32 val=0; if(CommunicationFile.size()<(a+1)*sizeof(val)) { continue; } CommunicationFile.seek(a*sizeof(val)); CommunicationFile.read((char*)&val, sizeof(val));
if(val==1) { val=4; if(a==0)//handler for first button { bool ok; int i = QInputDialog::getInt(NULL, tr("Bitte geben Sie das Startjahr an:"), tr("Jahr:"), nStartYear, 1990, 2015, 1, &ok, Qt::WindowFlags() | Qt::WindowStaysOnTopHint); if (ok && nStartYear!=i) { nStartYear=i; QString csMainFileName; CreateXMLFiles(csMainFileName); val=2; } }
CommunicationFile.seek(a*sizeof(val)); CommunicationFile.write((const char*)&val, sizeof(val)); CommunicationFile.flush(); break; } } } } }
|