3 Hauptfenster erstellen
|
|
|
- Erika Becker
- vor 10 Jahren
- Abrufe
Transkript
1
2 3 Hauptfenster erstellen In diesem Kapitel lernen Sie, wie Sie mithilfe von Qt Hauptfenster erstellen. Am Ende des Kapitels werden Sie in der Lage sein, die gesamte Benutzerschnittstelle einer Anwendung mit Menüs, Symbolleisten, Statusleisten und allen erforderlichen Dialogfeldern zu erstellen. Abbildung 3.1: Die Anwendung Spreadsheet Das Hauptfenster einer Anwendung stellt das Framework bereit, auf dem die Benutzerschnittstelle aufgebaut wird. Grundlage dieses Kapitels ist das Hauptfenster der in Abbildung 3.1 dargestellten Tabellenkalkulationsanwen-
3 Kapitel 3 dung Spreadsheet. Diese Anwendung verwendet die Dialogfelder FIND, GO TO CELL und SORT, die wir in Kapitel 2 erstellt haben. Hinter den meisten GUI-Anwendungen steht ein Coderumpf, der die zugrunde liegende Funktionalität bereitstellt, z.b. Code zum Lesen und Schreiben von Dateien oder zur Verarbeitung der in der Benutzerschnittstelle präsentierten Daten. In Kapitel 4 sehen wir, wie eine solche Funktionalität implementiert wird, wobei wir wieder die Tabellenkalkulationsanwendung als Beispiel verwenden. 3.1 Subklassen in QMainWindow Das Hauptfenster einer Anwendung wird erstellt, indem wir Subklassen von QMain- Window anlegen. Viele der in Kapitel 2 erörterten Verfahren zum Erstellen von Dialogfeldern sind auch für Hauptfenster relevant, da sowohl QDialog als auch QMainWindow von QWidget erben. Zwar können Hauptfenster mithilfe von Qt Designer erstellt werden, in diesem Kapitel werden wir jedoch alles kodieren, um Ihnen zu zeigen, wie es gemacht wird. Wenn Sie den visuellen Ansatz bevorzugen, schauen Sie sich das Kapitel»Creating Main Windows in Qt Designer«in der Onlineanleitung zu Qt Designer an. Der Quellcode für das Hauptfenster der Tabellenkalkulationsanwendung verteilt sich auf die Dateien mainwindow.h und mainwindow.cpp. Beginnen wir mit der Headerdatei: #ifndef MAINWINDOW_H #define MAINWINDOW_H #include <QMainWindow> class QAction; class QLabel; class FindDialog; class Spreadsheet; class MainWindow : public QMainWindow Q_OBJECT public: MainWindow(); protected: void closeevent(qcloseevent *event); Wir definieren die Klasse MainWindow als Subklasse von QMainWindow. Sie enthält das Makro Q_OBJECT, da sie ihre eigenen Signale und Slots bereitstellt. 74
4 Hauptfenster erstellen CloseEvent() ist eine virtuelle Funktion in QWidget, die automatisch aufgerufen wird, wenn der Benutzer das Fenster schließt. Sie wird erneut in MainWindow implementiert, sodass wir dem Benutzer die Standardfrage stellen können, ob er seine Änderungen und die Benutzereinstellungen auf dem Datenträger speichern möchte. private slots: void newfile(); void open(); bool save(); bool saveas(); void find(); void gotocell(); void sort(); void about(); Einige Menüoptionen wie FILE NEW und HELP ABOUT werden als private Slots in MainWindow implementiert. Der Typ des Rückgabewerts der meisten Slots ist void, save() und saveas() geben jedoch einen bool-wert zurück. Der Rückgabewert wird ignoriert, wenn ein Slot als Reaktion auf ein Signal ausgeführt wird. Wenn wir jedoch einen Slot als Funktion aufrufen, steht uns der Rückgabewert nur so zur Verfügung, wie es der Fall wäre, wenn wir eine normale C++-Funktion aufgerufen hätten. void openrecentfile(); void updatestatusbar(); void spreadsheetmodified(); private: void createactions(); void createmenus(); void createcontextmenu(); void createtoolbars(); void createstatusbar(); void readsettings(); void writesettings(); bool oktocontinue(); bool loadfile(const QString &filename); bool savefile(const QString &filename); void setcurrentfile(const QString &filename); void updaterecentfileactions(); QString strippedname(const QString &fullfilename); Das Hauptfenster benötigt weitere private Slots und mehrere private Funktionen zur Unterstützung der Benutzerschnittstelle. Spreadsheet *spreadsheet; FindDialog *finddialog; QLabel *locationlabel; QLabel *formulalabel; QStringList recentfiles; 75
5 Kapitel 3 QString curfile; enum MaxRecentFiles = 5 ; QAction *recentfileactions[maxrecentfiles]; QAction *separatoraction; ; QMenu *filemenu; QMenu *editmenu;... QToolBar *filetoolbar; QToolBar *edittoolbar; QAction *newaction; QAction *openaction;... QAction *aboutqtaction; #endif Neben den privaten Slots und Funktionen verfügt MainWindow über viele private Variablen. All diese werden wir erläutern, wenn sie zum Einsatz kommen. Nun überprüfen wir die Implementierung: #include <QtGui> #include "finddialog.h" #include "gotocelldialog.h" #include "mainwindow.h" #include "sortdialog.h" #include "spreadsheet.h" Wir fügen die Headerdatei <QtGui> ein, die die Definition aller in unserer Subklasse verwendeten Qt-Klassen enthält. Darüber hinaus fügen wir einige gebräuchliche Headerdateien hinzu, insbesondere finddialog.h, gotocelldialog.h und sortdialog.h aus Kapitel 2. MainWindow::MainWindow() spreadsheet = new Spreadsheet; setcentralwidget(spreadsheet); createactions(); createmenus(); createcontextmenu(); createtoolbars(); createstatusbar(); readsettings(); 76
6 Hauptfenster erstellen finddialog = 0; setwindowicon(qicon(":/images/icon.png")); setcurrentfile(""); Im Konstruktor beginnen wir damit, das Widget Spreadsheet zu erstellen und als zentrales Widget des Hauptfensters festzulegen. Das zentrale Widget nimmt die Mitte des Hauptfensters ein (siehe Abbildung 3.2). Spreadsheet ist eine Subklasse von QTableWidget mit einigen Funktionen für die Tabellenkalkulation, z.b. der Unterstützung von Formeln. Wir werden sie in Kapitel 4 implementieren. Wir rufen die privaten Funktionen createactions(), createmenus(), createcontext- Menu(), createtoolbars() und createstatusbar() auf, um den Rest des Hauptfensters einzurichten. Außerdem rufen wir die private Funktion readsettings() auf, um die gespeicherten Einstellungen der Anwendung zu lesen. Wir initialisieren den Zeiger auf finddialog als Null-Zeiger; beim ersten Aufruf von MainWindow::find() erstellen wir das Objekt FindDialog. Fenstertitel Menüleiste Symbolleistenbereiche Dock-Fensterbereiche Zentrales Widget Statusleiste Abbildung 3.2: Die Bereiche von QMainWindow 77
7 Kapitel 3 Am Ende des Konstruktors setzen wir den Wert des Fenstersymbols auf icon.png. Qt unterstützt viele Bildformate, dazu gehören BMP, GIF 1, JPEG, PNG, PNM, XBM und XPM. Der Aufruf von QWidget::setWindowIcon() legt das Symbol fest, das in der oberen linken Ecke des Fensters angezeigt wird. Leider gibt es keine plattformunabhängige Möglichkeit, das Anwendungssymbol festzulegen, das auf dem Desktop erscheint. Plattformspezifische Verfahren werden unter erläutert. GUI-Anwendungen verwenden im Allgemeinen viele Bilder. Es gibt mehrere Methoden, der Anwendung Bilder bereitzustellen. Folgende sind am gebräuchlichsten: Die Bilder werden in Dateien gespeichert und zur Laufzeit geladen. XPM-Dateien werden in den Quellcode eingefügt. (Das funktioniert, weil es sich bei XPM-Dateien auch um gültige C++-Dateien handelt.) Der Ressourcenmechanismus von Qt wird genutzt. Hier verwenden wir den Ressourcenmechanismus von Qt, da er bequemer ist als das Laden der Dateien zur Laufzeit und bei allen unterstützten Bilddateiformaten funktioniert. Wir haben uns entschieden, die Bilder innerhalb der Quellstruktur in einem Unterverzeichnis mit dem Namen images zu speichern. Um das Ressourcensystem von Qt verwenden zu können, müssen wir eine Ressourcendatei erstellen und in die PRO-Datei eine Zeile einfügen, die die Ressourcendatei kennzeichnet. In diesem Beispiel haben wir die Ressourcendatei spreadsheet.qrc genannt, sodass wir die folgende Zeile in die PRO-Datei einfügen: RESOURCES = spreadsheet.qrc Die Ressourcendatei selbst verwendet ein einfaches XML-Format. Im Folgenden sehen Sie einen Auszug aus der von uns eingesetzten Datei: <!DOCTYPE RCC><RCC version="1.0"> <qresource> <file>images/icon.png</file>... <file>images/gotocell.png</file> </qresource> </RCC> Die Ressourcendateien werden in die ausführbare Datei der Anwendung kompiliert, sodass sie nicht verloren gehen können. Wenn wir auf Ressourcen verweisen, verwen- 1 Die GIF-Unterstützung ist in Qt deaktiviert, da der von GIF-Dateien verwendete Dekomprimierungsalgorithmus in einigen Ländern, in denen Softwarepatente anerkannt werden, patentiert wurde. Wir glauben, dass dieses Patent nun weltweit abgelaufen ist. Um die GIF-Unterstützung in Qt zu aktivieren, übergeben Sie die Befehlszeilenoption -qt -gif an das Konfigurationsskript oder legen die entsprechende Option im Installationsprogramm von Qt fest. 78
8 Hauptfenster erstellen den wir das Pfadpräfix :/ (Doppelpunkt gefolgt von einem Schrägstrich). Aus diesem Grund wird das Symbol in Form von :/images/icon.png angegeben. Bei Ressourcen kann es sich um alle Arten von Dateien (nicht nur um Bilder) handeln, und wir können sie an den meisten Stellen einsetzen, an denen Qt einen Dateinamen erwartet. Sie werden in Kapitel 12 ausführlicher erörtert. 3.2 Menüs und Symbolleisten erstellen Die meisten modernen GUI-Anwendungen stellen Menüs, Kontextmenüs und Symbolleisten bereit. Die Menüs ermöglichen den Benutzern, die Anwendung kennen zu lernen und herauszufinden, wie neue Aufgaben ausgeführt werden, während die Kontextmenüs und Symbolleisten einen schnellen Zugriff auf häufig benutzte Funktionen bieten. Abbildung 3.3: Die Menüs der Anwendung Spreadsheet Durch sein Aktionskonzept vereinfacht Qt die Programmierung von Menüs und Symbolleisten. Bei einer Aktion handelt es sich um ein Element, das einer beliebigen Anzahl von Menüs und Symbolleisten hinzugefügt werden kann. Das Erstellen von Menüs und Symbolleisten umfasst in Qt die folgenden Schritte: Erstellen und Einrichten der Aktionen Erstellen und Auffüllen von Menüs mit den Aktionen Erstellen und Auffüllen von Symbolleisten mit den Aktionen In der Tabellenkalkulationsanwendung werden die Aktionen in createactions() erstellt: void MainWindow::createActions() newaction = new QAction(tr("&New"), this); newaction->seticon(qicon(":/images/new.png")); newaction->setshortcut(tr("ctrl+n")); newaction->setstatustip(tr("create a new spreadsheet file")); connect(newaction, SIGNAL(triggered()), this, SLOT(newFile())); 79
9 Kapitel 3 Die Aktion New verfügt über einen Menüeintrag mit Zugriffstaste (NEW), ein übergeordnetes Element (das Hauptfenster), ein Symbol (new.png), eine Tastenkombination ((Strg)+ (N)) und einen Statusleistentipp. Wir verbinden das Signal triggered() der Aktion mit dem privaten Slot newfile() des Hauptfensters, den wir im nächsten Abschnitt implementieren werden. Diese Verbindung gewährleistet, dass der Slot new- File() aufgerufen wird, wenn der Benutzer den Menüeintrag FILE NEW auswählt, auf die Schaltfläche NEW in der Symbolleiste klickt oder die Tastenkombination (Strg) + (N) drückt. Die Aktionen OPEN, SAVE und SAVE AS sind der Aktion NEW sehr ähnlich, sodass wir gleich zu dem Abschnitt mit den zuletzt geöffneten Dateien im Menü FILE übergehen:... for (int i = 0; i < MaxRecentFiles; ++i) recentfileactions[i] = new QAction(this); recentfileactions[i]->setvisible(false); connect(recentfileactions[i], SIGNAL(triggered()), this, SLOT(openRecentFile())); Wir füllen das Array recentfileactions mit Aktionen. Jede Aktion wird verborgen und mit dem Slot openrecentfile() verbunden. Später werden wir sehen, wie die letzten Dateiaktionen sichtbar gemacht und verwendet werden. Nun können wir zur Aktion SELECT ALL übergehen:... selectallaction = new QAction(tr("&All"), this); selectallaction->setshortcut(tr("ctrl+a")); selectallaction->setstatustip(tr("select all the cells in the " "spreadsheet")); connect(selectallaction, SIGNAL(triggered()), spreadsheet, SLOT(selectAll())); Der Slot selectall wird von einem der Vorfahren von QTableWidget bereitgestellt, und zwar von QAbstractItemView, sodass wir ihn nicht selbst zu implementieren brauchen. Gehen wir nun zur Aktion SHOW GRID im Menü OPTIONS weiter:... showgridaction = new QAction(tr("&Show Grid"), this); showgridaction->setcheckable(true); showgridaction->setchecked(spreadsheet->showgrid()); showgridaction->setstatustip(tr("show or hide the spreadsheet's " "grid")); connect(showgridaction, SIGNAL(toggled(bool)), spreadsheet, SLOT(setShowGrid(bool))); 80
10 Hauptfenster erstellen Bei SHOW GRID handelt es sich um eine aktivierbare Aktion. Sie wird im Menü mit einem Häkchen versehen und in der Symbolleiste als Umschalter dargestellt. Wenn die Aktion aktiviert wird, zeigt die Spreadsheet-Komponente ein Raster an. Wir initialisieren die Aktion mit der Standardeinstellung für die Spreadsheet-Komponente, sodass sie beim Start synchronisiert werden. Dann verbinden wir das Signal toggled(bool) der Aktion SHOW GRID mit dem Slot setshowgrid(bool) der Spreadsheet-Komponente, der von QTableWidget erbt. Nachdem diese Aktion einem Menü oder einer Symbolleiste hinzugefügt wurde, kann der Benutzer das Raster ein- und ausschalten. Die Aktionen SHOW GRID und AUTO-RECALCULATE sind unabhängig voneinander aktivierbare Aktionen. Durch die Klasse QActionGroup unterstützt Qt auch sich gegenseitig ausschließende Aktionen.... aboutqtaction = new QAction(tr("About &Qt"), this); aboutqtaction->setstatustip(tr("show the Qt library's About box")); connect(aboutqtaction, SIGNAL(triggered()), qapp, SLOT(aboutQt())); Für die Aktion ABOUT QT verwenden wir den Slot aboutqt() des Objekts QApplication, der über die globale Variable qapp zugänglich ist. Abbildung 3.4: Über Qt Nachdem wir die Aktionen erstellt haben, können wir zum Aufbau eines Menüsystems übergehen, das diese Aktionen enthält: void MainWindow::createMenus() filemenu = menubar()->addmenu(tr("&file")); filemenu->addaction(newaction); filemenu->addaction(openaction); filemenu->addaction(saveaction); filemenu->addaction(saveasaction); separatoraction = filemenu->addseparator(); 81
11 Kapitel 3 for (int i = 0; i < MaxRecentFiles; ++i) filemenu->addaction(recentfileactions[i]); filemenu->addseparator(); filemenu->addaction(exitaction); In Qt handelt es sich bei Menüs um Instanzen von QMenu. Die Funktion addmenu() erstellt ein QMenu-Widget mit festgelegtem Text und fügt es in die Menüleiste ein. Die Funktion QMainWindow::menuBar() gibt einen Zeiger auf QMenuBar zurück. Die Menüleiste wird beim ersten Aufruf von menubar() erstellt. Wir beginnen mit der Erstellung des Menüs FILE und fügen diesem die Aktionen NEW, OPEN, SAVE und SAVE AS hinzu. Um eng miteinander verbundene Elemente visuell zu gruppieren, fügen wir ein Trennzeichen ein. Wir verwenden eine for-schleife, um die (anfangs verborgenen) Aktionen aus dem Array recentfileactions einzubauen, und fügen am Ende die Aktion exitaction hinzu. Wir haben einen Zeiger auf eines der Trennzeichen beibehalten. Dieser erlaubt es uns, das Trennzeichen zu verbergen (wenn es keine zuletzt verwendeten Dateien gibt) oder einzublenden, da wir nicht zwei Trennzeichen anzeigen wollen, zwischen denen sich keine Einträge befinden. editmenu = menubar()->addmenu(tr("&edit")); editmenu->addaction(cutaction); editmenu->addaction(copyaction); editmenu->addaction(pasteaction); editmenu->addaction(deleteaction); selectsubmenu = editmenu->addmenu(tr("&select")); selectsubmenu->addaction(selectrowaction); selectsubmenu->addaction(selectcolumnaction); selectsubmenu->addaction(selectallaction); editmenu->addseparator(); editmenu->addaction(findaction); editmenu->addaction(gotocellaction); Nun erstellen wir das Menü EDIT, indem wir mit QMenu::addAction() Aktionen hinzufügen, wie wir es bereits beim Menü FILE getan haben, und mit QMenu::addMenu() das Untermenü an der Stelle einfügen, an der es erscheinen soll. Wie bei dem Menü, zu dem es gehört, handelt es sich auch bei dem Untermenü um ein Element der Klasse QMenu. toolsmenu = menubar()->addmenu(tr("&tools")); toolsmenu->addaction(recalculateaction); toolsmenu->addaction(sortaction); optionsmenu = menubar()->addmenu(tr("&options")); optionsmenu->addaction(showgridaction); 82
12 Hauptfenster erstellen optionsmenu->addaction(autorecalcaction); menubar()->addseparator(); helpmenu = menubar()->addmenu(tr("&help")); helpmenu->addaction(aboutaction); helpmenu->addaction(aboutqtaction); In ähnlicher Weise erstellen wir die Menüs TOOLS, OPTIONS und HELP. Zwischen den Menüs OPTIONS und HELP fügen wir ein Trennzeichen ein. Im Motif- und im CDE-Stil schiebt das Trennzeichen das Menü HELP nach rechts, in anderen Stilen wird es ignoriert. Abbildung 3.5: Die Menüleiste im Motif- und im Windows-Stil void MainWindow::createContextMenu() spreadsheet->addaction(cutaction); spreadsheet->addaction(copyaction); spreadsheet->addaction(pasteaction); spreadsheet->setcontextmenupolicy(qt::actionscontextmenu); Jedes Qt-Widget kann über eine Liste der mit ihm verbundenen QAction-Elemente verfügen. Um ein Kontextmenü für die Anwendung bereitzustellen, fügen wir dem Spreadsheet-Widget die gewünschten Aktionen hinzu und legen die Kontextmenürichtlinie des Widgets so fest, dass ein Kontextmenü mit diesen Aktionen angezeigt wird. Kontextmenüs werden durch Anklicken eines Widgets mit der rechten Maustaste oder durch Drücken einer plattformspezifischen Taste aufgerufen. Abbildung 3.6: Das Kontextmenü der Anwendung Spreadsheet Eine kompliziertere Möglichkeit, Kontextmenüs bereitzustellen, besteht darin, die Funktion QWidget::contextMenuEvent() neu zu implementieren, ein QMenu-Widget zu erstellen, es mit den gewünschten Aktionen zu füllen und die Funktion exec() dafür aufzurufen. 83
13 Kapitel 3 void MainWindow::createToolBars() filetoolbar = addtoolbar(tr("&file")); filetoolbar->addaction(newaction); filetoolbar->addaction(openaction); filetoolbar->addaction(saveaction); edittoolbar = addtoolbar(tr("&edit")); edittoolbar->addaction(cutaction); edittoolbar->addaction(copyaction); edittoolbar->addaction(pasteaction); edittoolbar->addseparator(); edittoolbar->addaction(findaction); edittoolbar->addaction(gotocellaction); Das Erstellen von Symbolleisten weist große Ähnlichkeiten mit der Erstellung von Menüs auf. Wir legen eine FILE- und eine EDIT-Symbolleiste an. Wie ein Menü kann auch eine Symbolleiste über Trennzeichen verfügen. Abbildung 3.7: Die Symbolleisten der Anwendung Spreadsheet 3.3 Die Statusleiste einrichten Nachdem die Menüs und Symbolleisten fertig gestellt wurden, sind wir nun bereit, die Statusleiste der Tabellenkalkulationsanwendung in Angriff zu nehmen. Im Normalzustand enthält die Statusleiste zwei Indikatoren: die Position und die Formel der aktuellen Zelle. Die Statusleiste wird auch zur Anzeige von Statusleistentipps und anderen vorübergehenden Meldungen verwendet. Normal Statusleistentipp Vorübergehende Meldung Abbildung 3.8: Die Statusleiste der Anwendung Spreadsheet 84
14 Hauptfenster erstellen Der Konstruktor von MainWindow ruft createstatusbar() auf, um die Statusleiste einzurichten: void MainWindow::createStatusBar() locationlabel = new QLabel(" W999 "); locationlabel->setalignment(qt::alignhcenter); locationlabel->setminimumsize(locationlabel->sizehint()); formulalabel = new QLabel; formulalabel->setindent(3); statusbar()->addwidget(locationlabel); statusbar()->addwidget(formulalabel, 1); connect(spreadsheet, SIGNAL(currentCellChanged(int, int, int, int)), this, SLOT(updateStatusBar())); connect(spreadsheet, SIGNAL(modified()), this, SLOT(spreadsheetModified())); updatestatusbar(); Die Funktion QMainWindow::statusBar() gibt einen Zeiger auf die Statusleiste zurück. (Die Statusleiste wird beim ersten Aufruf von statusbar() erstellt.) Die Statusindikatoren sind einfache QLabel-Elemente, deren Text wir nach Bedarf ändern. In formulalabel haben wir einen Einzug eingefügt, sodass der darin angezeigte Text etwas vom linken Rand versetzt dargestellt wird. Beim Hinzufügen der QLabel-Elemente zur Statusleiste wird der Verwandtschaftsgrad neu festgelegt, sodass sie zu untergeordneten Elementen der Statusleiste werden. Abbildung 3.8zeigt, dass die beiden Label unterschiedliche Platzanforderungen haben. Der Zellenpositionsindikator braucht sehr wenig Platz, und wenn die Größe des Fensters neu festgelegt wird, sollte jeglicher zusätzliche Raum dem Zellenformelindikator auf der rechten Seite zugewiesen werden. Dies wird durch die Angabe des Dehnungsfaktors 1 im Aufruf der Funktion QStatusBar::addWidget() beim Einfügen von formula- Label erreicht. Der Standarddehnungsfaktor des Positionsindikators ist 0, d.h., er sollte nicht gedehnt werden. Wenn die Klasse QStatusBar Indikator-Widgets anordnet, versucht sie, jeweils die von QWidget::sizeHint() vorgegebene Idealgröße zu beachten, und dehnt dann alle dehnbaren Widgets, um den verfügbaren Platz auszufüllen. Die Idealgröße eines Widgets selbst hängt von seinem Inhalt ab und variiert, wenn wir diesen ändern. Um eine ständige Größenanpassung des Positionsindikators zu vermeiden, legen wir seine Mindestgröße so fest, dass er breit genug ist, um den längstmöglichen Text (»W999«) 85
15 Kapitel 3 aufzunehmen, und fügen noch etwas zusätzlichen Platz hinzu. Außerdem setzen wir die Ausrichtung auf Qt::AlignHCenter, damit der Text horizontal zentriert wird. Kurz vor dem Ende der Funktion verbinden wir zwei Signale von Spreadsheet mit den beiden MainWindow-Slots updatestatusbar() und spreadsheetmodified(). void MainWindow::updateStatusBar() locationlabel->settext(spreadsheet->currentlocation()); formulalabel->settext(spreadsheet->currentformula()); Der Slot updatestatusbar() aktualisiert den Zellenpositions- und den Zellenformelindikator. Er wird jedes Mal aufgerufen, wenn der Benutzer den Zellencursor in eine neue Zelle bewegt. Der Slot wird am Ende von createstatusbar() auch als normale Funktion verwendet, um die Indikatoren zu initialisieren. Das ist notwendig, da die Spreadsheet-Anwendung beim Start kein currentcellchanged()-signal ausgibt. void MainWindow::spreadsheetModified() setwindowmodified(true); updatestatusbar(); Der Slot spreadsheetmodified() setzt den Wert der Eigenschaft windowmodified auf true und aktualisiert damit die Titelleiste. Außerdem aktualisiert die Funktion die Positions- und Formelindikatoren, sodass sie den aktuellen Stand der Dinge widerspiegeln. 3.4 Das Datei-Menü implementieren In diesem Abschnitt implementieren wir die Slots und die privaten Funktionen, die für die Funktionsweise der Optionen des Menüs FILE und für die Verwaltung der Liste der zuletzt geöffneten Dateien erforderlich sind. void MainWindow::newFile() if (oktocontinue()) spreadsheet->clear(); setcurrentfile(""); Der Slot newfile() wird aufgerufen, wenn der Benutzer auf die Menüoption FILE NEW oder die Schaltfläche NEW in der Symbolleiste klickt. Die private Funktion oktocontinue() fragt den Benutzer, ob er seine Änderungen speichern möchte (»DO YOU WANT TO SAVE YOUR CHANGES?«), wenn ungespeicherte Änderungen vorliegen. Sie gibt den Wert true zurück, wenn der Benutzer entweder YES oder NO ausgewählt hat (wobei 86
16 Hauptfenster erstellen das Dokument bei YES gespeichert wird), und false, wenn der Benutzer CANCEL gewählt hat. Die Funktion Spreadsheet::clear() löscht alle Zellen und Formeln der Tabellenkalkulation. Zusätzlich zur Festlegung der privaten Variablen curfile und zur Aktualisierung der Liste der zuletzt geöffneten Dateien aktualisiert die private Funktion setcurrentfile()den Titel des Fensters mit der Angabe, dass ein unbenanntes Dokument bearbeitet wird. Abbildung 3.9: Abfrage zum Speichern bei geänderten Daten bool MainWindow::okToContinue() if (iswindowmodified()) int r = QMessageBox::warning(this, tr("spreadsheet"), tr("the document has been modified.\n" "Do you want to save your changes?"), QMessageBox::Yes QMessageBox::Default, QMessageBox::No, QMessageBox::Cancel QMessageBox::Escape); if (r == QMessageBox::Yes) return save(); else if (r == QMessageBox::Cancel) return false; return true; In oktocontinue() überprüfen wir den Status der Eigenschaft windowmodified. Lautet der Wert true, bringen wir das in Abbildung 3.9 dargestellte Nachrichtenfeld zur Anzeige. Dieses Feld enthält die Schaltflächen YES, NO und CANCEL. Der Modifikator QMessageBox::Default bestimmt YES als Standardschaltfläche, während der Modifikator QMessageBox::Escape die (Esc)-Taste als Synonym für CANCEL festlegt. Der Aufruf von warning() mag auf den ersten Blick etwas Furcht erregend aussehen, aber die allgemeine Syntax ist einfach: QMessageBox::warning(übergeordnetes_Element, Titel, Meldung, Schaltfläche0, Schaltfläche1,...); 87
17 Kapitel 3 QMessageBox stellt auch die Funktionen information(), question() und critical() bereit, die jeweils über ihr eigenes besonderes Symbol verfügen. Information Frage Warnung Fehler Abbildung 3.10: Symbole für das Nachrichtenfeld void MainWindow::open() if (oktocontinue()) QString filename = QFileDialog::getOpenFileName(this, tr("open Spreadsheet"), ".", tr("spreadsheet files (*.sp)")); if (!filename.isempty()) loadfile(filename); Der Slot open() entspricht FILE OPEN. Wie newfile() ruft er zuerst oktocontinue() auf, um eventuelle ungespeicherte Änderungen zu verarbeiten. Dann verwendet er die statische Komfortfunktion QFileDialog::getOpenFileName(), um vom Benutzer einen neuen Dateinamen anzufordern. Die Funktion öffnet ein Dateidialogfeld, lässt den Benutzer eine Datei auswählen und gibt den Dateinamen zurück oder einen leeren String, falls der Benutzer auf CANCEL geklickt hat. Das erste Argument von QFileDialog::getOpenFileName() ist das übergeordnete Widget. Die Verwandtschaftsbeziehung hat bei Dialogfeldern nicht dieselbe Bedeutung wie bei anderen Widgets. Ein Dialogfeld ist stets ein eigenständiges Fenster, wenn es jedoch über ein übergeordnetes Element verfügt, wird es standardmäßig über diesem Element zentriert. Ein untergeordnetes Dialogfeld nutzt auch den Taskleisteneintrag gemeinsam mit seinem übergeordneten Element. Das zweite Argument ist der Titel, den das Dialogfeld verwenden soll, das dritte gibt an, in welchem Verzeichnis es beginnen soll. In unserem Fall handelt es sich um das aktuelle Verzeichnis. Das vierte Argument legt die Dateifilter fest. Ein Dateifilter besteht aus einem Beschreibungstext und einem Platzhaltermuster. Hätten wir Dateien mit komma-separierten Werten und Lotus Dateien zusätzlich zu dem eigenen Dateiformat der Tabellenkalkulation zugelassen, so hätten wir den folgenden Filter verwendet: tr("spreadsheet files (*.sp)\n" "Comma-separated values files (*.csv)\n" "Lotus files (*.wk1 *.wks)") 88
18 Hauptfenster erstellen Die private Funktion loadfile() wurde in open() aufgerufen, um die Datei zu laden. Wir machen daraus eine unabhängige Funktion, da wir dieselbe Funktionalität brauchen, um die zuletzt geöffneten Dateien zu laden: bool MainWindow::loadFile(const QString &filename) if (!spreadsheet->readfile(filename)) statusbar()->showmessage(tr("loading canceled"), 2000); return false; setcurrentfile(filename); statusbar()->showmessage(tr("file loaded"), 2000); return true; Wir verwenden Spreadsheet::readFile(), um die Datei vom Datenträger zu lesen. Ist der Ladevorgang erfolgreich, rufen wir setcurrentfile() auf, um den Titel des Fensters zu aktualisieren; andernfalls hat Spreadsheet::readFile() den Benutzer mit einem Meldungsfeld bereits über das Problem informiert. Im Allgemeinen ist es sinnvoll, Fehlermeldungen von Komponenten der unteren Ebene ausgeben zu lassen, da sie die genauen Fehlerdetails angeben können. In beiden Fällen zeigen wir zwei Sekunden (2.000 Millisekunden) lang eine Meldung in der Statusleiste an, um den Benutzer über die Arbeit der Anwendung auf dem Laufenden zu halten. bool MainWindow::save() if (curfile.isempty()) return saveas(); else return savefile(curfile); bool MainWindow::saveFile(const QString &filename) if (!spreadsheet->writefile(filename)) statusbar()->showmessage(tr("saving canceled"), 2000); return false; setcurrentfile(filename); statusbar()->showmessage(tr("file saved"), 2000); return true; 89
19 Kapitel 3 Der Slot save() entspricht FILE SAVE. Wenn die Datei bereits einen Namen hat, da sie zuvor schon einmal geöffnet oder gespeichert wurde, wird savefile() von save() mit diesem Namen aufgerufen; andernfalls wird einfach saveas() aufgerufen. bool MainWindow::saveAs() QString filename = QFileDialog::getSaveFileName(this, tr("save Spreadsheet"), ".", tr("spreadsheet files (*.sp)")); if (filename.isempty()) return false; return savefile(filename); Der Slot saveas() entspricht FILE SAVE AS. Wir rufen QFileDialog::getSaveFileName() auf, um den Dateinamen vom Benutzer anzufordern. Wenn der Benutzer auf CANCEL klickt, geben wir den Wert false zurück, der bis zum Aufrufenden (save() oder oktocontinue()) weitergegeben wird. Existiert die Datei bereits, bittet die Funktion getsavefilename() den Benutzer zu bestätigen, dass sie überschrieben werden soll. Dieses Verhalten kann geändert werden, indem Sie QFileDialog::DontConfirmOverwrite als zusätzliches Argument an getsavefilename() übergeben. void MainWindow::closeEvent(QCloseEvent *event) if (oktocontinue()) writesettings(); event->accept(); else event->ignore(); Wenn der Benutzer auf FILE EXIT oder auf die Schaltfläche zum Schließen in der Titelleiste des Fensters klickt, wird der Slot QWidget::close() aufgerufen. Dieser sendet ein close-ereignis an das Widget. Durch eine Neuimplementierung von QWidget:: closeevent() können wir Versuche, das Hauptfenster zu schließen, unterbrechen und entscheiden, ob das Fenster tatsächlich geschlossen werden soll oder nicht. Wenn nicht gespeicherte Änderungen vorhanden sind und der Benutzer CANCEL wählt,»ignorieren«wir das Ereignis und lassen das Fenster davon unberührt. Im Normalfall nehmen wir das Ereignis an, was in Qt zum Verbergen des Fensters führt. Außerdem rufen wir die private Funktion writesettings() auf, um die aktuellen Einstellungen der Anwendung zu speichern. 90
20 Hauptfenster erstellen Wenn das letzte Fenster geschlossen wird, wird die Anwendung beendet. Gegebenenfalls können wir dieses Verhalten deaktivieren, indem wir die Eigenschaft quitonlast- WindowClosed von QApplication auf den Wert false setzen, sodass die Anwendung weiterhin ausgeführt wird, bis wir QAppication::quit() aufrufen. void MainWindow::setCurrentFile(const QString &filename) curfile = filename; setwindowmodified(false); QString shownname = "Untitled"; if (!curfile.isempty()) shownname = strippedname(curfile); recentfiles.removeall(curfile); recentfiles.prepend(curfile); updaterecentfileactions(); setwindowtitle(tr("%1[*] - %2").arg(shownName).arg(tr("Spreadsheet"))); QString MainWindow::strippedName(const QString &fullfilename) return QFileInfo(fullFileName).fileName(); In setcurrentfile() legen wir die private Variable curfile fest, die den Namen der bearbeiteten Datei speichert. Bevor wir den Dateinamen in der Titelleiste anzeigen, entfernen wir um der Benutzerfreundlichkeit willen den Dateipfad mithilfe von strippedname(). Jedes QWidget-Element verfügt über die Eigenschaft windowmodified, deren Wert auf true gesetzt werden sollte, wenn das Dokument des Fensters nicht gespeicherte Änderungen aufweist; andernfalls sollte der Wert false lauten. Unter Mac OS X werden nicht gespeicherte Dokumente durch einen Punkt in der SCHLIEßEN-Schaltfläche der Titelleiste des Fensters gekennzeichnet, auf anderen Plattformen geschieht dies durch ein Sternchen hinter dem Dateinamen. Qt achtet automatisch auf dieses Verhalten, solange wir die Eigenschaft windowmodified auf dem aktuellen Stand halten und die Markierung [*] an der Stelle im Titel des Fensters platzieren, an der bei Bedarf das Sternchen erscheinen soll. Der Text, den wir an die Funktion setwindowtitle() übergeben haben, lautet wie folgt: (tr("%1[*] - %2").arg(shownName).arg(tr("Spreadsheet"))); 91
21 Kapitel 3 Die Funktion QString::arg() ersetzt den Parameter %n mit der niedrigsten Zahl durch ihr Argument und gibt den sich daraus ergebenden String zurück. In diesem Fall wird arg() mit zwei %n-parametern verwendet. Der erste Aufruf von arg() ersetzt %1 und der zweite %2. Wenn der Dateiname budget.sp lautet und keine Übersetzungsdatei geladen wird, lautet der resultierende String budget.sp[*] - Spreadsheet. Es wäre einfacher gewesen, Folgendes zu schreiben: setwindowtitle(shownname + tr("[*] spreadsheet")); Allerdings bietet arg() eine größere Flexibilität für Übersetzer. Ist ein Dateiname vorhanden, aktualisieren wir recentfiles, d.h. die Liste der von der Anwendung zuletzt geöffneten Dateien. Wir rufen removeall() auf, um alle Stellen, an denen der Dateiname vorkommt, aus der Liste zu entfernen und Duplikate zu verhindern; dann rufen wir prepend() auf, um den Dateinamen als erstes Element einzufügen. Nach der Aktualisierung der Liste rufen wir die private Funktion updaterecentfileactions() auf, um die Einträge im Menü FILE zu aktualisieren. void MainWindow::updateRecentFileActions() QMutableStringListIterator i(recentfiles); while (i.hasnext()) if (!QFile::exists(i.next())) i.remove(); for (int j = 0; j < MaxRecentFiles; ++j) if (j < recentfiles.count()) QString text = tr("&%1 %2").arg(j + 1).arg(strippedName(recentFiles[j])); recentfileactions[j]->settext(text); recentfileactions[j]->setdata(recentfiles[j]); recentfileactions[j]->setvisible(true); else recentfileactions[j]->setvisible(false); separatoraction->setvisible(!recentfiles.isempty()); Wir beginnen damit, mithilfe eines Iterators im Java-Stil alle nicht mehr vorhandenen Dateien zu entfernen. Einige Dateien wurden vielleicht in einer früheren Sitzung verwendet, sind aber danach gelöscht worden. Der Typ der Variablen recentfiles ist QStringList (Liste von QString-Elementen). Kapitel 11 erläutert Containerklassen wie QStringList ausführlich, wobei gezeigt wird, wie sie zur Standard-Vorlagenbibliothek 92
22 Hauptfenster erstellen von C++ in Beziehung stehen, und erklärt die Verwendung der Iteratorklassen von Qt im Java-Stil. Dann gehen wir die Liste der Dateien erneut durch und verwenden diesmal eine arrayartige Indizierung. Für jede Datei erstellen wir einen String, der aus einem kaufmännischen Und-Zeichen, einer Ziffer (j + 1), einem Leerzeichen und dem Dateinamen (ohne Pfadangabe) besteht. Wir legen fest, dass die entsprechende Aktion diesen Text verwenden soll. Wäre die erste Datei beispielsweise C:\Eigene Dateien\tab04.sp, würde der Text der ersten Aktion &1 tab04.sp lauten. recentfileactions[0] recentfileactions[1] recentfileactions[2] recentfileactions[3] recentfileactions[4] separator Action Abbildung 3.11: Das Menü FILE mit den zuletzt geöffneten Dateien Jede Aktion kann mit einem Datenelement vom Typ QVariant verbunden sein. Dieser Typ kann Werte vieler C++- und Qt-Typen übernehmen. Er wird in Kapitel 11 behandelt. Hier speichern wir den vollständigen Namen der Datei im data-element der Aktion, sodass wir ihn später leicht abrufen können. Außerdem legen wir fest, dass die Aktion sichtbar sein soll. Sind mehr Dateiaktionen als zuletzt geöffnete Dateien vorhanden, verbergen wir diese zusätzlichen Aktionen einfach. Ist mindestens eine kürzlich geöffnete Datei vorhanden, legen wir abschließend fest, dass das Trennzeichen sichtbar sein soll. void MainWindow::openRecentFile() if (oktocontinue()) QAction *action = qobject_cast<qaction *>(sender()); if (action) loadfile(action->data().tostring()); 93
23 Kapitel 3 Wenn der Benutzer eine kürzlich geöffnete Datei auswählt, wird der Slot open- RecentFile aufgerufen. Die Funktion oktocontinue() wird in dem Fall verwendet, dass nicht gespeicherte Änderungen vorliegen. Sofern der Benutzer sie nicht gelöscht hat, finden wir mithilfe von QObject::sender() heraus, welche Aktion den Slot aufgerufen hat. Anhand der von moc, dem Metaobjekt-Compiler von Qt, generierten Metainformationen führt die Funktion qobject_cast<t>() eine dynamische Typumwandlung durch. Sie gibt einen Zeiger auf die angeforderte QObject-Subklasse oder 0 zurück, wenn das Objekt nicht in diesen Typ umgewandelt werden kann. Im Gegensatz zu dynamic_cast<t>() in Standard-C++ funktioniert qobject_cast<t>() von Qt über die Grenzen dynamischer Bibliotheken hinweg. In unserem Beispiel verwenden wir qobject_cast<t>(), um einen QObject-Zeiger in einen QAction-Zeiger umzuwandeln. Verläuft die Typumwandlung erfolgreich (was der Fall sein sollte), rufen wir load- File() mit dem vollständigen Dateinamen auf, den wir aus den Aktionsdaten extrahieren. Da wir wissen, dass der Absender QAction ist, würde das Programm übrigens auch dann noch funktionieren, wenn wir stattdessen static_cast<t>() oder eine traditionelle Typumwandlung im C-Stil verwendet hätten. Eine Übersicht über die verschiedenen C++-Typumwandlungen finden Sie im Abschnitt»Typumwandlungen«in Anhang B. 3.5 Dialogfelder verwenden In diesem Abschnitt erläutern wir, wie Sie Dialogfelder in Qt verwenden wie Sie sie erstellen und initialisieren, ausführen und auf die Auswahl reagieren, die von dem Benutzer getroffen wird, der mit den Dialogfeldern interagiert. Wir nutzen die Dialogfelder FIND, GO TO CELL und SORT, die wir in Kapitel 2 erstellt haben. Außerdem erstellen wir ein einfaches ABOUT-Feld. Abbildung 3.12: Das Dialogfeld FIND der Tabellenkalkulationsanwendung 94
24 Hauptfenster erstellen Wir beginnen mit dem Dialogfeld FIND. Da wir den Benutzer in die Lage versetzen wollen, nach Belieben zwischen dem Hauptfenster von Spreadsheet und dem Dialogfeld FIND zu wechseln, darf das Dialogfeld nicht modal sein. Nicht modal ist ein Fenster, das unabhängig von allen anderen Anwendungsfenstern ausgeführt wird. Beim Erstellen von nicht modalen Dialogfeldern werden deren Signale normalerweise mit Slots verbunden, die auf die Benutzerinteraktionen reagieren. void MainWindow::find() if (!finddialog) finddialog = new FindDialog(this); connect(finddialog, SIGNAL(findNext(const QString &, Qt::CaseSensitivity)), spreadsheet, SLOT(findNext(const QString &, Qt::CaseSensitivity))); connect(finddialog, SIGNAL(findPrevious(const QString &, Qt::CaseSensitivity)), spreadsheet, SLOT(findPrevious(const QString &, Qt::CaseSensitivity))); finddialog->show(); finddialog->activatewindow(); Das Dialogfeld FIND ist ein Fenster, das dem Benutzer ermöglicht, die Tabellenkalkulation nach Text zu durchsuchen. Der Slot find() wird aufgerufen, wenn der Benutzer auf EDIT FIND klickt, um das Dialogfeld FIND aufzurufen. An dieser Stelle sind mehrere Szenarien möglich: Der Benutzer hat das Dialogfeld zum ersten Mal aufgerufen. Das Dialogfeld FIND wurde bereits zuvor aufgerufen, aber der Benutzer hat es geschlossen. Das Dialogfeld FIND wurde bereits zuvor aufgerufen und ist immer noch sichtbar. Wenn das Dialogfeld FIND noch nicht existiert, erstellen wir es und verbinden seine Signale findnext() und findprevious() mit den entsprechenden Spreadsheet-Slots. Wir hätten das Dialogfeld auch im MainWindow-Konstruktor erstellen können, aber das Hinauszögern der Erstellung erlaubt einen schnelleren Start der Anwendung. Wird das Dialogfeld niemals verwendet, wird es auch nie erstellt, was sowohl Zeit als auch Speicher einspart. Dann rufen wir show() und activatewindow() auf, um sicherzustellen, dass das Fenster sichtbar und aktiv ist. Ein Aufruf von show() allein reicht aus, um ein verborgenes Fenster anzuzeigen und zu aktivieren, aber das Dialogfeld FIND kann aufgerufen werden, wenn sein Fenster bereits sichtbar ist. In diesem Fall hat show() keine Auswirkun- 95
25 Kapitel 3 gen, und activatewindow() ist erforderlich, um das Fenster zu aktivieren. Alternativ hätten wir Folgendes schreiben können: if (finddialog->ishidden()) finddialog->show(); else finddialog->activatewindow(); Das ist aber in etwa so, als würde jemand in beide Richtungen schauen, bevor er eine Einbahnstraße überquert. Nun sehen wir uns das Dialogfeld GO TO CELL an. Wir wollen, dass der Benutzer es öffnet, benutzt und schließt, ohne dabei in ein anderes Anwendungsfenster wechseln zu können. Das bedeutet, dass das Dialogfeld GO TO CELL modal sein muss. Modal ist ein Fenster, das sich öffnet, wenn es aufgerufen wird, die Anwendung blockiert und damit die Verarbeitung von Interaktionen verhindert, bis das Fenster geschlossen wird. Die von uns zuvor verwendeten Dateidialog- und Meldungsfelder waren modal. Abbildung 3.13: Das Dialogfeld GO TO CELL der Anwendung Spreadsheet Ein Dialogfeld ist nicht modal, wenn es mithilfe von show() aufgerufen wird (sofern wir nicht vorher setmodal() aufrufen, um es zu einem modalen Dialogfeld zu machen); es ist modal, wenn es mithilfe von exec() aufgerufen wird. void MainWindow::goToCell() GoToCellDialog dialog(this); if (dialog.exec()) QString str = dialog.lineedit->text().toupper(); spreadsheet->setcurrentcell(str.mid(1).toint() - 1, str[0].unicode() - 'A'); Die Funktion QDialog::exec() liefert den Wert»wahr«(QDialog::Accepted) zurück wenn der Dialog mit OK geschlossen wurde, andernfalls den Wert»falsch«(QDialog::Rejected). Denken Sie daran, dass wir OK mit accept() und CANCEL mit reject() verbunden haben, als wir das Dialogfeld GO TO CELL mithilfe von Qt Designer in Kapitel 2 erstellt haben. Wenn der Benutzer OK wählt, setzen wir die aktuelle Zelle auf den im Zeileneditor eingegebenen Wert. 96
26 Hauptfenster erstellen Die Funktion QTableWidget::setCurrentCell() erwartet zwei Argumente: einen Zeilenund einen Spaltenindex. In der Tabellenkalkulationsanwendung ist Zelle A1 die Zelle (0, 0) und Zelle B27 die Zelle (26, 1). Um den Zeilenindex aus dem von QLine- Edit::text() zurückgegebenen QString abzurufen, extrahieren wir die Zeilennummer mithilfe von QString::mid() (wovon ein Teilstring von der Anfangsposition bis zum Ende des Strings zurückgegeben wird), konvertieren sie mithilfe von QString::toInt() in den Typ int und subtrahieren 1. Für die Spaltennummer subtrahieren wir den numerischen Wert von 'A' von dem numerischen Wert des ersten Großbuchstabens im String. Wir wissen, dass der String das richtige Format aufweist, da der Validator QReg- ExpValidator, den wir für das Dialogfeld erstellt haben, die Aktivierung der Schaltfläche OK nur gestattet, wenn wir einen Buchstaben vorliegen haben, auf den drei Ziffern folgen. Die Funktion gotocell() unterscheidet sich insofern von dem gesamten bisher betrachteten Code, als dass sie ein Widget (GoToCellDialog) als Variable auf dem Stack erstellt. Mit einer Zeile mehr hätten wir genauso einfach new und delete verwenden können: void MainWindow::goToCell() GoToCellDialog *dialog = new GoToCellDialog(this); if (dialog->exec()) QString str = dialog->lineedit->text().toupper(); spreadsheet->setcurrentcell(str.mid(1).toint() - 1, str[0].unicode() - 'A'); delete dialog; Modale Dialogfelder (und Kontextmenüs in Neuimplementierungen von QWidget::contextMenuEvent()) auf dem Stack zu erstellen, ist ein gebräuchliches Programmiermuster, da wir das Dialogfeld (oder Menü) nach der Benutzung normalerweise nicht mehr brauchen und es am Ende des umschließenden Gültigkeitsbereichs automatisch gelöscht wird. Nun wenden wir uns dem Dialogfeld SORT zu. Dabei handelt es sich um ein modales Dialogfeld, das es dem Benutzer gestattet, den zurzeit ausgewählten Bereich nach den angegebenen Spalten zu sortieren. Abbildung 3.14 zeigt ein Beispiel für die Sortierung, wobei Spalte B den primären und Spalte A den sekundären Sortierschlüssel (beide in aufsteigender Reihenfolge) bildet. 97
27 Kapitel 3 (a) Vor dem Sortieren (b) Nach dem Sortieren Abbildung 3.14: Sortieren des ausgewählten Bereichs der Tabellenkalkulation void MainWindow::sort() SortDialog dialog(this); QTableWidgetSelectionRange range = spreadsheet->selectedrange(); dialog.setcolumnrange('a' + range.leftcolumn(), 'A' + range.rightcolumn()); if (dialog.exec()) SpreadsheetCompare compare; compare.keys[0] = dialog.primarycolumncombo->currentindex(); compare.keys[1] = dialog.secondarycolumncombo->currentindex() - 1; compare.keys[2] = dialog.tertiarycolumncombo->currentindex() - 1; compare.ascending[0] = (dialog.primaryordercombo->currentindex() == 0); compare.ascending[1] = (dialog.secondaryordercombo->currentindex() == 0); compare.ascending[2] = (dialog.tertiaryordercombo->currentindex() == 0); spreadsheet->sort(compare); Der Code in sort() folgt einem ähnlichen Muster, wie es für gotocell() verwendet wurde: Wir erstellen das Dialogfeld auf dem Stack und initialisieren es. Wir öffnen das Dialogfeld mithilfe von exec(). Wenn der Benutzer auf OK klickt, extrahieren wir die von ihm eingegebenen Werte aus den Widgets des Dialogfelds und nutzen sie. 98
28 Hauptfenster erstellen Der Aufruf von setcolumnrange() setzt die für die Sortierung zur Verfügung stehenden Spalten auf die ausgewählten Spalten. Unter Verwendung der in Abbildung 3.14 gezeigten Auswahl würde range.leftcolumn() beispielsweise 0 liefern, was 'A' + 0 = 'A' ergibt, während range.rightcolumn() den Wert 2 liefert, also 'A' + 2 = 'C'. Das Objekt compare speichert den primären, den sekundären und den tertiären Sortierungsschlüssel und ihre Sortierreihenfolge. (Wir werden die Definition der Klasse SpreadsheetCompare im nächsten Kapitel erörtern.) Das Objekt wird von Spreadsheet::sort() verwendet, um zwei Zeilen zu vergleichen. Das Array keys speichert die Spaltennummern der Schlüssel. Wenn die Auswahl beispielsweise von C2 bis E5 reicht, hat die Spalte C die Position 0. Das Array ascending speichert die mit den einzelnen Schlüsseln verbundene Reihenfolge als bool-wert. QComboBox::currentIndex() gibt den Index des zurzeit ausgewählten Elements zurück, und zwar beginnend bei 0. Für den sekundären und tertiären Schlüssel subtrahieren wir 1 von dem aktuellen Element, um das None-Element zu berücksichtigen. Die Funktion sort() führt die Aufgabe aus, ist aber etwas anfällig. Sie setzt voraus, dass das Dialogfeld SORT in einer bestimmten Weise implementiert ist, und zwar mit Kombinationsfeldern und None-Elementen. Das bedeutet, dass wir beim Neudesign des Dialogfelds SORT möglicherweise auch diesen Code neu schreiben müssen. Während dieser Ansatz für ein Dialogfeld geeignet ist, das nur von einer Stelle aus aufgerufen wird, öffnet er bei der Wartung Albträumen Tür und Tor, wenn das Dialogfeld an mehreren Stellen verwendet wird. Ein soliderer Ansatz besteht darin, die Klasse SortDialog intelligenter zu gestalten, indem sie selbst ein SpreadsheetCompare-Objekt erstellt, auf das der Aufrufende nicht zugreifen kann. Damit wird MainWindow::sort() erheblich vereinfacht: void MainWindow::sort() SortDialog dialog(this); QTableWidgetSelectionRange range = spreadsheet->selectedrange(); dialog.setcolumnrange('a' + range.leftcolumn(), 'A' + range.rightcolumn()); if (dialog.exec()) spreadsheet->performsort(dialog.comparisonobject()); Dieser Ansatz führt zu lose gekoppelten Komponenten und stellt fast immer die richtige Wahl für Dialogfelder dar, die von mehr als einer Stelle aus aufgerufen werden. Ein radikalerer Ansatz besteht darin, bei der Initialisierung des Objekts SortDialog einen Zeiger auf das Objekt Spreadsheet zu übergeben und dem Dialogfeld zu gestatten, direkt auf Spreadsheet einzuwirken. Dadurch wird SortDialog weniger umfassend, da es nur bei einem bestimmten Widget-Typ funktioniert, aber es vereinfacht den Code noch weiter, indem die Funktion SortDialog::setColumnRange() entfernt wird. Die Funktion MainWindow::sort() wird dann zu: 99
29 Kapitel 3 void MainWindow::sort() SortDialog dialog(this); dialog.setspreadsheet(spreadsheet); dialog.exec(); Dieser Ansatz verhält sich spiegelbildlich zum ersten: Anstelle des Aufrufenden benötigt nun das Dialogfeld eingehende Kenntnisse über die von dem Aufrufenden gelieferten Datenstrukturen. Dieser Ansatz kann nützlich sein, wenn das Dialogfeld Änderungen direkt anwenden muss. Ebenso wie der aufrufende Code beim ersten Ansatz anfällig ist, versagt dieser dritte Ansatz, wenn sich die Datenstrukturen ändern. Einige Entwickler wählen nur einen Ansatz für die Verwendung von Dialogfeldern und bleiben auch dabei. Dies hat den Vorteil der Vertrautheit und Einfachheit, da die Verwendung ihrer Dialogfelder stets demselben Muster folgt. Allerdings fehlen auch die Vorteile der nicht verwendeten Ansätze. Idealerweise sollte die Entscheidung über die zu verwendende Vorgehensweise für jedes Dialogfeld einzeln getroffen werden. Wir runden diesen Abschnitt mit dem Feld ABOUT ab. Wie im Fall von FIND oder GO TO CELL könnten wir ein benutzerdefiniertes Dialogfeld erstellen, um die Informationen über die Anwendung zu präsentieren, aber da die meisten Informationsfelder dieser Art sehr stilisiert sind, bietet Qt eine einfachere Lösung. void MainWindow::about() QMessageBox::about(this, tr("about Spreadsheet"), tr("<h2>spreadsheet 1.1</h2>" "<p>copyright 2006 Software Inc." "<p>spreadsheet is a small application that " "demonstrates QAction, QMainWindow, QMenuBar, " "QStatusBar, QTableWidget, QToolBar, and many other " "Qt classes.")); Das Feld ABOUT erhalten Sie durch den Aufruf von QMessageBox::about(), einer statischen Komfortfunktion. Sie weist große Ähnlichkeiten mit QMessageBox::warning() auf, mit der Ausnahme, dass sie das Symbol des übergeordneten Fensters statt des Standardsymbols für Warnungen verwendet. Bisher haben wir mehrere statische Komfortfunktionen sowohl von QMessageBox als auch von QFileDialog verwendet. Diese Funktionen erstellen ein Dialogfeld, initialisieren es und rufen exec()auf. Darüber hinaus ist es möglich, wenn auch nicht so bequem, ein QMessageBox- oder QFileDialog-Widget wie alle anderen Widgets zu erstellen und exec() oder sogar show()explizit dafür aufzurufen. 100
30 Hauptfenster erstellen Abbildung 3.15: Über Spreadsheet 3.6 Einstellungen speichern Im Konstruktor MainWindow haben wir readsettings() aufgerufen, um die gespeicherten Einstellungen der Anwendung aufzurufen. In ähnlicher Weise haben wir writesettings() in closeevent() aufgerufen, um die Einstellungen zu speichern. Diese beiden Funktionen sind die letzten Memberfunktionen von MainWindow, die implementiert werden müssen. void MainWindow::writeSettings() QSettings settings("software Inc.", "Spreadsheet"); settings.setvalue("geometry", geometry()); settings.setvalue("recentfiles", recentfiles); settings.setvalue("showgrid", showgridaction->ischecked()); settings.setvalue("autorecalc", autorecalcaction->ischecked()); Die Funktion writesettings() speichert die Geometrie (Position und Größe) des Hauptfensters, die Liste der zuletzt geöffneten Dateien und die Optionen SHOW GRID und AUTO-RECALCULATE. Standardmäßig speichert QSettings die Einstellungen der Anwendung an plattformspezifischen Orten. Unter Windows wird die Systemregistrierung verwendet, unter Unix werden die Daten in Textdateien gespeichert, und unter Mac OS X wird das Core Foundation Preferences-API verwendet. Die Konstruktorargumente geben den Namen der Organisation und der Anwendung an. Diese Informationen werden in plattformspezifischer Weise verwendet, um einen Speicherort für die Einstellungen zu finden. 101
31 Kapitel 3 QSettings speichert Einstellungen als Schlüssel/Wert-Paare. Der Schlüssel ähnelt dem Pfad eines Dateisystems. Unterschlüssel können mithilfe einer pfadähnlichen Syntax (z.b. finddialog/matchcase) oder unter Verwendung von begingroup() und endgroup() angegeben werden: settings.begingroup("finddialog"); settings.setvalue("matchcase", casecheckbox->ischecked()); settings.setvalue("searchbackward", backwardcheckbox->ischecked()); settings.endgroup(); Bei dem Wert kann es sich um int, bool, double, QString, QStringList oder jeden anderen von QVariant unterstützten Typ handeln, wozu auch registrierte benutzerdefinierte Typen gehören. void MainWindow::readSettings() QSettings settings("software Inc.", "Spreadsheet"); QRect rect = settings.value("geometry", QRect(200, 200, 400, 400)).toRect(); move(rect.topleft()); resize(rect.size()); recentfiles = settings.value("recentfiles").tostringlist(); updaterecentfileactions(); bool showgrid = settings.value("showgrid", true).tobool(); showgridaction->setchecked(showgrid); bool autorecalc = settings.value("autorecalc", true).tobool(); autorecalcaction->setchecked(autorecalc); Die Funktion readsettings() lädt die von writesettings() gespeicherten Einstellungen. Das zweite Argument der Funktion value() gibt einen Standardwert an, falls keine Einstellungen zur Verfügung stehen. Die Standardwerte werden bei der ersten Ausführung der Anwendung verwendet. Da kein zweites Argument für die Liste der zuletzt geöffneten Dateien vorgegeben ist, wird es bei der ersten Ausführung auf eine leere Liste gesetzt. Qt stellt als Ergänzung zu QWidget::geometry() die Funktion QWidget::setGeometry() bereit, die jedoch aufgrund der Begrenzungen in vielen Fenstermanagern nicht immer so funktioniert, wie wir es von X11 erwarten. Aus diesem Grund verwenden wir stattdessen move() und resize(). (Eine ausführliche Erläuterung finden Sie unter doc.trolltech.com/4.1/geometry.html.) Die von uns in MainWindow gewählte Anordnung mit all dem auf QSettings bezogenen Code in readsettings() und writesettings() ist nur einer von vielen Ansätzen. Ein 102
32 Hauptfenster erstellen QSettings-Objekt kann zur Abfrage oder Änderung einiger Einstellungen jederzeit während der Ausführung der Anwendung von einer beliebigen Stelle im Code aus erstellt werden. Nun haben wir die Implementierung von MainWindow für die Tabellenkalkulation beendet. In den folgenden Abschnitten werden wir erörtern, wie die Anwendung so geändert werden kann, dass sie mehrere Dokumente verarbeitet, und wie Sie einen Titelbildschirm implementieren. Wir werden seine Funktionalität, einschließlich der Formelbehandlung und Sortierung, im nächsten Kapitel vervollständigen. 3.7 Mehrere Dokumente Nun sind wir bereit, die Funktion main() für die Tabellenkalkulationsanwendung zu kodieren: #include <QApplication> #include "mainwindow.h" int main(int argc, char *argv[]) QApplication app(argc, argv); MainWindow mainwin; mainwin.show(); return app.exec(); Die Funktion main() unterscheidet sich ein wenig von den bisher beschriebenen Funktionen. Anstatt new zu verwenden, haben wir die Instanz von MainWindow als Variable auf dem Stack eingesetzt. Die Instanz wird dann automatisch gelöscht, wenn die Funktion beendet ist. Bei der oben gezeigten Funktion main() stellt die Tabellenkalkulationsanwendung ein einzelnes Hauptfenster bereit und kann jeweils nur ein Dokument verarbeiten. Wenn wir mehrere Dokumente gleichzeitig bearbeiten wollen, können wir mehrere Instanzen der Tabellenkalkulationsanwendung starten. Dies ist aber nicht so bequem für die Benutzer wie eine einzelne Instanz der Anwendung, die auf ähnliche Weise mehrere Hauptfenster bereitstellt, wie z.b. eine Instanz eines Webbrowsers mehrere Browserfenster zeigt. Wir werden die Tabellenkalkulationsanwendung so verändern, dass sie mehrere Dokumente verarbeiten kann. Zuerst brauchen wir ein anderes Datei-Menü: FILE NEW erstellt ein neues Hauptfenster mit einem leeren Dokument, anstatt das vorhandene Hauptfenster wiederzuverwenden. FILE CLOSE schließt das aktuelle Hauptfenster. FILE EXIT schließt alle Fenster. 103
33 Kapitel 3 Abbildung 3.16: Das neue Datei-Menü Die ursprüngliche Version des Datei-Menüs enthielt noch nicht die Option CLOSE, da dies derselbe Vorgang gewesen wäre wie EXIT. Die neue Funktion main() sieht wie folgt aus: int main(int argc, char *argv[]) QApplication app(argc, argv); MainWindow *mainwin = new MainWindow; mainwin->show(); return app.exec(); Der neue Slot MainWindow::newFile() sieht wie folgt aus: void MainWindow::newFile() MainWindow *mainwin = new MainWindow; mainwin->show(); Wir erstellen einfach eine neue Instanz von MainWindow. Es mag merkwürdig erscheinen, dass wir keinen Zeiger auf das neue Fenster beibehalten, aber das ist kein Problem, da Qt alle Fenster für uns im Auge behält. Im Folgenden sehen Sie die Aktionen für CLOSE und EXIT: void MainWindow::createActions()... closeaction = new QAction(tr("&Close"), this); closeaction->setshortcut(tr("ctrl+w")); closeaction->setstatustip(tr("close this window")); connect(closeaction, SIGNAL(triggered()), this, SLOT(close())); exitaction = new QAction(tr("E&xit"), this); exitaction->setshortcut(tr("ctrl+q")); exitaction->setstatustip(tr("exit the application")); 104
34 Hauptfenster erstellen connect(exitaction, SIGNAL(triggered()), qapp, SLOT(closeAllWindows()));... Der Slot QApplication::closeAllWindows() schließt alle Fenster der Anwendung, sofern keines dieses Ereignis verweigert. Dies ist genau das Verhalten, das wir hier brauchen. Wir müssen uns keine Gedanken über nicht gespeicherte Änderungen machen, da dieser Vorgang jedes Mal von MainWindow::closeEvent() verarbeitet wird, wenn ein Fenster geschlossen wird. Es sieht so aus, als wären wir mit der Vorbereitung der Anwendung für die Verarbeitung mehrerer Fenster fertig. Leider lauert da noch ein verstecktes Problem: Wenn der Benutzer weiterhin Hauptfenster erstellt und schließt, geht dem Rechner möglicherweise der Speicher aus. Das liegt daran, dass wir weiterhin MainWindow-Widgets in new- File() erstellen, sie aber nie löschen. Wenn der Benutzer ein Hauptfenster schließt, wird es standardmäßig verborgen, sodass es weiterhin im Speicher bleibt. Bei einer großen Anzahl von Hauptfenstern kann das zum Problem werden. Die Lösung besteht darin, im Konstruktor das Attribut Qt::WA_DeleteOnClose festzulegen: MainWindow::MainWindow()... setattribute(qt::wa_deleteonclose);... Damit wird Qt angewiesen, das Fenster nach dem Schließen zu löschen. Das Attribut Qt::WA_DeleteOnClose ist eines von vielen Flags, die für die Klasse QWidget gesetzt werden können, um deren Verhalten zu beeinflussen. Speicherlecks sind nicht das einzige Problem, um das wir uns kümmern müssen. Unser ursprüngliches Anwendungsdesign setzte voraus, dass wir nur ein Hauptfenster besitzen. Bei mehreren Fenstern verfügt jedes Hauptfenster über eine eigene Liste der zuletzt geöffneten Dateien und über seine eigenen Optionen. Die Liste der zuletzt geöffneten Dateien sollte eindeutig global für die gesamte Anwendung gelten. Dies lässt sich recht einfach erreichen, indem wir recentfiles als statische Variable deklarieren, sodass es für die gesamte Anwendung nur eine Instanz davon gibt. Dann müssen wir aber sicherstellen, dass wir immer, wenn wir updaterecentfileactions() zur Aktualisierung des Datei-Menüs aufrufen, diese Funktion für alle Hauptfenster aufrufen. Dies lässt sich mit dem folgenden Code erreichen: foreach (QWidget *win, QApplication::topLevelWidgets()) if (MainWindow *mainwin = qobject_cast<mainwindow *>(win)) mainwin->updaterecentfileactions(); 105
35 Kapitel 3 Der Code verwendet das Qt-Konstrukt foreach (das in Kapitel 11 erläutert wird), um eine Iteration über alle Anwendungsfenster durchzuführen, und ruft updaterecentfile- Actions() für alle Widgets vom Typ MainWindow auf. Ein ähnlicher Code kann verwendet werden, um die Optionen SHOW GRID und AUTO-RECALCULATE zu synchronisieren oder um sicherzustellen, dass dieselbe Datei nicht zweimal geladen wird. Abbildung 3.17: SDI im Vergleich zu MDI Anwendungen, die ein Dokument pro Hauptfenster bereitstellen, werden als SDI- Anwendungen (Single Document Interface) bezeichnet. Eine gebräuchliche Alternative unter Windows ist MDI (Multiple Document Interface), wobei die Anwendung über ein Hauptfenster verfügt, das sowohl zum Erstellen von SDI- als auch MDI- Anwendungen auf allen unterstützten Plattformen verwendet werden kann. Abbildung 3.17 zeigt die Anwendung Spreadsheet unter Verwendung beider Ansätze. MDI wird in Kapitel 6,»Layout-Verwaltung«, erläutert. 3.8 Startbildschirme Viele Anwendungen präsentieren beim Start einen Startbildschirm. Einige Entwickler verwenden einen Startbildschirm, um einen langsamen Start zu verschleiern, während andere ihn benutzen, um ihre Marketingabteilungen zufrieden zu stellen. Qt-Anwendungen einen Startbildschirm hinzuzufügen, ist mithilfe der Klasse QSplashScreen sehr einfach. Die Klasse QSplashScreen zeigt vor dem Erscheinen des Hauptfensters ein Bild an. Sie kann auch Meldungen in das Bild schreiben, um den Benutzer über den Fortschritt des Initialisierungsprozesses der Anwendung zu informieren. Normalerweise besteht der 106
36 Hauptfenster erstellen Code für den Startbildschirm in der Funktion main() vor dem Aufruf von QApplication::exec(). Abbildung 3.18: Ein Startbildschirm Das folgende Beispiel für die Funktion main() verwendet QSplashScreen, um einen Startbildschirm in einer Anwendung zu präsentieren, die beim Start Module lädt und Netzwerkverbindungen herstellt. int main(int argc, char *argv[]) QApplication app(argc, argv); QSplashScreen *splash = new QSplashScreen; splash->setpixmap(qpixmap(":/images/splash.png")); splash->show(); Qt::Alignment topright = Qt::AlignRight Qt::AlignTop; splash->showmessage(qobject::tr("setting up the main window..."), topright, Qt::white); MainWindow mainwin; splash->showmessage(qobject::tr("loading modules..."), topright, Qt::white); loadmodules(); splash->showmessage(qobject::tr("establishing connections..."), topright, Qt::white); establishconnections(); 107
37 Kapitel 3 mainwin.show(); splash->finish(&mainwin); delete splash; return app.exec(); Nun haben wir die Benutzerschnittstelle der Anwendung Spreadsheet fertig gestellt. Im nächsten Kapitel werden wir die Anwendung vollenden, indem wir die Kernfunktionalität der Tabellenkalkulation implementieren. 108
32.4 Anpassen von Menüs und Symbolleisten 795i
32.4 Anpassen von Menüs und Symbolleisten 795i Fortsetzung der Seiten in der 8. Auflage 32.4 Anpassen von Menüs und Symbolleisten 32.4.1 Anpassen von Menüs Die Menüs können um folgende Typen von Optionen
Speichern. Speichern unter
Speichern Speichern unter Speichern Auf einem PC wird ständig gespeichert. Von der Festplatte in den Arbeitspeicher und zurück Beim Download Beim Kopieren Beim Aufruf eines Programms Beim Löschen Beim
2. Word-Dokumente verwalten
2. Word-Dokumente verwalten In dieser Lektion lernen Sie... Word-Dokumente speichern und öffnen Neue Dokumente erstellen Dateiformate Was Sie für diese Lektion wissen sollten: Die Arbeitsumgebung von Word
Newsletter. 1 Erzbistum Köln Newsletter
Newsletter 1 Erzbistum Köln Newsletter Inhalt 1. Newsletter verwalten... 3 Schritt 1: Administration... 3 Schritt 2: Newsletter Verwaltung... 3 Schritt 3: Schaltflächen... 3 Schritt 3.1: Abonnenten Verwaltung...
Die Dateiablage Der Weg zur Dateiablage
Die Dateiablage In Ihrem Privatbereich haben Sie die Möglichkeit, Dateien verschiedener Formate abzulegen, zu sortieren, zu archivieren und in andere Dateiablagen der Plattform zu kopieren. In den Gruppen
Leitfaden zur ersten Nutzung der R FOM Portable-Version für Windows (Version 1.0)
Leitfaden zur ersten Nutzung der R FOM Portable-Version für Windows (Version 1.0) Peter Koos 03. Dezember 2015 0 Inhaltsverzeichnis 1 Voraussetzung... 3 2 Hintergrundinformationen... 3 2.1 Installationsarten...
Urlaubsregel in David
Urlaubsregel in David Inhaltsverzeichnis KlickDown Beitrag von Tobit...3 Präambel...3 Benachrichtigung externer Absender...3 Erstellen oder Anpassen des Anworttextes...3 Erstellen oder Anpassen der Auto-Reply-Regel...5
12. Dokumente Speichern und Drucken
12. Dokumente Speichern und Drucken 12.1 Überblick Wie oft sollte man sein Dokument speichern? Nachdem Sie ein Word Dokument erstellt oder bearbeitet haben, sollten Sie es immer speichern. Sie sollten
Dateipfad bei Word einrichten
Dateipfad bei Word einrichten Word 2003 1. In der Menüleiste klicken Sie auf Ansicht, anschließend auf den Unterpunkt Kopf- und Fußzeile : 2. Wechseln Sie nun in die Fußzeile. 3. Im Autotext-Menü klicken
Fusszeile mit Datumsfeld und Dateiname
Fusszeile mit Datumsfeld und Dateiname Für innerbetriebliche Rundschreiben kann es nützlich sein, in der Fusszeile den Namen der Autorin bzw. des Autors und das Datum mit der Uhrzeit als Feld einzufügen.
tentoinfinity Apps 1.0 EINFÜHRUNG
tentoinfinity Apps Una Hilfe Inhalt Copyright 2013-2015 von tentoinfinity Apps. Alle Rechte vorbehalten. Inhalt der online-hilfe wurde zuletzt aktualisiert am August 6, 2015. Zusätzlicher Support Ressourcen
Seite 1 von 14. Cookie-Einstellungen verschiedener Browser
Seite 1 von 14 Cookie-Einstellungen verschiedener Browser Cookie-Einstellungen verschiedener Browser, 7. Dezember 2015 Inhaltsverzeichnis 1.Aktivierung von Cookies... 3 2.Cookies... 3 2.1.Wofu r braucht
1 Einleitung. Lernziele. Symbolleiste für den Schnellzugriff anpassen. Notizenseiten drucken. eine Präsentation abwärtskompatibel speichern
1 Einleitung Lernziele Symbolleiste für den Schnellzugriff anpassen Notizenseiten drucken eine Präsentation abwärtskompatibel speichern eine Präsentation auf CD oder USB-Stick speichern Lerndauer 4 Minuten
Arbeiten mit dem Outlook Add-In
Arbeiten mit dem Outlook Add-In Das Outlook Add-In ermöglicht Ihnen das Speichern von Emails im Aktenlebenslauf einer Akte. Außerdem können Sie Namen direkt aus BS in Ihre Outlook-Kontakte übernehmen sowie
SafeRun-Modus: Die Sichere Umgebung für die Ausführung von Programmen
SafeRun-Modus: Die Sichere Umgebung für die Ausführung von Programmen Um die maximale Sicherheit für das Betriebssystem und Ihre persönlichen Daten zu gewährleisten, können Sie Programme von Drittherstellern
Kommunikations-Management
Tutorial: Wie kann ich E-Mails schreiben? Im vorliegenden Tutorial lernen Sie, wie Sie in myfactory E-Mails schreiben können. In myfactory können Sie jederzeit schnell und einfach E-Mails verfassen egal
Virtueller Seminarordner Anleitung für die Dozentinnen und Dozenten
Virtueller Seminarordner Anleitung für die Dozentinnen und Dozenten In dem Virtuellen Seminarordner werden für die Teilnehmerinnen und Teilnehmer des Seminars alle für das Seminar wichtigen Informationen,
Tutorial: Wie kann ich Dokumente verwalten?
Tutorial: Wie kann ich Dokumente verwalten? Im vorliegenden Tutorial lernen Sie, wie Sie in myfactory Dokumente verwalten können. Dafür steht Ihnen in myfactory eine Dokumenten-Verwaltung zur Verfügung.
Suche schlecht beschriftete Bilder mit Eigenen Abfragen
Suche schlecht beschriftete Bilder mit Eigenen Abfragen Ist die Bilderdatenbank über einen längeren Zeitraum in Benutzung, so steigt die Wahrscheinlichkeit für schlecht beschriftete Bilder 1. Insbesondere
Mit der Maus im Menü links auf den Menüpunkt 'Seiten' gehen und auf 'Erstellen klicken.
Seite erstellen Mit der Maus im Menü links auf den Menüpunkt 'Seiten' gehen und auf 'Erstellen klicken. Es öffnet sich die Eingabe Seite um eine neue Seite zu erstellen. Seiten Titel festlegen Den neuen
Faktura. IT.S FAIR Faktura. Handbuch. Dauner Str.12, D-41236 Mönchengladbach, Hotline: 0900/1 296 607 (1,30 /Min)
IT.S FAIR Faktura Handbuch Dauner Str.12, D-41236 Mönchengladbach, Hotline: 0900/1 296 607 (1,30 /Min) 1. Inhalt 1. Inhalt... 2 2. Wie lege ich einen Kontakt an?... 3 3. Wie erstelle ich eine Aktion für
Bedienungsanleitung. Stand: 26.05.2011. Copyright 2011 by GEVITAS GmbH www.gevitas.de
GEVITAS-Sync Bedienungsanleitung Stand: 26.05.2011 Copyright 2011 by GEVITAS GmbH www.gevitas.de Inhalt 1. Einleitung... 3 1.1. Installation... 3 1.2. Zugriffsrechte... 3 1.3. Starten... 4 1.4. Die Menü-Leiste...
Windows XP maßgeschneidert
Windows XP maßgeschneidert Visual QuickProject Guide von John Rizzo 3. Taskleiste und Symbolleisten anpassen Die Taskleiste nimmt für das Öffnen von Dateien und Ordnern eine Sonderstellung ein. Die Leiste
LÖSUNGEN AUFGABEN: EXCEL XP (OHNE DATEIEN)
LÖSUNGEN AUFGABEN: EXCEL XP (OHNE DATEIEN) Übung (1) Elemente des Excelfensters Ordnen Sie die Begriffe richtig zu: [1] Titelleiste (Programmleiste) [9] waagrechte/horizontale Bildlaufleiste [2] Menüleiste
Die Beschreibung bezieht sich auf die Version Dreamweaver 4.0. In der Version MX ist die Sitedefinition leicht geändert worden.
In einer Website haben Seiten oft das gleiche Layout. Speziell beim Einsatz von Tabellen, in denen die Navigation auf der linken oder rechten Seite, oben oder unten eingesetzt wird. Diese Anteile der Website
Einrichten eines Postfachs mit Outlook Express / Outlook bis Version 2000
Folgende Anleitung beschreibt, wie Sie ein bestehendes Postfach in Outlook Express, bzw. Microsoft Outlook bis Version 2000 einrichten können. 1. Öffnen Sie im Menü die Punkte Extras und anschließend Konten
Inhalt. meliarts. 1. Allgemeine Informationen... 2 2. Administration... 2 2.1 Aufruf... 2 2.2 Das Kontextmenü... 3 3. E-Mail Vorlagen...
Inhalt 1. Allgemeine Informationen... 2 2. Administration... 2 2.1 Aufruf... 2 2.2 Das Kontextmenü... 3 3. E-Mail Vorlagen... 4 Seite 1 von 7 meliarts 1. Allgemeine Informationen meliarts ist eine Implementierung
Die neue Datenraum-Center-Administration in. Brainloop Secure Dataroom Service Version 8.30
Die neue Datenraum-Center-Administration in Brainloop Secure Dataroom Service Version 8.30 Leitfaden für Datenraum-Center-Manager Copyright Brainloop AG, 2004-2014. Alle Rechte vorbehalten. Dokumentversion:
Erstellen eines Formulars
Seite 1 von 5 Word > Erstellen bestimmter Dokumente > Formen Erstellen von Formularen, die in Word ausgefüllt werden können Basierend auf einer Vorlage können Sie dieser Inhaltssteuerelemente und Hinweistext
Step by Step Webserver unter Windows Server 2003. von Christian Bartl
Step by Step Webserver unter Windows Server 2003 von Webserver unter Windows Server 2003 Um den WWW-Server-Dienst IIS (Internet Information Service) zu nutzen muss dieser zunächst installiert werden (wird
Lizenzen auschecken. Was ist zu tun?
Use case Lizenzen auschecken Ihr Unternehmen hat eine Netzwerk-Commuterlizenz mit beispielsweise 4 Lizenzen. Am Freitag wollen Sie Ihren Laptop mit nach Hause nehmen, um dort am Wochenende weiter zu arbeiten.
Es gibt situationsabhängig verschiedene Varianten zum Speichern der Dokumente. Word bietet im Menü DATEI unterschiedliche Optionen an.
3. SPEICHERN DATEIEN SPEICHERN Dateien werden in Word Dokumente genannt. Jede Art von Datei, die Sie auf Ihrem Computer neu erstellen, befindet sich zuerst im Arbeitsspeicher des Rechners. Der Arbeitsspeicher
Einstellungen im Internet-Explorer (IE) (Stand 11/2013) für die Arbeit mit IOS2000 und DIALOG
Einstellungen im Internet-Explorer (IE) (Stand 11/2013) für die Arbeit mit IOS2000 und DIALOG Um mit IOS2000/DIALOG arbeiten zu können, benötigen Sie einen Webbrowser. Zurzeit unterstützen wir ausschließlich
Variablen & erweiterte Aktionen nutzen
341 In Captivate können Sie mit Hilfe von Variablen Texte & Werte speichern oder Systeminformationen ausgeben. Außerdem können Sie auf Basis von Variablen komplexere Aktionen entwickeln, wie z. B. eine
1.1 Ändern der Formatvorlagen
Löschen einer Absatzmarke Angenommen zwei aufeinander folgende Absätze haben verschiedene Formatvorlagen und Sie löschen die Absatzmarke des ersten Absatzes, dann erhält der neue grosse Gesamtabsatz die
Anleitung für TYPO3... 1. Bevor Sie beginnen... 2. Newsletter anlegen... 2. Inhalt platzieren und bearbeiten... 3. Neuen Inhalt anlegen...
Seite 1 von 11 Anleitung für TYPO3 Inhalt Anleitung für TYPO3... 1 Bevor Sie beginnen... 2 Newsletter anlegen... 2 Inhalt platzieren und bearbeiten... 3 Neuen Inhalt anlegen... 3 Bestehenden Inhalt bearbeiten...
Access 2013. Grundlagen für Anwender. Susanne Weber. 1. Ausgabe, 1. Aktualisierung, Juni 2013
Access 2013 Susanne Weber 1. Ausgabe, 1. Aktualisierung, Juni 2013 Grundlagen für Anwender ACC2013 2 Access 2013 - Grundlagen für Anwender 2 Mit Datenbanken arbeiten In diesem Kapitel erfahren Sie was
S TAND N OVEMBE R 2012 HANDBUCH DUDLE.ELK-WUE.DE T E R M I N A B S P R A C H E N I N D E R L A N D E S K I R C H E
S TAND N OVEMBE R 2012 HANDBUCH T E R M I N A B S P R A C H E N I N D E R L A N D E S K I R C H E Herausgeber Referat Informationstechnologie in der Landeskirche und im Oberkirchenrat Evangelischer Oberkirchenrat
Folgeanleitung für Fachlehrer
1. Das richtige Halbjahr einstellen Folgeanleitung für Fachlehrer Stellen sie bitte zunächst das richtige Schul- und Halbjahr ein. Ist das korrekte Schul- und Halbjahr eingestellt, leuchtet die Fläche
Installieren von Microsoft Office 2012-09-12 Version 2.1
Installieren von Microsoft Office 2012-09-12 Version 2.1 INHALT Installieren von Microsoft Office... 2 Informationen vor der Installation... 2 Installieren von Microsoft Office... 3 Erste Schritte... 7
1. Einschränkung für Mac-User ohne Office 365. 2. Dokumente hochladen, teilen und bearbeiten
1. Einschränkung für Mac-User ohne Office 365 Mac-User ohne Office 365 müssen die Dateien herunterladen; sie können die Dateien nicht direkt öffnen und bearbeiten. Wenn die Datei heruntergeladen wurde,
Grundlagen Word Eigene Symbolleisten. Eigene Symbolleisten in Word erstellen
Eigene Symbolleisten in Word erstellen Diese Anleitung beschreibt, wie man in Word eigene Symbolleisten erstellt und mit Schaltflächen füllt. Im zweiten Teil wird erklärt, wie man mit dem Makrorekorder
Es sollte die MS-DOS Eingabeaufforderung starten. Geben Sie nun den Befehl javac ein.
Schritt 1: Installation des Javacompilers JDK. Der erste Start mit Eclipse Bevor Sie den Java-Compiler installieren sollten Sie sich vergewissern, ob er eventuell schon installiert ist. Gehen sie wie folgt
Artikel Schnittstelle über CSV
Artikel Schnittstelle über CSV Sie können Artikeldaten aus Ihrem EDV System in das NCFOX importieren, dies geschieht durch eine CSV Schnittstelle. Dies hat mehrere Vorteile: Zeitersparnis, die Karteikarte
Diese Ansicht erhalten Sie nach der erfolgreichen Anmeldung bei Wordpress.
Anmeldung http://www.ihredomain.de/wp-admin Dashboard Diese Ansicht erhalten Sie nach der erfolgreichen Anmeldung bei Wordpress. Das Dashboard gibt Ihnen eine kurze Übersicht, z.b. Anzahl der Beiträge,
! " # $ " % & Nicki Wruck worldwidewruck 08.02.2006
!"# $ " %& Nicki Wruck worldwidewruck 08.02.2006 Wer kennt die Problematik nicht? Die.pst Datei von Outlook wird unübersichtlich groß, das Starten und Beenden dauert immer länger. Hat man dann noch die.pst
26. November 2007. EFS Übung. Ziele. Zwei Administrator Benutzer erstellen (adm_bill, adm_peter) 2. Mit adm_bill eine Text Datei verschlüsseln
EFS Übung Ziele Zwei Administrator Benutzer erstellen (adm_bill, adm_peter) Mit adm_bill eine Text Datei verschlüsseln Mit adm_peter einen Ordner verschlüsseln und darin eine Text Datei anlegen Dem Benutzer
3 ORDNER UND DATEIEN. 3.1 Ordner
Ordner und Dateien PC-EINSTEIGER 3 ORDNER UND DATEIEN Themen in diesem Kapitel: Erstellung von Ordnern bzw Dateien Umbenennen von Datei- und Ordnernamen Speicherung von Daten 3.1 Ordner Ordner sind wie
Erzherzog Johann Jahr 2009
Erzherzog Johann Jahr 2009 Der Erzherzog Johann Tag an der FH JOANNEUM in Kapfenberg Was wird zur Erstellung einer Webseite benötigt? Um eine Webseite zu erstellen, sind die folgenden Dinge nötig: 1. Ein
Handbuch ECDL 2003 Professional Modul 2: Tabellenkalkulation Vorlagen benutzen und ändern
Handbuch ECDL 2003 Professional Modul 2: Tabellenkalkulation Vorlagen benutzen und ändern Dateiname: ecdl_p2_02_03_documentation.doc Speicherdatum: 08.12.2004 ECDL 2003 Professional Modul 2 Tabellenkalkulation
Handbuch zur Anlage von Turnieren auf der NÖEV-Homepage
Handbuch zur Anlage von Turnieren auf der NÖEV-Homepage Inhaltsverzeichnis 1. Anmeldung... 2 1.1 Startbildschirm... 3 2. Die PDF-Dateien hochladen... 4 2.1 Neue PDF-Datei erstellen... 5 3. Obelix-Datei
Meldung Lokale Anwendung inkompatibel oder Microsoft Silverlight ist nicht aktuell bei Anmeldung an lokal gespeicherter RWE SmartHome Anwendung
Meldung Lokale Anwendung inkompatibel oder Microsoft Silverlight ist nicht aktuell bei Anmeldung an lokal gespeicherter RWE SmartHome Anwendung Nach dem Update auf die Version 1.70 bekommen Sie eine Fehlermeldung,
O UTLOOK EDITION. Was ist die Outlook Edition? Installieren der Outlook Edition. Siehe auch:
O UTLOOK EDITION Was ist die Outlook Edition? Outlook Edition integriert Microsoft Outlook E-Mail in Salesforce. Die Outlook Edition fügt neue Schaltflächen und Optionen zur Outlook- Benutzeroberfläche
Benutzung der Avid Liquid Edition Schnittplätze an der Universität Innsbruck
Benutzung der Avid Liquid Edition Schnittplätze an der Universität Innsbruck Diese Anleitung muss bei jedem Start von Avid Liquid Edition befolgt werden, da sonst das Schneiden der Videos nicht möglich
WOT Skinsetter. Nun, erstens, was brauchen Sie für dieses Tool zu arbeiten:
WOT Skinsetter WOT Skinsetter steht für World of Tanks skinsetter (WOTS von nun an). Mit diesen Tool können Sie Skins importieren und ändern, wann immer Sie möchten auf einfache Weise. Als World of Tanks
E-MAIL VERWALTUNG. Postfächer, Autoresponder, Weiterleitungen, Aliases. http://www.athost.at. Bachstraße 47, 3580 Mödring office@athost.
E-MAIL VERWALTUNG Postfächer, Autoresponder, Weiterleitungen, Aliases http://www.athost.at Bachstraße 47, 3580 Mödring [email protected] Loggen Sie sich zunächst unter http://www.athost.at/kundencenter
iphone-kontakte zu Exchange übertragen
iphone-kontakte zu Exchange übertragen Übertragen von iphone-kontakten in ein Exchange Postfach Zunächst muss das iphone an den Rechner, an dem es üblicherweise synchronisiert wird, angeschlossen werden.
Klicken Sie mit einem Doppelklick auf das Symbol Arbeitsplatz auf Ihrem Desktop. Es öffnet sich das folgende Fenster.
ADSL INSTALLATION WINDOWS 2000 Für die Installation wird folgendes benötigt: Alcatel Ethernet-Modem Splitter für die Trennung Netzwerkkabel Auf den folgenden Seiten wird Ihnen in einfachen und klar nachvollziehbaren
SANDBOXIE konfigurieren
SANDBOXIE konfigurieren für Webbrowser und E-Mail-Programme Dies ist eine kurze Anleitung für die grundlegenden folgender Programme: Webbrowser: Internet Explorer, Mozilla Firefox und Opera E-Mail-Programme:
Folgende Einstellungen sind notwendig, damit die Kommunikation zwischen Server und Client funktioniert:
Firewall für Lexware professional konfigurieren Inhaltsverzeichnis: 1. Allgemein... 1 2. Einstellungen... 1 3. Windows XP SP2 und Windows 2003 Server SP1 Firewall...1 4. Bitdefender 9... 5 5. Norton Personal
Jederzeit Ordnung halten
Kapitel Jederzeit Ordnung halten 6 auf Ihrem Mac In diesem Buch war bereits einige Male vom Finder die Rede. Dieses Kapitel wird sich nun ausführlich diesem so wichtigen Programm widmen. Sie werden das
Bauteilattribute als Sachdaten anzeigen
Mit den speedikon Attributfiltern können Sie die speedikon Attribute eines Bauteils als MicroStation Sachdaten an die Elemente anhängen Inhalte Was ist ein speedikon Attribut?... 3 Eigene Attribute vergeben...
Einfügen von Bildern innerhalb eines Beitrages
Version 1.2 Einfügen von Bildern innerhalb eines Beitrages Um eigene Bilder ins Forum einzufügen, gibt es zwei Möglichkeiten. 1.) Ein Bild vom eigenem PC wird auf den Webspace von Baue-die-Bismarck.de
Das EDV-Cockpit mit MindManager für SharePoint
Das EDV-Cockpit mit MindManager für SharePoint 2010 MindBusiness GmbH 29.03.2010 - 2 - Inhalt Mindjet MindManager für SharePoint: Das EDV-Cockpit... 3 Vorbereitungen in SharePoint... 3 Aufbau der Map...
Qt-Projekte mit Visual Studio 2005
Qt-Projekte mit Visual Studio 2005 Benötigte Programme: Visual Studio 2005 Vollversion, Microsoft Qt 4 Open Source s. Qt 4-Installationsanleitung Tabelle 1: Benötigte Programme für die Qt-Programmierung
Outlook. sysplus.ch outlook - mail-grundlagen Seite 1/8. Mail-Grundlagen. Posteingang
sysplus.ch outlook - mail-grundlagen Seite 1/8 Outlook Mail-Grundlagen Posteingang Es gibt verschiedene Möglichkeiten, um zum Posteingang zu gelangen. Man kann links im Outlook-Fenster auf die Schaltfläche
Import des persönlichen Zertifikats in Outlook Express
Import des persönlichen Zertifikats in Outlook Express 1.Installation des persönlichen Zertifikats 1.1 Voraussetzungen Damit Sie das persönliche Zertifikat auf Ihrem PC installieren können, benötigen
Handbuch ECDL 2003 Modul 2: Computermanagement und Dateiverwaltung Dateien löschen und wiederherstellen
Handbuch ECDL 2003 Modul 2: Computermanagement und Dateiverwaltung Dateien löschen und wiederherstellen Dateiname: ecdl2_05_03_documentation Speicherdatum: 22.11.2004 ECDL 2003 Modul 2 Computermanagement
Excel 2010 Kommentare einfügen
EX.015, Version 1.0 25.02.2014 Kurzanleitung Excel 2010 Kommentare einfügen Beim Arbeiten mit Tabellen sind Kommentare ein nützliches Hilfsmittel, sei es, um anderen Personen Hinweise zu Zellinhalten zu
Einrichten einer Festplatte mit FDISK unter Windows 95/98/98SE/Me
Einrichten einer Festplatte mit FDISK unter Windows 95/98/98SE/Me Bevor Sie die Platte zum ersten Mal benutzen können, muss sie noch partitioniert und formatiert werden! Vorher zeigt sich die Festplatte
Web-Kürzel. Krishna Tateneni Yves Arrouye Deutsche Übersetzung: Stefan Winter
Krishna Tateneni Yves Arrouye Deutsche Übersetzung: Stefan Winter 2 Inhaltsverzeichnis 1 Web-Kürzel 4 1.1 Einführung.......................................... 4 1.2 Web-Kürzel.........................................
Er musste so eingerichtet werden, dass das D-Laufwerk auf das E-Laufwerk gespiegelt
Inhaltsverzeichnis Aufgabe... 1 Allgemein... 1 Active Directory... 1 Konfiguration... 2 Benutzer erstellen... 3 Eigenes Verzeichnis erstellen... 3 Benutzerkonto erstellen... 3 Profil einrichten... 5 Berechtigungen
10.3.1.4 Übung - Datensicherung und Wiederherstellung in Windows 7
5.0 10.3.1.4 Übung - Datensicherung und Wiederherstellung in Windows 7 Einführung Drucken Sie diese Übung aus und führen Sie sie durch. In dieser Übung werden Sie die Daten sichern. Sie werden auch eine
Folgeanleitung für Klassenlehrer
Folgeanleitung für Klassenlehrer 1. Das richtige Halbjahr einstellen Stellen sie bitte zunächst das richtige Schul- und Halbjahr ein. Ist das korrekte Schul- und Halbjahr eingestellt, leuchtet die Fläche
Arbeiten mit UMLed und Delphi
Arbeiten mit UMLed und Delphi Diese Anleitung soll zeigen, wie man Klassen mit dem UML ( Unified Modeling Language ) Editor UMLed erstellt, in Delphi exportiert und dort so einbindet, dass diese (bis auf
Excel Pivot-Tabellen 2010 effektiv
7.2 Berechnete Felder Falls in der Datenquelle die Zahlen nicht in der Form vorliegen wie Sie diese benötigen, können Sie die gewünschten Ergebnisse mit Formeln berechnen. Dazu erzeugen Sie ein berechnetes
Favoriten sichern. Sichern der eigenen Favoriten aus dem Webbrowser. zur Verfügung gestellt durch: ZID Dezentrale Systeme.
Favoriten sichern Sichern der eigenen Favoriten aus dem Webbrowser zur Verfügung gestellt durch: ZID Dezentrale Systeme Februar 2015 Seite 2 von 20 Inhaltsverzeichnis Einleitung... 3 Mozilla Firefox...
Navigieren auf dem Desktop
Navigieren auf dem Desktop Sie kennen Windows 7 noch nicht? Obwohl Windows 7 viel mit den Versionen von Windows gemein hat, die Ihnen ggf. bereits vertraut sind, werden Sie möglicherweise an der einen
SICHERN DER FAVORITEN
Seite 1 von 7 SICHERN DER FAVORITEN Eine Anleitung zum Sichern der eigenen Favoriten zur Verfügung gestellt durch: ZID Dezentrale Systeme März 2010 Seite 2 von 7 Für die Datensicherheit ist bekanntlich
Alinof Key s Benutzerhandbuch
Alinof Key s Benutzerhandbuch Version 3.0 Copyright 2010-2014 by Alinof Software GmbH Page 1/ Vorwort... 3 Urheberechte... 3 Änderungen... 3 Systemvoraussetzungen für Mac... 3 Login... 4 Änderung des Passworts...
ICS-Addin. Benutzerhandbuch. Version: 1.0
ICS-Addin Benutzerhandbuch Version: 1.0 SecureGUARD GmbH, 2011 Inhalt: 1. Was ist ICS?... 3 2. ICS-Addin im Dashboard... 3 3. ICS einrichten... 4 4. ICS deaktivieren... 5 5. Adapter-Details am Server speichern...
Outlook 2000 Thema - Archivierung
interne Schulungsunterlagen Outlook 2000 Thema - Inhaltsverzeichnis 1. Allgemein... 3 2. Grundeinstellungen für die Auto in Outlook... 3 3. Auto für die Postfach-Ordner einstellen... 4 4. Manuelles Archivieren
System-Update Addendum
System-Update Addendum System-Update ist ein Druckserverdienst, der die Systemsoftware auf dem Druckserver mit den neuesten Sicherheitsupdates von Microsoft aktuell hält. Er wird auf dem Druckserver im
Konvertieren von Settingsdateien
Konvertieren von Settingsdateien Mit SetEdit können sie jedes der von diesem Programm unterstützten Settingsformate in jedes andere unterstützte Format konvertieren, sofern Sie das passende Modul (in Form
Android VHS - Weiterbildungskurs Ort: Sulingen
Kontakte Neuen Kontakt anlegen Um einen neuen Kontakt anzulegen, wird zuerst (Kontakte) aufgerufen. Unten Rechts befindet sich die Schaltfläche um einen neuen Kontakt zu erstellen. Beim Kontakt anlegen
3. GLIEDERUNG. Aufgabe:
3. GLIEDERUNG Aufgabe: In der Praxis ist es für einen Ausdruck, der nicht alle Detaildaten enthält, häufig notwendig, Zeilen oder Spalten einer Tabelle auszublenden. Auch eine übersichtlichere Darstellung
Hier ist die Anleitung zum Flashen des MTK GPS auf der APM 2.0. Prinzipiell funktioniert es auch auf der APM 2.5 und APM 1.
Hier ist die Anleitung zum Flashen des MTK GPS auf der APM 2.0. Prinzipiell funktioniert es auch auf der APM 2.5 und APM 1. Vorweg: Die neue MTK Firmware 1.9 (AXN1.51_2776_3329_384.1151100.5_v19.bin) ist
6 Das Kopieren eines bereits bestehenden Inhaltselements
6 Das Kopieren eines bereits bestehenden Inhaltselements Inhaltsverzeichnis 6 Das Kopieren eines bereits bestehenden Inhaltselements 1 Vorbemerkung.......................................... 1 6.1 Schritt
Einrichten des IIS für VDF WebApp. Einrichten des IIS (Internet Information Server) zur Verwendung von Visual DataFlex Web Applications
Einrichten des IIS (Internet Information Server) zur Verwendung von Visual DataFlex Web Applications Windows 8 Systemsteuerung > Programme > Windows Features aktivieren / deaktivieren > Im Verzeichnisbaum
Excel Auswertungen in XAuftrag / XFibu
1 Excel Auswertungen in XAuftrag / XFibu Im Folgenden wird kurz beschrieben, wie Anwender die Sicherheitseinstellungen in Excel Auswertungen anpassen können. Sicherheitseinstellungen verhindern, dass Makros
ÖKB Steiermark Schulungsunterlagen
ÖKB Steiermark Schulungsunterlagen Fotos von Online-Speicher bereitstellen Da das hinzufügen von Fotos auf unsere Homepage recht umständlich und auf 80 Fotos begrenzt ist, ist es erforderlich die Dienste
Live Update (Auto Update)
Live Update (Auto Update) Mit der Version 44.20.00 wurde moveit@iss+ um die Funktion des Live Updates (in anderen Programmen auch als Auto Update bekannt) für Programm Updates erweitert. Damit Sie auch
INDEX. Öffentliche Ordner erstellen Seite 2. Offline verfügbar einrichten Seite 3. Berechtigungen setzen Seite 7. Öffentliche Ordner Offline
Öffentliche Ordner Offline INDEX Öffentliche Ordner erstellen Seite 2 Offline verfügbar einrichten Seite 3 Berechtigungen setzen Seite 7 Erstelldatum 12.08.05 Version 1.1 Öffentliche Ordner Im Microsoft
Übersichtlichkeit im Dokumentenmanagement
Übersichtlichkeit im Dokumentenmanagement Workshop Software GmbH Siemensstr. 21 47533 Kleve 02821 / 731 20 02821 / 731 299 www.workshop-software.de Verfasser: SK [email protected] Datum: 02/2012
Starten der Software unter Windows 7
Starten der Software unter Windows 7 Im Folgenden wird Ihnen Schritt für Schritt erklärt, wie Sie Ihr persönliches CONTOUR NEXT USB auf dem Betriebssystem Ihrer Wahl starten und benutzen. Schritt 1. Stecken
Schritt- für- Schritt Anleitung: Einrichten der Datenvererbung
Schritt- für- Schritt Anleitung: Einrichten der Datenvererbung Inhaltsverzeichnis Schritt- für- Schritt Anleitung: Einrichten der Datenvererbung 1 Überblick: Rollen bei der Datenvererbung 1 So aktivieren
OS Anwendungsbeschreibung
Inhalt Einleitung... 2 Start des Programms... 2 Scannen einer neuen Zeitungsseite... 4 Presse-Clipping... 8 Artikel ausschneiden und bearbeiten... 11 Übernahme aus der Zwischenablage... 19 Ausdruck in
Memeo Instant Backup Kurzleitfaden. Schritt 1: Richten Sie Ihr kostenloses Memeo-Konto ein
Einleitung Memeo Instant Backup ist eine einfache Backup-Lösung für eine komplexe digitale Welt. Durch automatisch und fortlaufende Sicherung Ihrer wertvollen Dateien auf Ihrem Laufwerk C:, schützt Memeo
Office 2010 Die neue Oberfläche
OF.001, Version 1.0 02.04.2013 Kurzanleitung Office 2010 Die neue Oberfläche Die Benutzeroberfläche von Office 2010 wurde gegenüber Office 2003 radikal überarbeitet mit dem Ziel, die Arbeit mit Office
Neue Steuererklärung 2013 erstellen
Neue Steuererklärung 2013 erstellen Bitte klicken Sie im Startmenü auf die Schaltfläche Steuererklärung 2013 NEU Anschliessend wird der folgende Dialog angezeigt. Wenn Sie die letztjährige Steuererklärung
