http://wiki.ggf-controls.de/api.php?action=feedcontributions&user=SysOpGert&feedformat=atomC++_PHP_und_mehr - Benutzerbeiträge [de]2024-03-28T08:41:33ZBenutzerbeiträgeMediaWiki 1.23.14http://wiki.ggf-controls.de/index.php?title=Subversion_(SVN)Subversion (SVN)2020-11-28T23:43:50Z<p>SysOpGert: </p>
<hr />
<div>[[Kategorie:Tools]]<br />
Subversion ist ein Tool zur Versionsverwaltung und stellt sicher, dass mehrere Personen gleichzeitig und parallel an einem Projekt arbeiten können. Hauptaufgaben sind:<br />
*Jeder Stand eines Projektes wird archiviert, je nach Programm nur die Änderungen: Dadurch ist es jederzeit möglich, auf alte Versionen zurückzugreifen.<br />
*Koordinierung des gemeinsamen Zugriffs von mehreren Entwicklern auf die Dateien: Konflikte bei gleichzeitigem Speichern werden automatisch gelöst oder für manuelle Bearbeitung gemeldet.<br />
*Gleichzeitige Entwicklung mehrerer Entwicklungszweige (engl. Branches) eines Projektes: Die unterschiedlichen Zweige können wieder zusammengeführt werden.<br />
Subversion besteht aus einem Server, der die verschiedenen Versionen und Entwicklungszweige im {{Tooltip|Repository|Projektarchiv}} speichert und verwaltet, und Clients zur {{Tooltip|Checkout|Erstellung}}/{{Tooltip|Update|Erneuerung}} und {{Tooltip|Commit|Übergabe}} von Arbeitskopien.<br />
<br />
== Eigenschaften ==<br />
Automatische Übernahme der Eigenschaften wird erreicht, in dem in '''config''' {{Eingabe|1=enable-auto-props = yes}} eingetragen wird und im Abschnitt <nowiki>[auto-props]</nowiki> ausgewählt wird, welche Datei welche Eigenschaft übernimmt. Dann werden beim Hinzufügen (und nur dann) einer Datei zur Versionskontrolle die Eigenschaften übernommen.<br />
<br />'''config''' findet man unter:<br />
*Windows7: ...\Anwendungsdaten\Subversion\<br />
*Linux: /etc/subversion (global) oder ~/.subversion (nutzerspezifisch).<br />
Die Eigenschaften können nur in der Arbeitskopie geändert werden, eine Änderung fügt die Datei der {{Tooltip|Commit|Übergabe}}liste hinzu.<br />
=== Schlüsselwörter ===<br />
in einer Datei werden bei der Übergabe durch einen entsprechenden Text ersetzt. Mögliche Schlüsselwörter sind<br />
* $Author$<br />
* $Date$<br />
* $Revision$<br />
* $URL$<br />
* $Id$: eine verkürzte Zusammenfassung der obigen.<br />
Indem ein doppelter Doppelpunkt (::) nach dem Namen des Schlüsselwortes geschrieben wird, dem eine Anzahl von Leerzeichen folgt, definieren diese eine feste Breite. Falls der ersetzte Wert zu lang ist, wird er mit einem speziellen Nummernzeichen (#) unmittelbar vor dem letzten Dollarzeichen abgeschnitten<ref group="svnbook">[http://svnbook.red-bean.com/de/1.6/svn.advanced.props.special.keywords.html Subversion Book -> Ersetzung von Schlüsselwörtern]</ref>.<br />
<br />
Um für eine Datei unter Versionsverwaltung die Schlüsselwörter zu aktivieren, müssen in die Eigenschaft svn:keywords die gewünschten Schlüsselwörter eingetragen werden<ref name="EigenschaftOrdner" />. Wenn in svn:keywords die Schlüsselwörter fehlen, wird der Schlüsselwortinhalt gelöscht und damit doch die Datei verändert.<br />
<br />
== Globale Versionsnummer ==<br />
Die letzte (höchste) Versionsnummer aller Dateien einer Arbeitskopie kann mit dem Komandozeilen-Tool '''svnversion'''<ref>Hilfe: <code>svnversion -h</code></ref> abgefragt werden. Nur nach einem Update wird eine eindeutige Nummer ausgegeben, sonst ein Bereich aus aktualisierten und übertragenen Versionen (168:171).<ref name="inDatei" /><ref>[[Erstellen einer Anwendung (Qt)#Build automatisieren| Automatisieren mit Qt Creator]]</ref><br />
<br />
== Ein lokales Repository ==<br />
Es macht durchaus Sinn, auch auf einem Einzelplatzrechner ein {{Tooltip|Archiv|Repository}} anzulegen, zB. um ältere Stände leicht zu rekonstruieren, Änderungen erst mal in Parallelzweigen auszuprobieren oder für ein einfaches Backup.<br />
<br />Für dieses {{Tooltip|Archiv|Repository}} benötigen wir keine sichere Passwortabfrage, aber es soll der Autor der Änderung gespeichert werden, also kein anonymer Zugriff.<br />
<br />Aber wir benötigen einen Server. Bei '''TortoiseSVN''' ist dieser Server im Paket enthalten, unter Linux reicht uns '''svnserve''' aus dem Paket '''Subversion'''.<br />
=== svnserve ===<br />
'''svnserve''' muss manuell<ref>Es kann natürlich auch über die Startscripts gestartet werden, siehe [http://wiki.ubuntuusers.de/Subversion#svnserve Ubuntuusers]. Aber so häufig werden wir es nicht benutzen, das sich ein ständiger Daemon lohnt.</ref> im Terminal gestartet werden mit<br />
{{Bsyn|lang=bash|code=svnserve -d -r /Wurzelpfad/der/Repository/}}<br />
Voreinstellung ist, das Passwörter in KWallet<ref>bzw. gnome-keyring bei Ubuntu</ref> gespeichert werden. Das ist für ein lokales {{Tooltip|Archiv|Repository}} eher lästig (wer will schon ständig seinen Passwort-Save öffnen), deshalb erlauben wir das Speichern eines Klartext-Passworts mit <code>store-plaintext-passwords = yes</code> in /etc/subversion/servers oder ~/.subversion/servers.<br />
<br />
== Dateien unter Versionsverwaltung stellen ==<br />
# Ein leeres {{Tooltip|Repository|Projektarchiv}} erstellen.<br />
# Eine Arbeitskopie erstellen (checkout).<br />
# Dateien in die Arbeitskopie verschieben oder neu erstellen.<br />
# Dateien zum Repository hinzufügen (add).<br />
<br />
== Benutzung Kommandozeile ==<br />
=== Projektarchiv erstellen ===<br />
{{Isyn|lang=bash|code=svnadmin create file:///Pfad/zum/Archiv/}} legt das Projektarchiv ohne Unterordner an.<br />
<br />{{Isyn|lang=bash|code=svn mkdir -m "trunk anlegen" file:///Pfad/zum/Archiv/trunk}} legt Unterordner '''trunk''' an, für Verzweigungen entsprechend Ordner '''branches''' anlegen usw.<br />
<br />
Alternativ kann in das leere Archiv auch eine vorhandene Ordnerstruktur inkl. Dateien importiert werden:<br />
{{Isyn|lang=bash|code=svn import -m "Projektname importieren" file:///Pfad/zum/Archiv/}}. Der importierte Ordner sollte die Struktur mit '''trunk''', '''branches''' bereits enthalten und nicht im vorgesehenem Arbeitsordner liegen, besser irgendwas mit tmp.<br />
=== Arbeitskopie anlegen ===<br />
{{Isyn|lang=bash|code=svn checkout file:///Pfad/zum/Archiv/trunk Zielordner}} kopiert das {{Tooltip|Repository|Projektarchiv}} nach {{Platz|Zielordner}}, auch '.' für aktuellen Ordner. Wenn {{Platz|Zielordner}} fehlt, wird ein Ordner '''trunk''' im aktuellem Ordner angelegt. Es können statt dem {{Tooltip|trunk|Hauptpfad}} '''trunk''' auch {{Tooltip|branches|Verzweigungen}} ausgescheckt werden.<br />
=== Status ===<br />
{{Isyn|lang=bash|code=svn status}} gibt den aktuellen Status geänderter Dateien aus. Die Buchstaben der Ausgabe bedeuten:<br />
*'''?''' Die Datei, das Verzeichnis oder der symbolische Link item ist nicht unter Versionskontrolle.<br />
*'''A''' Die Datei, das Verzeichnis oder der symbolische Link item ist zum Hinzufügen in das Projektarchiv vorgemerkt.<br />
*'''C''' Die Datei item befindet sich in einem Konfliktzustand. D.h., Änderungen, die vom Server bei einer Aktualisierung empfangen wurden, überlappen sich mit lokalen Änderungen, die Sie in Ihrer Arbeitskopie haben (und konnten beim Aktualisieren nicht automatisch aufgelöst werden). Sie müssen den Konflikt auflösen, bevor Sie Ihre Änderungen in das Projektarchiv übergeben können.<br />
*'''D''' Die Datei, das Verzeichnis oder der symbolische Link item ist zum Löschen im Projektarchiv vorgemerkt.<br />
*'''M''' Der Inhalt der Datei ist geändert worden.<br />
=== Übergeben ===<br />
{{Isyn|lang=bash|code=svn commit -m "Kommentar"}} {{Tooltip|commits|übergibt}} die Änderungen an das {{Tooltip|Repository|Projektarchiv}}. Es muss mit der Option -m ein {{Tooltip|Kommentar zur Revision|Log-Eintrag}} mitgegeben werden, oder es wird Editor<ref>Unter Linux zB. '''nano'''.</ref> für die Eingabe geöffnet. Dann einfach in die 1. Zeile den Kommentar schreiben und speichern. In der temporären(?) Datei stehen auch der [[#Status|Status]] der zu übergebenden Dateien.<br />
<br />
== Benutzung TortoiseSVN (MS-Windows<ref>Windows7</ref>) ==<br />
'''Gilt nicht mehr ab Version 1.7.4:''' Enthält keine Komandozeilen-Tools, bei Bedarf muss ein zusätzliches Paket installiert werden, zB. [http://www.sliksvn.com Slik SVN].<br />
<br />
TortoiseSVN integriert SVN in die MS-Windows-Oberfläche. Im Datei-Explorer wird der Status der Dateien durch kleine Symbole angezeigt und das Kontextmenü enthält alle SVN-Befehle.<br />
=== Zugangsberechtigungen ===<br />
Unter Windows speichert der Subversion-Client Passwörter im Verzeichnis %APPDATA%/Subversion/auth/. Unter Windows 2000 und dessen Nachfolger verwendet der Subversion-Client die Standard-Kryptographiedienste von Windows, um das Passwort auf der Festplatte zu verschlüsseln. Da der Schlüssel durch Windows verwaltet wird und mit den benutzereigenen Zugangsdaten verknüpft ist, kann nur der Benutzer selbst das zwischengespeicherte Passwort entschlüsseln. (Beachten Sie, dass beim Zurücksetzen des Windows-Benutzerkonto-Passworts durch einen Administrator alle zwischengespeicherten Passwörter nicht mehr zu entschlüsseln sind. Der Subversion-Client verhält sich dann so, als wären sie nicht vorhanden und fragt die Passwörter gegebenenfalls ab.)<ref group="svnbook">[http://svnbook.red-bean.com/de/1.6/svn.serverconfig.netmodel.html#svn.serverconfig.netmodel.credcache Subversion Book]</ref><br />
=== Änderungen rückgängig machen ===<br />
# Alle nicht abgegebene Änderungen in der Arbeitskopie entfernen (zurück auf die letzte Version im Repository):<br />
#* Auf Datei mit rechter Maustaste -> TortoiseSVN -> Revert<br />
# Auf eine vorherige Version zurückgehen:<br />Die Datei wird auf den alten Inhalt zurückgeändert und als geändert markiert, dh. sie hat jetzt den neuesten Revisionsstand. Die Änderung kann mit [[Subversion (SVN)#Revert|<code>Revert</code>]] rückgängig gemacht werden.<br />
#* Auf Datei mit rechter Maustaste -> TortoiseSVN -> Show log<br />
#* Auf gewünschte Version mit rechter Maustaste -> Revert to this Revision -> Yes<br />
=== Alte Versionen ansehen ===<br />
# Eine vorherige Version laden:<br />Die Datei wird nicht als geändert gekennzeichnet und somit beim nächsten Update wieder überschrieben. Nur zum Ansehen, muss hinterher mit <code>Update</code> wieder auf aktuellen Stand gebracht werden. Änderungen nicht möglich. Besser ist <code>Save revision to ..</code>.<br />
#* Auf gewünschte Version mit rechter Maustaste -> Update to Revision -> Version eingeben<br />
# Eine vorherige Version speichern:<br />
#* Auf Datei mit rechter Maustaste -> TortoiseSVN -> Show log<br />
#* Auf gewünschte Version mit rechter Maustaste -> Save revision to ..<br />
<br />
== Benutzung kdesvn (Linux<ref>Kubuntu 12:04</ref>) ==<br />
Als Client und Bedieneroberfläche benutzen wir '''kdesvn''' aus dem gleichnamigen Paket.<br />
=== Repository anlegen: ===<br />
{{Menüaktion|Datei -> Subversion-Admin -> Erstelle und öffne ein neues Repository}}.<br />
<br />Dieses noch leere {{Tooltip|Archiv|Repository}} checken wir dann in unsere Arbeitskopie aus und fügen die gewünschten Dateien hinzu.<br />
*Im Dateimanager: Im Arbeitkopieordner mit rechtem Mausklick -> Checkout (kdesvn)<br />
*In '''kdesvn''': Entweder Werkzeugleistensymbol '''Auschecken''' oder besser mit '''Subversion->Repository->Checke aktuellen Repository-Pfad''' im Menü.<br />Es öffnet sich immer ein Fenster. Zu beachten ist, das in dem Feld URL die Adresse mit '''ksvn+file:''' beginnt, sonst gibt es die Fehlermeldung '... ist kein Repository'. Bei der Menüvariante wird dies automatisch gesetzt, auch der ausgewählte Zweig (zB. trunk), bei 'Dateiauswahl' nicht. Trunk kann dann manuell an die URL angehängt werden, um nur den Hauptpfad auszuchecken.<br />Wenn die Checkbox mit dem eigenartigem Text "Füge Quell-URL an das Unterverzeichnis an" gesetzt ist (Default-Einstellung), wird der ausgewählte Zweig an den Ordnernamen der Arbeitskopie angehängt. Ich will das eher nicht, wenn ich 'trunk' auschecke, also Häkchen entfernen.<br />
<br />Voreinstellung für ein neues {{Tooltip|Archiv|Repository}} in {{Platz|/Pfad/zu/Repository}}/conf/svnserv.conf ist: anonyme Nutzer können lesen (<code>anon_access = read</code>), authorisierte Lesen und Schreiben (<code>auth_access = write</code>). Das soll auch so bleiben, wenn wir anonymen Nutzern Schreibzugriff gewähren, wird kein Autor eingetragen. Aber wir müssen eine Passwort-Datei festlegen mit <code>password-db = passwd</code> und in der Passwort-Datei (hier {{Platz|/Pfad/zu/Repository}}/conf/passwd) müssen wir einen Nutzer mit seinem Passwort eintragen mit <code>{{Platz|user}} = {{Platz|pass}}</code>. In svnserv.conf tragen wir auch noch einen {{Tooltip|Bereich(?)|realm}} ein: <code>realm = {{Platz|zB. Programmtitel}}</code>.<br />
<br />
== Benutzung Qt Creator (Linux<ref>Wahrscheinlich auch unter Windows, aber nicht getestet.</ref>) ==<br />
Wenn der Projektordner eine Arbeitsplatzkopie eines Repository ist, bietet der Qt Creator unter {{Menüaktion|Extras -> Subversion}} die gängigsten Befehle. Voraussetzung ist natürlich, dass Subversion installiert ist und das unter {{Menüaktion|Extras -> Einstellungen -> Versionskontrolle -> Subversion}} der richtige Befehl 'svn', unter Umständen mit vollständigem Pfad, eingetragen ist.<br />
Am besten den Ordner ohne Dateien auschecken und dann das Projekt in diesem Ordner anlegen. Es kann auch nachträglich der Projektordner zur Arbeitskopie gemacht werden, Extras->Subversion wird aber anscheinend erst nach Neustart sichtbar. <br />
== Fußnoten ==<br />
<references><br />
<ref name="inDatei">Versionsnummer in eine Datei schreiben: {{Isyn|lang=bash|code=svnversion > Dateiname}} oder anhängen: {{Isyn|lang=bash|code=svnversion >> Dateiname}}</ref><br />
<ref name="EigenschaftOrdner">Es können für alle Dateien in einem Ordner die Eigenschaft geändert werden. Dazu muß im Kontextmenü des Ordners Eigenschaften->Subversion->Properties ausgewählt werden. Im Eigenschaften-Editor (geöffnet nach "new" oder "edit") muß dann "... recursively" angekreuzt werden.</ref><br />
</references><br />
== Qellen ==<br />
*TortoiseSVN<br />
<references group="Tortoise" /><br />
*Version Control with Subversion<br />
<references group="svnbook" /></div>SysOpGerthttp://wiki.ggf-controls.de/index.php?title=Konfiguration_(Apache)Konfiguration (Apache)2019-05-13T21:51:37Z<p>SysOpGert: Datei für require</p>
<hr />
<div>== Verbindungen ==<br />
In /etc/apache2/ports.conf muss mit der Listen-Direktive der oder die {{platz|IP-Adresse:Port}} festgelegt werden, an denen der Server lauscht.<br />
<br />Zum Testen langt der lokale Zugriff auf localhost:80 {{isyn|lang=apache|code=Listen localhost:80}}. Falls man auf den Rechner aus einem Heimnetz zugreifen will, muss die IP-Adresse des Rechners im Netz hinzugefügt werden: {{isyn|lang=apache|code=Listen 192.168.3.17:80}}.<br />
== Ordnereinschränkungen ==<br />
Zugriffserlaubnis für Hosts auf Ordner muss man mit der [http://httpd.apache.org/docs/2.4/de/mod/mod_authz_host.html#require Require-Direktive in mod_authz_host] in /etc/apache2/apache2.conf oder in der .htaccess Datei festlegen:<br />
{{bsyn|lang=apache|code=<Directory><br />
.<br />
.<br />
Require all denied<br />
#erstmal alle verbieten für alle Ordner<br />
</Directory><br />
<Directory /var/www/><br />
.<br />
.<br />
Require ip 127.0.0.1 192.168.3.18<br />
#dann localhost und ...18 für /var/www erlauben<br />
</Directory>}}<br />
Mit der [http://httpd.apache.org/docs/2.4/de/mod/mod_authz_core.html#require Require-Direktive in mod_authz_core] werden {{Tooltip|Nutzer|User}}-Bedingungen festgelegt.<br />
== Fußnoten ==<br />
Siehe [[Hilfe:Bearbeiten|Bearbeitungshilfe]]<br />
<references><br />
<!-- <ref name="fehler">TODO: Wie werden Laufzeitfehler, Debuggerausgaben usw ohne IDE angezeigt. --><br />
</references><br />
<!-- Alternative können die Referenzadressen direkt im Text zwischen <ref> und </ref> eingegeben werden, dann muss hier nur ein leeres Tag <references /> stehen. --><br />
== Quellen ==<br />
Siehe [[Hilfe:Bearbeiten|Bearbeitungshilfe]]<br />
<references /><br />
<references group="QtR"><br />
<!-- <ref name="QObject">[http://doc.qt.nokia.com/4.7/qobject.html QObject Class Reference]</ref> --><br />
</ references><br />
[[Kategorie:Apache]]</div>SysOpGerthttp://wiki.ggf-controls.de/index.php?title=Konfiguration_(Apache)Konfiguration (Apache)2019-05-13T21:46:15Z<p>SysOpGert: Anpassung an Apache 2.4</p>
<hr />
<div>== Verbindungen ==<br />
In /etc/apache2/ports.conf muss mit der Listen-Direktive der oder die {{platz|IP-Adresse:Port}} festgelegt werden, an denen der Server lauscht.<br />
<br />Zum Testen langt der lokale Zugriff auf localhost:80 {{isyn|lang=apache|code=Listen localhost:80}}. Falls man auf den Rechner aus einem Heimnetz zugreifen will, muss die IP-Adresse des Rechners im Netz hinzugefügt werden: {{isyn|lang=apache|code=Listen 192.168.3.17:80}}.<br />
== Ordnereinschränkungen ==<br />
Zugriffserlaubnis für Hosts auf Ordner muss man mit der [http://httpd.apache.org/docs/2.4/de/mod/mod_authz_host.html#require Require-Direktive in mod_authz_host] festlegen:<br />
{{bsyn|lang=apache|code=<Directory><br />
.<br />
.<br />
Require all denied<br />
#erstmal alle verbieten für alle Ordner<br />
</Directory><br />
<Directory /var/www/><br />
.<br />
.<br />
Require ip 127.0.0.1 192.168.3.18<br />
#dann localhost und ...18 für /var/www erlauben<br />
</Directory>}}<br />
Mit der [http://httpd.apache.org/docs/2.4/de/mod/mod_authz_core.html#require Require-Direktive in mod_authz_core] werden {{Tooltip|Nutzer|User}}-Bedingungen festgelegt.<br />
== Fußnoten ==<br />
Siehe [[Hilfe:Bearbeiten|Bearbeitungshilfe]]<br />
<references><br />
<!-- <ref name="fehler">TODO: Wie werden Laufzeitfehler, Debuggerausgaben usw ohne IDE angezeigt. --><br />
</references><br />
<!-- Alternative können die Referenzadressen direkt im Text zwischen <ref> und </ref> eingegeben werden, dann muss hier nur ein leeres Tag <references /> stehen. --><br />
== Quellen ==<br />
Siehe [[Hilfe:Bearbeiten|Bearbeitungshilfe]]<br />
<references /><br />
<references group="QtR"><br />
<!-- <ref name="QObject">[http://doc.qt.nokia.com/4.7/qobject.html QObject Class Reference]</ref> --><br />
</ references><br />
[[Kategorie:Apache]]</div>SysOpGerthttp://wiki.ggf-controls.de/index.php?title=DoxygenDoxygen2018-02-25T15:39:33Z<p>SysOpGert: Vorlagen Programm und FremdName verwendet</p>
<hr />
<div>[[Kategorie:Tools]]<br />
Ein wundervolles Dokumentationswerkzeug von [http://www.stack.nl/~dimitri/doxygen/index.html Dimitri van Heesch]. Vielen Dank für diese Hilfe.<br />
== Installation ==<br />
=== Kubuntu <ref>getestet für 12.04</ref> ===<br />
Doxygen ist in den Ubuntu-Paketquellen vorhanden, aber es wird das Paket {{FremdName|doxygen-latex}} empfohlen, und das ist riesig. Wenn man {{FremdName|LaTex}} nicht benötigt, sollte man darauf verzichten. Leider werden von der Muon-Paketverwaltung<ref>Wahrscheinlich der Ubuntu-Paketverwaltung.</ref> auch empfohlen Pakete mit installiert. Ein Ausweg ist die Installation über die Konsole:<br />
{{Eingabe|sudo apt-get install --no-install-recommends doxygen}}<br />
Dagegen wird das Paket {{FremdName|GraphViz}} mit dem Tool {{Programm|dot}} nicht mitinstalliert, welches Doxygen für die wundervollen Vererbungsgraphen nutzt. Sollte also zusätzlich installiert werden.<br />
<br />Verwendet wird {{Programm|dot}} erst, nachdem in der Konfigurationsdatei HAVE_DOT = YES gesetzt wird.<br />
<br />
== Gebrauch ==<br />
Aufruf von<br />
{{Eingabe|doxygen }}{{Platz|Konfigurationsdatei}}<br />
in der Kommandozeile erzeugt und verknüpft Dokumentation zu allen Dateien mit der in der {{Platz|Konfigurationsdatei}} angegebenen Endung. Wenn in der {{Platz|Konfigurationsdatei}} 'RECURSIVE = YES' gesetzt ist, werden auch die Unterordner durchsucht. Wenn {{Platz|Konfigurationsdatei}} weggelassen wird, wird eine Datei namens 'Doxyfile' verwendet.<br />
<br />
== Einstellungen ==<br />
{{Eingabe|doxygen -g}}<br />
erzeugt eine projekteigene Konfigurationsdatei namens Doxyfile, in der eine Menge "tags" stehen, mit denen Doxygen eingestellt werden kann. zB.<br />
* PROJECT_NAME = "{{Platz|Projektname}}": Die Überschrift aller Seiten.<br />
* JAVADOC_AUTOBRIEF = YES: Der 1. Satz (bis zum 1. Punkt, wenn ein . Teil der Kurzbeschreibung sein soll, muss man ihn mit nachfolgendem \ und Leerzeichen kennzeichnen) wird als Kurzbeschreibung verwendet und taucht ganz oben und in der Auflistung auf<ref >In Kommentaren im JavaDoc - Stil /** <Kommentar> */</ref>.<br />
* EXTRACT_ALL = YES: Auch nicht kommentierte Klassen werden in die Dokumentation aufgenommen. Das ist hilfreich, wenn auch Kommentar fehlt, so wird doch die Klassenhierarchie dargestellt.<br />
* EXTRACT_STATIC = YES: Auch statische Member werden dokumentiert.<br />
* RECURSIVE = YES: Dateien werden auch in Unterordnern gesucht.<br />
* HTML_DYNAMIC_SECTIONS = Yes: Graphen werden beim Öffnen einer Seite versteckt und könne per Mausklick geöffnet und wieder versteckt werden.<br />
* HAVE_DOT = YES: Erzeugung von Graphen mittels '''dot''' (mehr und bessere Graphen).<br />
* HIDE_UNDOC_RELATIONS = NO: Nur dann werden auch die Klassen aus Bibliotheken in die Graphen mit aufgenommen. Sehr wichtig für Qt, wo fast alles von Klassen aus den Qt-Bibliotheken abgeleitet wird.<br />
=== Navigationsleiste ändern ===<br />
{{Eingabe|doxygen -l}}<br />
erzeugt eine projekteigene Layoutdatei namens DoxygenLayout.xml. Diese Datei wird beim Aufruf geladen<ref>Mit Tag 'LAYOUT_FILE' im Doxyfile kann die Layoutdatei ausgwählt werden, Vorgabe DoxygenLayout.xml.</ref>. Modifikationen dieser Datei ändern das Erscheinungsbild der Dokumentation.<br />
<br /><nowiki><tab>-Elemente</nowiki> im <nowiki><navindex>-Element</nowiki> in dieser Datei sind die Abschnitte der Navigationsleiste. Es können eigene Elemente mit Attribut 'user' hinzugefügt werden:<br />
{{Bsyn|lang="xml"|code=<tab type="user" url="Buchhaltung.zip" title="Download"/>}}<br />
== Kommentarformate ==<br />
Eine SEHR beschränkte Auswahl der Möglichkeiten entsprechend MEINER Präferenz! Andere mögen anderes vorziehen.<br />
*Javadoc Kommentare (über dem Objekt): /** {{Platz|Kommentar}} */<br />
<syntaxhighlight lang="cpp"><br />
/** Beschreibung zur Nummer */<br />
int number;<br />
</syntaxhighlight><br />
*Javadoc Kommentare hinter dem Objekt: ///< {{Platz|Kommentar}}<br />
<syntaxhighlight lang="cpp"><br />
int number; ///< Kurzbeschreibung zur Nummer<br />
</syntaxhighlight><br />
Kommentare können im Prinzip an jeder beliebigen Stelle stehen, dann muss mit einem [[#Spezielle Kommandos|Special Command]] die Zuordnung benannt werden.<br />
<br />Special Command [http://www.stack.nl/~dimitri/doxygen/commands.html#cmdfile \file] ist zB. die einzige Möglichkeit, eine Datei zu kommentieren.<br />
{{Bsyn|lang=cpp|code=/** \file datei.h<br />
*Kommentar....<br />
*/}}<br />
In die Projektseite ''index.html''<ref>Die Seite, die zuerst aufgerufen wird.</ref> wird mit [http://www.stack.nl/~dimitri/doxygen/commands.html#cmdmainpage \mainpage] Kommentar eingefügt.<br />
<br />
== Spezielle Kommandos ==<br />
beginnen mit einem \ oder @. Es gibt eine Unmenge von [http://www.stack.nl/~dimitri/doxygen/commands.html Special Commands], die das Aussehen der Dokumentation beeinflussen. Einige Beispiele:<br />
*[http://www.stack.nl/~dimitri/doxygen/commands.html#cmdparam \param] : Für die Parameter einer Funktion / Methode.<br />
*[http://www.stack.nl/~dimitri/doxygen/commands.html#cmdreturn \return] : Für den Rückgabewert einer Funktion / Methode.<br />
<syntaxhighlight lang="cpp"><br />
/** Kurzbeschreibung. Ausführliche Beschreibung.<br />
\param c a character.<br />
\param n an integer.<br />
\exception std::out_of_range parameter is out of range.<br />
\return a character pointer. */<br />
char* Funktion(char c, int n);<br />
</syntaxhighlight><br />
Spezielle Kommandos können Parameter haben, wobei unterschieden wird zwischen:<br />
* Einzelwörter: im [http://www.stack.nl/~dimitri/doxygen/manual/commands.html Doxygen Manual] mit <spitzen> Klammern gekennzeichnet.<br />
* Texte bis zum Ende der Zeile: Im [http://www.stack.nl/~dimitri/doxygen/manual/commands.html Manual] mit (runden) Klammern gekennzeichnet.<br />
* Paragraphen: Ein Paragraph reicht bis zur nächsten Leerzeile oder dem nächsten Kommando. Im [http://www.stack.nl/~dimitri/doxygen/manual/commands.html Manual] mit {geschweiften} Klammern gekennzeichnet.<br />
[Eckige] Klammern kennzeichnen optionale Parameter.<br />
=== Code-Teile übernehmen ===<br />
Oft ist es sinnvoll, in die Dokumentation {{Tooltip|Ausschnitte|Snippets}} aus dem eigentlichem Programm-Code zu übernehmen, als Beispiel oder um Hilfetexte nicht wiederholen zu müssen. Eine Möglichkeit ist<br />
*[http://www.stack.nl/~dimitri/doxygen/manual/commands.html#cmddontinclude \dontinclude {{Platz|file}}]: Setzt einen internen Zeiger auf den Anfang von {{Platz|file}}.<br />
in Verbindung mit<br />
*[http://www.stack.nl/~dimitri/doxygen/manual/commands.html#cmdskip \skip {{Platz|pattern}}]: Setzt in {{Platz|file}} den internen Zeiger auf die nächste Zeile mit {{Platz|pattern}}.<br />
*[http://www.stack.nl/~dimitri/doxygen/manual/commands.html#cmdskipline \skipline {{Platz|pattern}}]: Setzt in {{Platz|file}} den internen Zeiger auf die nächste Zeile mit {{Platz|pattern}} und fügt diese ein.<br />
*[http://www.stack.nl/~dimitri/doxygen/manual/commands.html#cmduntil \until {{Platz|pattern}}]: Fügt alle Zeilen aus {{Platz|file}} ab dem internen Zeiger bis zur Zeile mit {{Platz|pattern}} inklusive ein.<br />
*[http://www.stack.nl/~dimitri/doxygen/manual/commands.html#cmdline \line {{Platz|pattern}}]: Fügt die 1. nicht leere Zeile mit {{Platz|pattern}} hinter dem internen Zeiger ein.<br />
<br />
<syntaxhighlight lang="cpp"><br />
/** Klasse AccountAddChangeDialog: Kurzbeschreibung. Ausführliche Beschreibung.<br />
* Quellcode zur Klasse in Datei accountaddchangedialog.cpp öffnen:<br />
* \dontinclude accountaddchangedialog.cpp<br />
* Einbinden des Hilfetextes von 'cbAccounts':<br />
* \skip ui->cbAccounts->setWhatsThis(<br />
* \until )<br />
* Einbinden des Hilfetextes von 'checkDelete':<br />
* \skip ui->checkDelete->setWhatsThis(<br />
* \until )<br />
*/<br />
</syntaxhighlight><br />
fügt die Befehle zum Setzen der [[Anwendungshilfe (Qt)#QWhatsThis|WhatsThis]] inklusive der Texte in die Doku ein.<br />
<br />Damit das alles funktioniert, muss in der Konfigurationsdatei (zB. Doxyfile) der Beispielpfad gesetzt werden, geht auch mit '.' für den aktuellen Ordner:<br />
*EXAMPLE_PATH = /Pfad/zum/Ordner oder<br />
*EXAMPLE_PATH = .<br />
*EXAMPLE_RECURSIVE = YES<br />
<br />
=== Test ===<br />
Es ist sinnvoll, jede Methode zu testen, erscheint sie auch noch so simpel. Um eine Testbeschreibung einzufügen, wichtig für die Reproduzierbarkeit, gibt es das Kommando [http://www.stack.nl/~dimitri/doxygen/manual/commands.html#cmdtest \test]. Damit wird der nachfolgende [[#Spezielle Kommandos | Paragraph]] gekennzeichnet und eine Kopie in einer '''Test-Liste''' angelegt. '''Test-Liste''' ist über den Abschnitt '''Zusätzliche Informationen''' erreichbar.<br />
=== Bilder ===<br />
Mit [http://www.stack.nl/~dimitri/doxygen/manual/commands.html#cmdimage \image] können Bilder in die Dokumentation aufgenommen werden. Es muss das Ausgabeformat,<br />
zB. html und der Dateinamen benannt werden, eine Unterschrift und Größe ist optional:<br />
{{Bsyn|lang=xml|code=\image html bild.png}}<br />
Es können die Bildformate verwendet werden, die der Browser unterstützt.<br />
<br />Damit das alles funktioniert, muss in der Konfigurationsdatei (zB. Doxyfile) der Bilderpfad gesetzt werden:<br />
*IMAGE_PATH = /Pfad/zum/Ordner<br />
<br />
== Kommentarformatierung ==<br />
Es sind eine große Anzahl von [http://www.stack.nl/~dimitri/doxygen/manual/htmlcmds.html HTML-Tags] zulässig, zB. <nowiki><table> oder <H1></nowiki>.<br />
<br />Es können [http://www.stack.nl/~dimitri/doxygen/manual/lists.html Listen] mit HTML-Tags, den Special Commands [http://www.stack.nl/~dimitri/doxygen/commands.html#cmdli \li] oder [http://www.stack.nl/~dimitri/doxygen/commands.html#cmdarg \arg] oder mit -(Aufzählungszeichen) und -#(nummeriert) erzeugt werden<ref>Die in der [http://www.stack.nl/~dimitri/doxygen/manual/markdown.html#md_lists doxygen-Dokumentation unter Markdown-Support] beschriebenen Möglichkeiten +, *, 1. funktionieren bei mir (doxygen 1.7.6.1, Kubuntu 12:04) nicht</ref>. Bei -, -# gibt der Spalteneinzug die Aufzählungsebene an.<br />
<br />Wenn man für Doxygen reservierte Zeichen verwenden will, muss man sie mit \ maskieren.<br />
=== Automatische Link-Erzeugung ===<br />
Falls innerhalb einer Beschreibung Namen von Klassen und ihrer {{Tooltip|Mitglieder|Member}}, Funktionen, Typdefinition und Dateien verwendet werden, die in der Dokumentation vorkommen, werden automatisch Links auf deren Dokumentationsseiten erzeugt. Das funktioniert unter Linux<ref>Kubuntu 14.04, Doxygen 1.8.6</ref> problemlos, unter Windows<ref>Win7, Doxygen 1.8.11</ref> weigert sich Doxygen aber, {{Tooltip|Erweiterung .h|Header-Dateien}} zu verlinken. {{Tooltip|Umgehungslösung|Workaround}} ist das spezielle Kommandopaar [http://www.stack.nl/~dimitri/doxygen/manual/commands.html#cmdlink \link] - [http://www.stack.nl/~dimitri/doxygen/manual/commands.html#cmdendlink \endlink] um den Dateinamen. Dann wird auf die 1. Seite<ref>Ich habe noch keinen Weg gefunden, Dateien gleichen Namens, aber aus unterschiedlichen Ordnern, zu unterscheiden.</ref> verlinkt, die den Dateinamen enthält, bzw. die allererste Seite, wenn die Datei nicht dokumentiert ist.<br />
== Doxygen und Qt ==<br />
Doxygen kann aus der erzeugten html-Dokumentation eine Qt-kompatible Dokumentation generieren, eine {{FremdName|Qt Compressed Help}} (SQL-Datenbankdatei mit der Erweiterung .qch) im Unterordner qch im Projektordner, parallel zum Ordner html. Diese kann im {{Programm|Qt-Creator}} über Extras->Einstellungen->Hilfe->Dokumentation hinzugefügt werden. Dann wird mit F1 die zugehörige Seite einer Klasse oder Methode in der Doxygen-Dokumentation aufgerufen, genau wie bei Qt-Klassen.<br />
Dazu sind in der Konfigurationsdatei {{Platz|Doxyfile}} folgende Tags zu setzen:<br />
* GENERATE_QHP = YES: Es wird ein Index der HTML-Dateien als Qt Help Project (eine xml-Datei mit Erweiterung .qhp) erzeugt. Aus dieser wird mit {{Programm|qthelpgenerator}} die {{FremdName|Qt Compressed Help}} erzeugt.<br />
* QHP_NAMESPACE = Buchhaltung.doxygen.Project: Eindeutiger Name der Doku.<br />
* QHP_VIRTUAL_FOLDER = doc: Virtuelles Wurzelverzeichnis aller in der Qt Compressed Help angesprochenen Dateien. Wenn unterschiedliche Dokumentationen das gleiche 'Virtual Folder' haben, können sie über relative Links mit einander verknüpft werden.<br />
* QHG_LOCATION = /Pfad/zum/Qt/Version/gcc_64/bin/qhelpgenerator: Der {{Programm|qthelpgenerator}} wird nach erstellen der HTMLs automatisch aufgerufen.<br />
== Fußnoten ==<br />
<references /></div>SysOpGerthttp://wiki.ggf-controls.de/index.php?title=Vorlage:ProgrammVorlage:Programm2018-02-25T15:31:10Z<p>SysOpGert: Die Seite wurde neu angelegt: „'''{{{1}}}'''<noinclude> == Verwendung == Programm / Tool. ==Anwendung== {{Isyn|lang=html4strict|code=<nowiki>{{Programm|Qt Help Project}}</nowiki>}} formatier…“</p>
<hr />
<div>'''{{{1}}}'''<noinclude><br />
== Verwendung ==<br />
Programm / Tool.<br />
==Anwendung==<br />
{{Isyn|lang=html4strict|code=<nowiki>{{Programm|Qt Help Project}}</nowiki>}}<br />
formatiert den Text fett.</noinclude></div>SysOpGerthttp://wiki.ggf-controls.de/index.php?title=Vorlage:FremdNameVorlage:FremdName2018-02-25T15:30:47Z<p>SysOpGert: </p>
<hr />
<div>{{{1}}}<noinclude><br />
== Verwendung ==<br />
Eigenname / Bezeichnung für etwas durch den Hersteller.<br />
== Anwendung ==<br />
{{Isyn|lang=html4strict|code=<nowiki>{{FremdName|Qt Help Project}}</nowiki>}}<br />
formatiert und färbt den Text zur Hervorhebung.<br />
<br />Zur Zeit noch ohne Formatierung</noinclude></div>SysOpGerthttp://wiki.ggf-controls.de/index.php?title=Vorlage:FremdNameVorlage:FremdName2018-02-25T15:25:24Z<p>SysOpGert: Die Seite wurde neu angelegt: „{{{1}}}<noinclude> Eigenname / Bezeichnung für etwas durch den Hersteller. ==Anwendung== {{Isyn|lang=html4strict|code=<nowiki>{{FremdName|Qt Help Project}}</n…“</p>
<hr />
<div>{{{1}}}<noinclude> Eigenname / Bezeichnung für etwas durch den Hersteller.<br />
==Anwendung==<br />
{{Isyn|lang=html4strict|code=<nowiki>{{FremdName|Qt Help Project}}</nowiki>}}<br />
formatiert und färbt den Text zur Hervorhebung.<br />
<br />Zur Zeit noch ohne Formatierung</noinclude></div>SysOpGerthttp://wiki.ggf-controls.de/index.php?title=HauptseiteHauptseite2017-03-27T17:46:02Z<p>SysOpGert: 1 Version: Neuinstallation</p>
<hr />
<div>__NOTOC__ __NOEDITSECTION__<br />
Als Dozent für C++ an der Volkshochschule Kiel habe ich sehr schnell die Notwendigkeit eines Arbeitspapiers für meine Kursteilnehmer erkannt. Ziel wurde eine kurze Zusammenfassung des Stoffes zum Nachlesen. Also warum nicht gleich das Papier ins Netz stellen, und dann als Wiki, weil es 1. leichter zu editieren und 2. von jedermann erweiterbar ist.<br />
<br />Und dann habe ich es gleich zu einer Stoffsammlung auch für andere Bereiche ausgeweitet. Alle hier beschriebenen Werkzeuge sind OpenSource und/oder es gibt mindestens eine kostenfreie Version.<br />
<br />
Dieses Wiki erhebt auf gar keinen Fall den Anspruch, mit den vielfach im Netz stehenden anderen Seiten zu konkurrieren, die oft wirklich sehr gut das jeweilige Sachgebiet beschreiben. Einige wenige Beispiele mit sehr hohem Informationsgehalt, ohne dass ich andere damit herabsetzen möchte:<br />
* C++: [http://www.cplusplus.com/doc/tutorial/ C++ Language Tutorial]<br />
* PHP: [http://php.net/manual/de/ PHP-Handbuch]<br />
* mySQL: [http://dev.mysql.com/doc/refman/5.5/en/index.html MySQL 5.5 Reference Manual]<br />
Diese Werkzeuge sind alle sehr mächtig und umfangreich, und damit leider auch die zugehörigen Dokumentationen. Glücklicherweise brauche ich für die tägliche Arbeit meist nur einen recht eingeschränkten Funktionsumfang, den ich aber oft recht mühsam aus der vorhandenen Dokumentation herausfiltern muss. Und dann gibt es natürlich noch die Machwerke, die es schaffen, auf über 1000 Seiten die trivialsten Dinge zu beschreiben, und sich ausschweigen, wenn es komplizierter wird.<br />
<br />
'''Dieses Wiki verfolgt das Ziel, mit möglichst knappen Worten einen Leitfaden für die Standardnutzung (aus Sicht des Autors) der jeweiligen Werkzeuge zu geben.'''<br />
<br />
Und dann gibt es natürlich noch die mühsam erforschten Ausnahmen und Fallen, die selbst in der besten Dokumentation sehr versteckt sind oder gar fehlen. Auch diese werden hier beschrieben, damit ich nicht noch mal die gleiche Fehlersuche machen muss.<br />
<br />
Jedermann ist aufgerufen, dieses Wiki zu erweitern oder Fehler zu korrigieren. Ich bitte aber darum, den in der [[Hilfe:Bearbeiten|Bearbeitungshilfe]] beschriebenen Seitenaufbau einzuhalten bzw. die dort beschriebenen Vorlagen zu nutzen.<br />
<br />
== Bereiche ==<br />
{| border=0<br />
| width='33%' |<br />
=== Programmieren ===<br />
| width='33%' |<br />
=== Web-technologien ===<br />
|- valign='top'<br />
|<br />
*[[:Kategorie:Tools|Tools]]<br />
*[[:Kategorie:C++|C++]]<br />
*[[:Kategorie:Datenbanken|Datenbanken]]<br />
*[[:Kategorie:PHP|PHP]]<br />
|<br />
*[[:Kategorie:Apache|Apache Webserver]]<br />
*[[:Kategorie:Wiki|Wiki]]<br />
|}</div>SysOpGerthttp://wiki.ggf-controls.de/index.php?title=Konfiguration_(Apache)Konfiguration (Apache)2017-03-27T17:36:28Z<p>SysOpGert: 1 Version: Neuinstallation</p>
<hr />
<div>== Verbindungen ==<br />
In /etc/apache2/ports.conf muss mit der Listen-Direktive der oder die {{platz|IP-Adresse:Port}} festgelegt werden, an denen der Server lauscht.<br />
<br />Zum Testen langt der lokale Zugriff auf localhost:80 {{isyn|lang=apache|code=Listen localhost:80}}. Falls man auf den Rechner aus einem Heimnetz zugreifen will, muss die IP-Adresse des Rechners im Netz hinzugefügt werden: {{isyn|lang=apache|code=Listen 192.168.3.17:80}}.<br />
== Ordnereinschränkungen ==<br />
Zugriffserlaubnis für Hosts auf Ordner muss man mit der [http://httpd.apache.org/docs/2.4/de/mod/mod_access_compat.html#order Order-Direktive] in Verbindung mit [http://httpd.apache.org/docs/2.4/de/mod/mod_access_compat.html#allow Allow]- und [http://httpd.apache.org/docs/2.4/de/mod/mod_access_compat.html#deny Deny-Direktive] festlegen<ref>Wenn keine {{Isyn|lang=apache|code=Allow}} oder {{Isyn|lang=apache|code=Deny}} angegeben werden, wird alle angenommen: {{Isyn|lang=apache|code=Order Allow,Deny}} alleine erlaubt erst alle und verbietet dann alle.</ref>:<br />
{{bsyn|lang=apache|code=<Directory><br />
.<br />
.<br />
Require all denied<br />
Order Allow,Deny<br />
#erstmal alle verbieten für alle Ordner<br />
</Directory><br />
<Directory /var/www/><br />
.<br />
.<br />
Require all granted<br />
#Zugriff für alle Nutzer auf /var/www<br />
<br />
Order Deny,Allow<br />
Deny from all<br />
Allow from 127.0.0.1 192.168.3.18<br />
#dann localhost und ...18 für /var/www erlauben<br />
</Directory>}}<br />
Mit der [http://httpd.apache.org/docs/2.4/de/mod/mod_authz_core.html#require Require-Direktive] werden {{Tooltip|Nutzer|User}}-Bedingungen festgelegt.<br />
== Fußnoten ==<br />
Siehe [[Hilfe:Bearbeiten|Bearbeitungshilfe]]<br />
<references><br />
<!-- <ref name="fehler">TODO: Wie werden Laufzeitfehler, Debuggerausgaben usw ohne IDE angezeigt. --><br />
</references><br />
<!-- Alternative können die Referenzadressen direkt im Text zwischen <ref> und </ref> eingegeben werden, dann muss hier nur ein leeres Tag <references /> stehen. --><br />
== Quellen ==<br />
Siehe [[Hilfe:Bearbeiten|Bearbeitungshilfe]]<br />
<references /><br />
<references group="QtR"><br />
<!-- <ref name="QObject">[http://doc.qt.nokia.com/4.7/qobject.html QObject Class Reference]</ref> --><br />
</ references><br />
[[Kategorie:Apache]]</div>SysOpGerthttp://wiki.ggf-controls.de/index.php?title=ComboBoxes_(Qt)ComboBoxes (Qt)2017-03-27T17:36:28Z<p>SysOpGert: 1 Version: Neuinstallation</p>
<hr />
<div>[[Kategorie:C++]]<br />
Eine ComboBox bietet die Möglichkeit, aus einer Liste von Texten einen auszuwählen. Nach Anklicken des {{Tooltip|kleinen Pfeils rechts|Popup-Buttons}} öffnet sich eine Liste der möglichen Texte. Jedem Text ist ein Index zugeordnet entsprechend der Reihenfolge in der Liste.<br />
<br />
ComboBox heißt sie wohl, weil man den Text in der Box ändern kann. Der editierbare Teil der ComboBox ist ein [[LineEdit (Qt)|QLineEdit]], ein Zeiger darauf erhält man mit {{Isyn|lang=cpp-qt|code=QlineEdit* lineEdit()}}. Aber Vorsicht, falls die ComboBox nicht editierbar ist ({{Isyn|lang=cpp-qt|code=editable() == false}}), ist der Zeiger 0 und eine Verwendung führt zu einem Programmabsturz. Leider ist das der Default-Zustand. Also die Rückgabe von lineEdit() auf 0 testen oder die ComboBox rechtzeitig mit {{Isyn|lang=cpp-qt|code=setEditable(true);}} editierbar machen.<br />
<br />
== Füllen der Liste ==<br />
Die Texte werden als [[Listen (Qt)#Eine Liste von Strings|QStringList]] mit {{Isyn|lang=cpp-qt|code=insertItems(int index, const QStringList& list)}} oder als [[Strings (Qt)|QString]] mit {{Isyn|lang=cpp-qt|code=void insertItem(int index, const QIcon& icon, const QString& text, const QVariant& userData = QVariant())}} an die Position index eingefügt.<br />
<br />Im Designer öffnet sich bei Doppelklick auf eine ComboBox ein Dialog zum Füllen der Liste.</div>SysOpGerthttp://wiki.ggf-controls.de/index.php?title=Widgets_(Qt)Widgets (Qt)2017-03-27T17:36:28Z<p>SysOpGert: 1 Version: Neuinstallation</p>
<hr />
<div>[[Kategorie:C++]]<br />
Jedes GUI-Element (zB. Knöpfe, Eingabefelder, Anzeigen, Beschriftungen) wird als '''Widget''' bezeichnet. '''Widgets''' werden innerhalb eines Fensters angezeigt, können aber auch eigene Fenster sein. '''Widgets''' werden über [[Ereignisse (Qt)|Ereignisse]] vom System durch Aufruf der virtuellen Methode {{Isyn|lang=cpp-qt|code=bool QObject::event(QEvent * e)}} informiert.<br />
<br />Die Basisklasse für alle '''Widgets''' ist [https://qt-project.org/doc/qt-5/qwidget.html QWidgets]. Ein Widget kann einen {{Tooltip|übergeordnetes Widget, Vorfahr|Parent}}<ref>Abgelegt in Eigenschaft {{Isyn|lang=cpp-qt|code=QObject* parent}}.</ref> haben, dann ist es innerhalb dieses Parent angeordnet. Wenn der Parent-Zeiger 0 ist<ref>{{Isyn|lang=cpp-qt|code=QObject* parent == 0}}</ref>, handelt es sich um ein eigenes Fenster. Der Vorfahr wird üblicherweise bei der Konstruktion gesetzt, Vorgabe ist 0 (Fenster)<ref group="QtR">[https://qt-project.org/doc/qt-5/qtwidgets-index.html Qt Widgets]</ref>.<br />
<br />Es gibt viele abgeleitete Elemente für alle möglichen Anwendungen, einige Beispiele:<br />
*[[QMainWindow|Hauptfenster]]<br />
*[[Taster (Qt)|Taster]]<br />
*[[Zahleneingaben (Qt)|Zahleneingaben]]<br />
*[[Datum- und Zeiteingabe (Qt)|Datum- und Zeiteingabe]]<br />
== Geometrie ==<br />
Mit {{Isyn|lang=cpp-qt|code=const QRect& geometry() const}} erhält man Lage innerhalb des Parent und Größe eines Widgets<ref>Ein Rechteck um das Widget ohne Rahmen.</ref>, mit {{Isyn|lang=cpp-qt|code=void setGeometry(int x, int y, int w, int h)}} kann man sie anpassen. Ein Widget kann nicht außerhalb seines Vorfahren geschoben werden. Teile zu großer Widgets außerhalb des Parents werden nicht angezeigt.<br />
<br />Dies gilt nicht für [[Dialoge (Qt)|Dialoge]] abgeleitet von {{Isyn|lang=cpp-qt|code=QDialog}}. Dialoge sind eigene Fenster, können aber einen Vorfahr haben, in dem sie dann zentriert platziert werden. Aber auch dann gibt {{Isyn|lang=cpp-qt|code=const QRect& geometry() const}} als Position (0, 0) zurück. {{Isyn|lang=cpp-qt|code=void setGeometry(const QRect &)}} verschiebt dann den Dialog in die linke, obere Ecke des Bildschirms<ref>Position (0, 0)</ref>. Wenn man nur die Größe eines Dialogs ändern will, muss man {{Isyn|lang=cpp-qt|code=void resize(const QSize&)}} verwenden.<br />
Falls die [[Automatische Anordnung (Qt) |Automatische Anordnung (Qt) ]] mittels QLayout verwendet wird, wird {{Isyn|lang=cpp-qt|code=QRect& geometry}} bedeutungslos.<br />
<br />
== Tabulatorreihenfolge ==<br />
In einer GUI wird üblicherweise mit der TAB-Taste das nächste Element - bzw. mit Shift+TAB das vorhergehende - {{Tooltip|ausgewählt|fokussiert}}. Die Reihenfolge kann im '''Designer''' festgelegt werden oder mit {{Isyn|lang=cpp-qt|code=static void QWidget::setTabOrder(QWidget * first, QWidget * second);}}<ref group="QtR">[https://qt-project.org/doc/qt-5/focus.html Keyboard Focus in Widgets]</ref>.<br />
== Tooltips ==<br />
{{Tooltip|Hilfetexte, die erscheinen, wenn mit der Maus auf ein GUI-Element gezeigt wird|Tooltips}} lassen sich für ein Widget sehr einfach realisieren. Der Hilfetext wird entweder mit der Funktion {{Iqt|void setToolTip(const QString &)}} oder im Eigenschaften-Editor des '''Designer''' in die Eigenschaft {{Iqt|QString QWidget::toolTip}} eingetragen. Sobald {{Iqt|QString QWidget::toolTip}} nicht leer ist, wird der Inhalt angezeigt, sobald der Mauszeiger über dem Widget positioniert ist.<br />
== Fußnoten ==<br />
<references /><br />
== Quellen ==<br />
*aus der Qt 5 Reference Documentation:<br />
<references group="QtR" /><br />
*aus Qt Quarterly<br />
<references group="QtQ" /><br />
*aus der deutschen Wikipedia:<br />
<references group="WP" /></div>SysOpGerthttp://wiki.ggf-controls.de/index.php?title=Drucken_(Qt)Drucken (Qt)2017-03-27T17:36:28Z<p>SysOpGert: 1 Version: Neuinstallation</p>
<hr />
<div>[[Kategorie:C++]]<br />
{{Qt-Tour|DLLs|Verschiedenes}}<br />
== QPrinter ==<br />
QPrinter ist von QPaintDevice<ref>Genauer [http://qt-project.org/doc/qt-5.1/qtgui/qpagedpaintdevice.html QPagePaintDevice]</ref> abgeleitet und bietet somit eine für Drucker optimierte Möglichkeit zur Darstellung von Daten auf einem Medium. Verwendet wird ein QPrinter-Objekt durch [http://qt-project.org/doc/qt-5.1/qtgui/qpainter.html QPainter] zum Zeichnen bzw. Rendern von Grafikobjekten. [[Widgets (Qt)|QWidget]] hat die Methode [http://qt-project.org/doc/qt-5.1/qtwidgets/qwidget.html#render void QWidget::render(QPainter * painter, ...)], mit der das [[Widgets (Qt)|Widget]] direkt gedruckt werden kann.<br />
<br />Beispiel zum Drucken einer Tabelle in eine PDF-Datei:<br />
{{Bsyn|lang=cpp-qt|code=tableView = new QTableView;<br />
tableView->setModel(&model);<br />
tableView->show();<br />
<br />
QPrinter printer;<br />
printer.setOutputFileName("table.pdf");<br />
QPainter painter;<br />
painter.begin(&printer);<br />
<br />
tableView->render(&painter);<br />
<br />
painter.end();<br />
}}<br />
Wenn {{Isyn|lang=cpp-qt|code=QPrinter::outputFileName()}} ein nicht leerer Text ist, wird in Datei {{Isyn|lang=cpp-qt|code=outputFileName}} gedruckt, wenn Text die Extension .pdf hat, wird eine PDF-Datei erzeugt, sonst ist der Typ abhängig vom Drucksystem<ref>Unter Linux wird CUPS verwendet => Dateiformat Postscript (Extension .ps)</ref>.<br />
<br />
Man kann auch direkt in einen Drucker "malen", QPainter bietet eine Menge Methoden zum Zeichnen aller möglichen Grafikobjekte inklusive Textschreiben. Wiederum wird beim Konstruieren oder mit {{Isyn|lang=cpp-qt|code=bool QPainter::begin(QPaintDevice * device)}} das QPrinter-Objekt übergeben. QPainter verwendet als Maßeinheit logische {{Tooltip|Dots/Inch|DPI}} des Druckers, diese kann man mit {{Isyn|lang=cpp-qt|code=QPrinter::logicalDpiX}} oder {{Isyn|lang=cpp-qt|code=QPrinter::logicalDpiY}} abfragen. Da wir lieber mit mm rechnen, können wir sie in Dots / mm umrechnen, indem wir den Wert durch 25,4 teilen<ref>1 {{Tooltip|Zoll|Inch}} = 25,4 mm</ref>. Wenn wir also etwas mit Breite 20mm zeichnen wollen, müssen wir diesen Wert für QPainter mit QPrinter::logigalDpiX / 25,4 multiplizieren. zB. ein Quadrat 20mm x 20mm:{{Bsyn|lang=cpp-qt|code=QPrinter printer;<br />
QPainter painter;<br />
painter.begin(&printer);<br />
painter.drawRect(0, 0, 20 * printer.logicalDpiX / 25.4, 20 * printer.logicalDpiY / 25.4);<br />
}}<br />
Beim Drucken in ein PDF war bei mir<ref>Linux Kubuntu 12.04</ref> die logische Auflösung 96 DPI und die physikalische 1200 DPI<ref>Es scheinen willkürliche Werte zu sein, [http://de.wikipedia.org/wiki/PDF PDF ist ein Vektorformat].</ref>.<br />
=== [https://doc.qt.io/qt-5/qprintdialog.html QPrintDialog] ===<br />
Um beim Aufruf des Dialogs mit "Print to File" zu starten, muss '''nach'''<ref>Bei Qt5.5.1. Bei älteren Versionen (getestet mit Qt5.1) kann es auch vorher gesetzt werden</ref> Konstruktion des Dialogs mit {{Iqt|printer.setOutputFormat(QPrinter::PdfFormat);}} oder {{Iqt|printer.setPrinterName(QString());}} das Format auf PDF gesetzt werden.<br />
== QPdfWriter ==<br />
Es gibt auch eine Klasse nur für PDF. QPdfWriter ist genauso von QPagePaintDevice abgeleitet und scheint etwas schlanker zu sein<ref>Es fehlen druckerspezifische Methoden. Scheint aber recht stiefmütterlich behandelt zu werden, zB. in der Dokumentation.</ref><br />
<br />Anwendung wie oben, aber logische Größe ist 1200 DPI genau wie physikalische. Diese Werte führen bei allen grafischen Operationen inklusive Textrechteck<Ref>An {{Isyn|lang=cpp-qt|code=QPainter::drawText(....}} kann ein Rechteck zur Positionierung des Texts übergeben werden.</ref> zu befriedigenden Ergebnissen. {{Achtung}}Aber die Tabs in [[QTextOption (Qt)|QTextOption]] zur Positionierung von Tabulatoren bei QPainter::drawText verwenden weiterhin 96 DPI als logische Größe<ref>Scheint mir ein Bug, habe ich aber noch nicht gemeldet.</ref>.<br />
<br />
{{Qt-Tour|DLLs|Verschiedenes}}<br />
== Fußnoten ==<br />
<references /><br />
== Quellen ==<br />
*aus der Qt Reference Documentation 5.1 (ich weiß nicht, wie lange die Links gültig bleiben):<br />[http://qt-project.org/doc/qt-5.1/qtprintsupport/qtprintsupport-index.html Qt Print Support]</div>SysOpGerthttp://wiki.ggf-controls.de/index.php?title=Dialoge_(Qt)Dialoge (Qt)2017-03-27T17:36:28Z<p>SysOpGert: 1 Version: Neuinstallation</p>
<hr />
<div>[[Kategorie:C++]]<br />
== Tasterkombinationen ==<br />
Für Dialoge werden Standardkombinationen von Tastern mittels der Klasse [http://qt-project.org/doc/qt-5/qdialogbuttonbox.html QDialogButtonBox] zusammengefasst. Die einzelnen Taster haben verschieden Aufgaben (roles), zB. für den Klassiker OK und Cancel:<br />
*Cancel hat {{Isyn|lang=cpp-qt|code=QDialogButtonBox::RejectRole}}: Beenden des Dialogs, ruft [[SIGNAL → SLOT (Qt)|Slot]] {{Isyn|lang=cpp-qt|code=reject()}} auf, Rückgabewert für {{Isyn|lang=cpp-qt|code=exec()}} ist {{Isyn|lang=cpp-qt|code=QDialog::Rejected}} (0).<br />
*OK hat {{Isyn|lang=cpp-qt|code=QDialogButtonBox::AcceptRole}}: Beenden des Dialogs, ruft [[SIGNAL → SLOT (Qt)|Slot]] {{Isyn|lang=cpp-qt|code=accept()}} auf, Rückgabewert für {{Isyn|lang=cpp-qt|code=exec()}} ist {{Isyn|lang=cpp-qt|code=QDialog::accepted}} (1). Pushbutton mit dieser Role sind default-Pushbutton.<br />
Zumindest die vom Designer angebotene ButtonBox mit OK und Cancel zeigt ein eigensinniges Verhalten in der [[Widgets (Qt)#Tabulatorreihenfolge|Tabulatorreihenfolge]]. Egal wie sie gesetzt ist, nach dem Verlassen eines Widgets außerhalb der Tabulatorreihenfolge (focusPolicy == NoFocus) wird immer Cancel fokussiert.<br />
== Gebrauch ==<br />
Instanzen von QDialog abgeleiteter Klassen sollten immer mit {{Iqt|new}} erzeugt werden. Bei mir führt die zweite {{Tooltip|auf'm Stack|automatische}} Instanzierung zu einem kommentarlosem Programmende. Anscheinend werden irgendwelche virtuellen Methoden aufgerufen.<br />
== Meldungen ==<br />
[https://qt-project.org/doc/qt-5/qmessagebox.html QMessageBox] bietet eine einfache Möglichkeit einer Ausgabe über einen Dialog, zB. zum Debuggen.<br />
{{Bsyn|lang=cpp-qt|code=QMessageBox msgBox;<br />
msgBox.setText("Nachricht oder so");<br />
msgBox.exec();}}<br />
QMessageBox kann mit mehreren Default-Tasten wie OK, Cancel usw. ausgestattet werden.<br />
Und es gibt statische Funktionen mit Symbolen für Frage, Info, Warnung oder Alarm:<br />
<!-- Bsyn geht nicht wegen | --><br />
<syntaxhighlight lang='cpp-qt' class='box'><br />
QMessageBox::StandardButton ret = QMessageBox::information(0, "Fenstertitel", "Nachrichttext",<br />
QMessageBox::Ok | QMessageBox::Cancel,<br />
QMessageBox::Ok);<br />
</syntaxhighlight><br />
Rückgabewert ist die betätigte Taste.<br />
<br />
Wenn eine Taste betätigt wird, wird ein Signal {{Isyn|lang=cpp-qt|code=void buttonClicked ( QAbstractButton * button )}} gesendet. Das nützt einem erstmal noch nichts, aber mit {{Iqt|StandardButton standardButton ( QAbstractButton * button ) const}} kann man herausfinden, um welche Standardtaste es sich handelt.<br />
<br />Mit {{Iqt|QAbstractButton * button ( StandardButton which ) const}} erhält man den Zeiger auf die jeweilige Standardtaste.</div>SysOpGerthttp://wiki.ggf-controls.de/index.php?title=Tabellen_(Qt)Tabellen (Qt)2017-03-27T17:36:28Z<p>SysOpGert: 1 Version: Neuinstallation</p>
<hr />
<div>[[Kategorie:C++]]<br />
{{Qt-Tour|Text|Grafik}}<br />
== [http://doc.qt.io/qt-5/qtableview.html QTableView] ==<br />
ist die Basisklasse zur Darstellung von Tabellen. Die einzelnen Zellen enthalten die {{Tooltip|engl. items|Elemente}} des zugehörigen {{Tooltip|engl. model|Modells}} abgeleitet von [http://doc.qt.io/qt-5/qabstractitemmodel.html QAbstractItemModel].<br />
<br />
== [http://doc.qt.io/qt-5/qtablewidget.html QTableWidget] ==<br />
ist die Standardanwendung für Tabellen. Verwendet wird ein Modell aus Elementen des Typs [http://doc.qt.io/qt-5/qtablewidgetitem.html QTableWidgetItems], einfache Elemente aus Text und {{Tooltip|Symbol|Icon}}.<br />
=== Spaltenüberschriften ===<br />
{{Iqt|void QTableWidget::setHorizontalHeaderLabels(const QStringList & labels)}} setzt die Spaltenüberschriften auf die Texte in 'labels'. Da der Inhalt der Überschriften aber zum Modell gehört, muss erst ein Element eingefügt worden sein, um das Modell zu setzen.<br />
=== Tabulatorverhalten ===<br />
Die Eigenschaft {{Iqt|bool tabKeyNavigation}} steuert die Navigation mit der Tab- bzw. Backtab-Taste. Wenn {{Iqt|1=bool tabKeyNavigation == true}} wechselt Tab in die nächste Zelle<ref>Erst Spalte, dann Reihe.</ref> und fängt auch wieder bei Zelle 0,0 an. Ein Verlassen der Tabelle ist mit der Tab- / Backtab-Taste somit nicht möglich. {{Iqt|setTabKeyNavigation(false)}} schaltet dieses Verhalten ab, Tab wechselt ins nächste [[Widgets (Qt)|Widget]].<br />
== Fußnoten ==<br />
<references /></div>SysOpGerthttp://wiki.ggf-controls.de/index.php?title=DoxygenDoxygen2017-03-27T17:36:28Z<p>SysOpGert: 1 Version: Neuinstallation</p>
<hr />
<div>[[Kategorie:Tools]]<br />
Ein wundervolles Dokumentationswerkzeug von [http://www.stack.nl/~dimitri/doxygen/index.html Dimitri van Heesch]. Vielen Dank für diese Hilfe.<br />
== Installation ==<br />
=== Kubuntu <ref>getestet für 12.04</ref> ===<br />
Doxygen ist in den Ubuntu-Paketquellen vorhanden, aber es wird das Paket doxygen-latex empfohlen, und das ist riesig. Wenn man LaTex nicht benötigt, sollte man darauf verzichten. Leider werden von der Muon-Paketverwaltung<ref>Wahrscheinlich der Ubuntu-Paketverwaltung.</ref> auch empfohlen Pakete mit installiert. Ein Ausweg ist die Installation über die Konsole:<br />
{{Eingabe|sudo apt-get install --no-install-recommends doxygen}}<br />
Dagegen wird das Paket GraphViz mit dem Tool '''dot''' nicht mitinstalliert, welches Doxygen für die wundervollen Vererbungsgraphen nutzt. Sollte also zusätzlich installiert werden.<br />
<br />Verwendet wird '''dot''' erst, nachdem in der Konfigurationsdatei HAVE_DOT = YES gesetzt wird.<br />
<br />
== Gebrauch ==<br />
Aufruf von<br />
{{Eingabe|doxygen }}{{Platz|Konfigurationsdatei}}<br />
in der Kommandozeile erzeugt und verknüpft Dokumentation zu allen Dateien mit der in der {{Platz|Konfigurationsdatei}} angegebenen Endung. Wenn in der {{Platz|Konfigurationsdatei}} 'RECURSIVE = YES' gesetzt ist, werden auch die Unterordner durchsucht. Wenn {{Platz|Konfigurationsdatei}} weggelassen wird, wird eine Datei namens 'Doxyfile' verwendet.<br />
<br />
== Einstellungen ==<br />
{{Eingabe|doxygen -g}} erzeugt eine projekteigene Konfigurationsdatei namens Doxyfile, in der eine Menge "tags" stehen, mit denen Doxygen eingestellt werden kann. zB.<br />
* PROJECT_NAME = "{{Platz|Projektname}}": Die Überschrift aller Seiten.<br />
* JAVADOC_AUTOBRIEF = YES: Der 1. Satz (bis zum 1. Punkt, wenn ein . Teil der Kurzbeschreibung sein soll, muss man ihn mit nachfolgendem \ und Leerzeichen kennzeichnen) wird als Kurzbeschreibung verwendet und taucht ganz oben und in der Auflistung auf<ref >In Kommentaren im JavaDoc - Stil /** <Kommentar> */</ref>.<br />
* EXTRACT_ALL = YES: Auch nicht kommentierte Klassen werden in die Dokumentation aufgenommen. Das ist hilfreich, wenn auch Kommentar fehlt, so wird doch die Klassenhierarchie dargestellt.<br />
* EXTRACT_STATIC = YES: Auch statische Member werden dokumentiert.<br />
* RECURSIVE = YES: Dateien werden auch in Unterordnern gesucht.<br />
* HAVE_DOT = YES: Erzeugung von Graphen mittels '''dot''' (mehr und bessere Graphen).<br />
* HIDE_UNDOC_RELATIONS = NO: Nur dann werden auch die Klassen aus Bibliotheken in die Graphen mit aufgenommen. Sehr wichtig für Qt, wo fast alles von Klassen aus den Qt-Bibliotheken abgeleitet wird.<br />
=== Navigationsleiste ändern ===<br />
{{Eingabe|doxygen -l}} erzeugt eine projekteigene Layoutdatei namens DoxygenLayout.xml. Diese Datei wird beim Aufruf geladen<ref>Mit Tag 'LAYOUT_FILE' im Doxyfile kann die Layoutdatei ausgwählt werden, Vorgabe DoxygenLayout.xml.</ref>. Modifikationen dieser Datei ändern das Erscheinungsbild der Dokumentation.<br />
<br /><nowiki><tab>-Elemente</nowiki> im <nowiki><navindex>-Element</nowiki> in dieser Datei sind die Abschnitte der Navigationsleiste. Es können eigene Elemente mit Attribut 'user' hinzugefügt werden:<br />
{{Bsyn|lang="xml"|code=<tab type="user" url="Buchhaltung.zip" title="Download"/>}}<br />
== Kommentarformate ==<br />
Eine SEHR beschränkte Auswahl der Möglichkeiten entsprechend MEINER Präferenz! Andere mögen anderes vorziehen.<br />
*Javadoc Kommentare (über dem Objekt): /** {{Platz|Kommentar}} */<br />
<syntaxhighlight lang="cpp"><br />
/** Beschreibung zur Nummer */<br />
int number;<br />
</syntaxhighlight><br />
*Javadoc Kommentare hinter dem Objekt: ///< {{Platz|Kommentar}}<br />
<syntaxhighlight lang="cpp"><br />
int number; ///< Kurzbeschreibung zur Nummer<br />
</syntaxhighlight><br />
Kommentare können im Prinzip an jeder beliebigen Stelle stehen, dann muss mit einem [[#Spezielle Kommandos|Special Command]] die Zuordnung benannt werden.<br />
<br />Special Command [http://www.stack.nl/~dimitri/doxygen/commands.html#cmdfile \file] ist zB. die einzige Möglichkeit, eine Datei zu kommentieren.<br />
{{Bsyn|lang=cpp|code=/** \file datei.h<br />
*Kommentar....<br />
*/}}<br />
In die Projektseite ''index.html''<ref>Die Seite, die zuerst aufgerufen wird.</ref> wird mit [http://www.stack.nl/~dimitri/doxygen/commands.html#cmdmainpage \mainpage] Kommentar eingefügt.<br />
<br />
== Spezielle Kommandos ==<br />
beginnen mit einem \ oder @. Es gibt eine Unmenge von [http://www.stack.nl/~dimitri/doxygen/commands.html Special Commands], die das Aussehen der Dokumentation beeinflussen. Einige Beispiele:<br />
*[http://www.stack.nl/~dimitri/doxygen/commands.html#cmdparam \param] : Für die Parameter einer Funktion / Methode.<br />
*[http://www.stack.nl/~dimitri/doxygen/commands.html#cmdreturn \return] : Für den Rückgabewert einer Funktion / Methode.<br />
<syntaxhighlight lang="cpp"><br />
/** Kurzbeschreibung. Ausführliche Beschreibung.<br />
\param c a character.<br />
\param n an integer.<br />
\exception std::out_of_range parameter is out of range.<br />
\return a character pointer. */<br />
char* Funktion(char c, int n);<br />
</syntaxhighlight><br />
Spezielle Kommandos können Parameter haben, wobei unterschieden wird zwischen:<br />
* Einzelwörter: im [http://www.stack.nl/~dimitri/doxygen/manual/commands.html Doxygen Manual] mit <spitzen> Klammern gekennzeichnet.<br />
* Texte bis zum Ende der Zeile: Im [http://www.stack.nl/~dimitri/doxygen/manual/commands.html Manual] mit (runden) Klammern gekennzeichnet.<br />
* Paragraphen: Ein Paragraph reicht bis zur nächsten Leerzeile oder dem nächsten Kommando. Im [http://www.stack.nl/~dimitri/doxygen/manual/commands.html Manual] mit {geschweiften} Klammern gekennzeichnet.<br />
[Eckige] Klammern kennzeichnen optionale Parameter.<br />
=== Code-Teile übernehmen ===<br />
Oft ist es sinnvoll, in die Dokumentation {{Tooltip|Ausschnitte|Snippets}} aus dem eigentlichem Programm-Code zu übernehmen, als Beispiel oder um Hilfetexte nicht wiederholen zu müssen. Eine Möglichkeit ist<br />
*[http://www.stack.nl/~dimitri/doxygen/manual/commands.html#cmddontinclude \dontinclude {{Platz|file}}]: Setzt einen internen Zeiger auf den Anfang von {{Platz|file}}.<br />
in Verbindung mit<br />
*[http://www.stack.nl/~dimitri/doxygen/manual/commands.html#cmdskip \skip {{Platz|pattern}}]: Setzt in {{Platz|file}} den internen Zeiger auf die nächste Zeile mit {{Platz|pattern}}.<br />
*[http://www.stack.nl/~dimitri/doxygen/manual/commands.html#cmdskipline \skipline {{Platz|pattern}}]: Setzt in {{Platz|file}} den internen Zeiger auf die nächste Zeile mit {{Platz|pattern}} und fügt diese ein.<br />
*[http://www.stack.nl/~dimitri/doxygen/manual/commands.html#cmduntil \until {{Platz|pattern}}]: Fügt alle Zeilen aus {{Platz|file}} ab dem internen Zeiger bis zur Zeile mit {{Platz|pattern}} inklusive ein.<br />
*[http://www.stack.nl/~dimitri/doxygen/manual/commands.html#cmdline \line {{Platz|pattern}}]: Fügt die 1. nicht leere Zeile mit {{Platz|pattern}} hinter dem internen Zeiger ein.<br />
<br />
<syntaxhighlight lang="cpp"><br />
/** Klasse AccountAddChangeDialog: Kurzbeschreibung. Ausführliche Beschreibung.<br />
* Quellcode zur Klasse in Datei accountaddchangedialog.cpp öffnen:<br />
* \dontinclude accountaddchangedialog.cpp<br />
* Einbinden des Hilfetextes von 'cbAccounts':<br />
* \skip ui->cbAccounts->setWhatsThis(<br />
* \until )<br />
* Einbinden des Hilfetextes von 'checkDelete':<br />
* \skip ui->checkDelete->setWhatsThis(<br />
* \until )<br />
*/<br />
</syntaxhighlight><br />
fügt die Befehle zum Setzen der [[Anwendungshilfe (Qt)#QWhatsThis|WhatsThis]] inklusive der Texte in die Doku ein.<br />
<br />Damit das alles funktioniert, muss in der Konfigurationsdatei (zB. Doxyfile) der Beispielpfad gesetzt werden, geht auch mit '.' für den aktuellen Ordner:<br />
*EXAMPLE_PATH = /Pfad/zum/Ordner oder<br />
*EXAMPLE_PATH = .<br />
*EXAMPLE_RECURSIVE = YES<br />
<br />
=== Test ===<br />
Es ist sinnvoll, jede Methode zu testen, erscheint sie auch noch so simpel. Um eine Testbeschreibung einzufügen, wichtig für die Reproduzierbarkeit, gibt es das Kommando [http://www.stack.nl/~dimitri/doxygen/manual/commands.html#cmdtest \test]. Damit wird der nachfolgende [[#Spezielle Kommandos | Paragraph]] gekennzeichnet und eine Kopie in einer '''Test-Liste''' angelegt. '''Test-Liste''' ist über den Abschnitt '''Zusätzliche Informationen''' erreichbar.<br />
=== Bilder ===<br />
Mit [http://www.stack.nl/~dimitri/doxygen/manual/commands.html#cmdimage \image] können Bilder in die Dokumentation aufgenommen werden. Es muss das Ausgabeformat,<br />
zB. html und der Dateinamen benannt werden, eine Unterschrift und Größe ist optional:<br />
{{Bsyn|lang=xml|code=\image html bild.png}}<br />
Es können die Bildformate verwendet werden, die der Browser unterstützt.<br />
<br />Damit das alles funktioniert, muss in der Konfigurationsdatei (zB. Doxyfile) der Bilderpfad gesetzt werden:<br />
*IMAGE_PATH = /Pfad/zum/Ordner<br />
<br />
== Kommentarformatierung ==<br />
Es sind eine große Anzahl von [http://www.stack.nl/~dimitri/doxygen/manual/htmlcmds.html HTML-Tags] zulässig, zB. <nowiki><table> oder <H1></nowiki>.<br />
<br />Es können [http://www.stack.nl/~dimitri/doxygen/manual/lists.html Listen] mit HTML-Tags, den Special Commands [http://www.stack.nl/~dimitri/doxygen/commands.html#cmdli \li] oder [http://www.stack.nl/~dimitri/doxygen/commands.html#cmdarg \arg] oder mit -(Aufzählungszeichen) und -#(nummeriert) erzeugt werden<ref>Die in der [http://www.stack.nl/~dimitri/doxygen/manual/markdown.html#md_lists doxygen-Dokumentation unter Markdown-Support] beschriebenen Möglichkeiten +, *, 1. funktionieren bei mir (doxygen 1.7.6.1, Kubuntu 12:04) nicht</ref>. Bei -, -# gibt der Spalteneinzug die Aufzählungsebene an.<br />
<br />Wenn man für Doxygen reservierte Zeichen verwenden will, muss man sie mit \ maskieren.<br />
=== Automatische Link-Erzeugung ===<br />
Falls innerhalb einer Beschreibung Namen von Klassen und ihrer {{Tooltip|Mitglieder|Member}}, Funktionen, Typdefinition und Dateien verwendet werden, die in der Dokumentation vorkommen, werden automatisch Links auf deren Dokumentationsseiten erzeugt. Das funktioniert unter Linux<ref>Kubuntu 14.04, Doxygen 1.8.6</ref> problemlos, unter Windows<ref>Win7, Doxygen 1.8.11</ref> weigert sich Doxygen aber, {{Tooltip|Erweiterung .h|Header-Dateien}} zu verlinken. {{Tooltip|Umgehungslösung|Workaround}} ist das spezielle Kommandopaar [http://www.stack.nl/~dimitri/doxygen/manual/commands.html#cmdlink \link] - [http://www.stack.nl/~dimitri/doxygen/manual/commands.html#cmdendlink \endlink] um den Dateinamen. Dann wird auf die 1. Seite<ref>Ich habe noch keinen Weg gefunden, Dateien gleichen Namens, aber aus unterschiedlichen Ordnern, zu unterscheiden.</ref> verlinkt, die den Dateinamen enthält, bzw. die allererste Seite, wenn die Datei nicht dokumentiert ist.<br />
== Fußnoten ==<br />
<references /></div>SysOpGerthttp://wiki.ggf-controls.de/index.php?title=Subversion_(SVN)Subversion (SVN)2017-03-27T17:36:28Z<p>SysOpGert: 1 Version: Neuinstallation</p>
<hr />
<div>[[Kategorie:Tools]]<br />
Subversion ist ein Tool zur Versionsverwaltung und stellt sicher, dass mehrere Personen gleichzeitig und parallel an einem Projekt arbeiten können. Hauptaufgaben sind:<br />
*Jeder Stand eines Projektes wird archiviert, je nach Programm nur die Änderungen: Dadurch ist es jederzeit möglich, auf alte Versionen zurückzugreifen.<br />
*Koordinierung des gemeinsamen Zugriffs von mehreren Entwicklern auf die Dateien: Konflikte bei gleichzeitigem Speichern werden automatisch gelöst oder für manuelle Bearbeitung gemeldet.<br />
*Gleichzeitige Entwicklung mehrerer Entwicklungszweige (engl. Branches) eines Projektes: Die unterschiedlichen Zweige können wieder zusammengeführt werden.<br />
Subversion besteht aus einem Server, der die verschiedenen Versionen und Entwicklungszweige im {{Tooltip|Repository|Projektarchiv}} speichert und verwaltet, und Clients zur {{Tooltip|Checkout|Erstellung}}/{{Tooltip|Update|Erneuerung}} und {{Tooltip|Commit|Übergabe}} von Arbeitskopien.<br />
<br />
== Eigenschaften ==<br />
Automatische Übernahme der Eigenschaften wird erreicht, in dem in '''config''' {{Eingabe|1=enable-auto-props = yes}} eingetragen wird und im Abschnitt <nowiki>[auto-props]</nowiki> ausgewählt wird, welche Datei welche Eigenschaft übernimmt. Dann werden beim Hinzufügen (und nur dann) einer Datei zur Versionskontrolle die Eigenschaften übernommen.<br />
<br />'''config''' findet man unter:<br />
*Windows7: ...\Anwendungsdaten\Subversion\<br />
*Linux: /etc/subversion (global) oder ~/.subversion (nutzerspezifisch).<br />
Die Eigenschaften können nur in der Arbeitskopie geändert werden, eine Änderung fügt die Datei der {{Tooltip|Commit|Übergabe}}liste hinzu.<br />
=== Schlüsselwörter ===<br />
in einer Datei werden bei der Übergabe durch einen entsprechenden Text ersetzt. Mögliche Schlüsselwörter sind<br />
* $Author$<br />
* $Date$<br />
* $Revision$<br />
* $URL$<br />
* $Id$: eine verkürzte Zusammenfassung der obigen.<br />
Indem ein doppelter Doppelpunkt (::) nach dem Namen des Schlüsselwortes geschrieben wird, dem eine Anzahl von Leerzeichen folgt, definieren diese eine feste Breite. Falls der ersetzte Wert zu lang ist, wird er mit einem speziellen Nummernzeichen (#) unmittelbar vor dem letzten Dollarzeichen abgeschnitten<ref group="svnbook">[http://svnbook.red-bean.com/de/1.6/svn.advanced.props.special.keywords.html Subversion Book -> Ersetzung von Schlüsselwörtern]</ref>.<br />
<br />
Um für eine Datei unter Versionsverwaltung die Schlüsselwörter zu aktivieren, müssen in die Eigenschaft svn:keywords die gewünschten Schlüsselwörter eingetragen werden<ref name="EigenschaftOrdner" />. Wenn in svn:keywords die Schlüsselwörter fehlen, wird der Schlüsselwortinhalt gelöscht und damit doch die Datei verändert.<br />
<br />
== Globale Versionsnummer ==<br />
Die letzte (höchste) Versionsnummer aller Dateien einer Arbeitskopie kann mit dem Komandozeilen-Tool '''svnversion'''<ref>Hilfe: <code>svnversion -h</code></ref> abgefragt werden. Nur nach einem Update wird eine eindeutige Nummer ausgegeben, sonst ein Bereich aus aktualisierten und übertragenen Versionen (168:171).<ref name="inDatei" /><ref>[[Erstellen einer Anwendung (Qt)#Build automatisieren| Automatisieren mit Qt Creator]]</ref><br />
<br />
== Ein lokales Repository ==<br />
Es macht durchaus Sinn, auch auf einem Einzelplatzrechner ein {{Tooltip|Archiv|Repository}} anzulegen, zB. um ältere Stände leicht zu rekonstruieren, Änderungen erst mal in Parallelzweigen auszuprobieren oder für ein einfaches Backup.<br />
<br />Für dieses {{Tooltip|Archiv|Repository}} benötigen wir keine sichere Passwortabfrage, aber es soll der Autor der Änderung gespeichert werden, also kein anonymer Zugriff.<br />
<br />Aber wir benötigen einen Server. Bei '''TortoiseSVN''' ist dieser Server im Paket enthalten, unter Linux reicht uns '''svnserve''' aus dem Paket '''Subversion'''.<br />
=== svnserve ===<br />
'''svnserve''' muss manuell<ref>Es kann natürlich auch über die Startscripts gestartet werden, siehe [http://wiki.ubuntuusers.de/Subversion#svnserve Ubuntuusers]. Aber so häufig werden wir es nicht benutzen, das sich ein ständiger Daemon lohnt.</ref> im Terminal gestartet werden mit<br />
{{Bsyn|lang=bash|code=svnserve -d -r /Wurzelpfad/der/Repository/}}<br />
Voreinstellung ist, das Passwörter in KWallet<ref>bzw. gnome-keyring bei Ubuntu</ref> gespeichert werden. Das ist für ein lokales {{Tooltip|Archiv|Repository}} eher lästig (wer will schon ständig seinen Passwort-Save öffnen), deshalb erlauben wir das Speichern eines Klartext-Passworts mit <code>store-plaintext-passwords = yes</code> in /etc/subversion/servers oder ~/.subversion/servers.<br />
<br />
== Dateien unter Versionsverwaltung stellen ==<br />
# Ein leeres Repository erstellen.<br />
# Eine Arbeitskopie erstellen (checkout).<br />
# Dateien in die Arbeitskopie verschieben oder neu erstellen.<br />
# Dateien zum Repository hinzufügen (add).<br />
<br />
== Benutzung Kommandozeile ==<br />
=== Status ===<br />
{{Isyn|lang=bash|code=svn status}} gibt den aktuellen Status geänderter Dateien aus. Die Buchstaben der Ausgabe bedeuten:<br />
*'''?''' Die Datei, das Verzeichnis oder der symbolische Link item ist nicht unter Versionskontrolle.<br />
*'''A''' Die Datei, das Verzeichnis oder der symbolische Link item ist zum Hinzufügen in das Projektarchiv vorgemerkt.<br />
*'''C''' Die Datei item befindet sich in einem Konfliktzustand. D.h., Änderungen, die vom Server bei einer Aktualisierung empfangen wurden, überlappen sich mit lokalen Änderungen, die Sie in Ihrer Arbeitskopie haben (und konnten beim Aktualisieren nicht automatisch aufgelöst werden). Sie müssen den Konflikt auflösen, bevor Sie Ihre Änderungen in das Projektarchiv übergeben können.<br />
*'''D''' Die Datei, das Verzeichnis oder der symbolische Link item ist zum Löschen im Projektarchiv vorgemerkt.<br />
*'''M''' Der Inhalt der Datei ist geändert worden.<br />
=== Übergeben ===<br />
{{Isyn|lang=bash|code=svn commit -m "Kommentar"}} {{Tooltip|commits|übergibt}} die Änderungen an das {{Tooltip|Repository|Projektarchiv}}. Es muss mit der Option -m ein {{Tooltip|Kommentar zur Revision|Log-Eintrag}} mitgegeben werden, oder es wird Editor<ref>Unter Linux zB. '''nano'''.</ref> für die Eingabe geöffnet. Dann einfach in die 1. Zeile den Kommentar schreiben und speichern. In der temporären(?) Datei stehen auch der [[#Status|Status]] der zu übergebenden Dateien.<br />
<br />
== Benutzung TortoiseSVN (MS-Windows<ref>Windows7</ref>) ==<br />
'''Gilt nicht mehr ab Version 1.7.4:''' Enthält keine Komandozeilen-Tools, bei Bedarf muss ein zusätzliches Paket installiert werden, zB. [http://www.sliksvn.com Slik SVN].<br />
<br />
TortoiseSVN integriert SVN in die MS-Windows-Oberfläche. Im Datei-Explorer wird der Status der Dateien durch kleine Symbole angezeigt und das Kontextmenü enthält alle SVN-Befehle.<br />
=== Zugangsberechtigungen ===<br />
Unter Windows speichert der Subversion-Client Passwörter im Verzeichnis %APPDATA%/Subversion/auth/. Unter Windows 2000 und dessen Nachfolger verwendet der Subversion-Client die Standard-Kryptographiedienste von Windows, um das Passwort auf der Festplatte zu verschlüsseln. Da der Schlüssel durch Windows verwaltet wird und mit den benutzereigenen Zugangsdaten verknüpft ist, kann nur der Benutzer selbst das zwischengespeicherte Passwort entschlüsseln. (Beachten Sie, dass beim Zurücksetzen des Windows-Benutzerkonto-Passworts durch einen Administrator alle zwischengespeicherten Passwörter nicht mehr zu entschlüsseln sind. Der Subversion-Client verhält sich dann so, als wären sie nicht vorhanden und fragt die Passwörter gegebenenfalls ab.)<ref group="svnbook">[http://svnbook.red-bean.com/de/1.6/svn.serverconfig.netmodel.html#svn.serverconfig.netmodel.credcache Subversion Book]</ref><br />
=== Änderungen rückgängig machen ===<br />
# Alle nicht abgegebene Änderungen in der Arbeitskopie entfernen (zurück auf die letzte Version im Repository):<br />
#* Auf Datei mit rechter Maustaste -> TortoiseSVN -> Revert<br />
# Auf eine vorherige Version zurückgehen:<br />Die Datei wird auf den alten Inhalt zurückgeändert und als geändert markiert, dh. sie hat jetzt den neuesten Revisionsstand. Die Änderung kann mit [[Subversion (SVN)#Revert|<code>Revert</code>]] rückgängig gemacht werden.<br />
#* Auf Datei mit rechter Maustaste -> TortoiseSVN -> Show log<br />
#* Auf gewünschte Version mit rechter Maustaste -> Revert to this Revision -> Yes<br />
=== Alte Versionen ansehen ===<br />
# Eine vorherige Version laden:<br />Die Datei wird nicht als geändert gekennzeichnet und somit beim nächsten Update wieder überschrieben. Nur zum Ansehen, muss hinterher mit <code>Update</code> wieder auf aktuellen Stand gebracht werden. Änderungen nicht möglich. Besser ist <code>Save revision to ..</code>.<br />
#* Auf gewünschte Version mit rechter Maustaste -> Update to Revision -> Version eingeben<br />
# Eine vorherige Version speichern:<br />
#* Auf Datei mit rechter Maustaste -> TortoiseSVN -> Show log<br />
#* Auf gewünschte Version mit rechter Maustaste -> Save revision to ..<br />
<br />
== Benutzung kdesvn (Linux<ref>Kubuntu 12:04</ref>) ==<br />
Als Client und Bedieneroberfläche benutzen wir '''kdesvn''' aus dem gleichnamigen Paket.<br />
=== Repository anlegen: ===<br />
{{Menüaktion|Datei -> Subversion-Admin -> Erstelle und öffne ein neues Repository}}.<br />
<br />Dieses noch leere {{Tooltip|Archiv|Repository}} checken wir dann in unsere Arbeitskopie aus und fügen die gewünschten Dateien hinzu.<br />
*Im Dateimanager: Im Arbeitkopieordner mit rechtem Mausklick -> Checkout (kdesvn)<br />
*In '''kdesvn''': Entweder Werkzeugleistensymbol '''Auschecken''' oder besser mit '''Subversion->Repository->Checke aktuellen Repository-Pfad''' im Menü.<br />Es öffnet sich immer ein Fenster. Zu beachten ist, das in dem Feld URL die Adresse mit '''ksvn+file:''' beginnt, sonst gibt es die Fehlermeldung '... ist kein Repository'. Bei der Menüvariante wird dies automatisch gesetzt, auch der ausgewählte Zweig (zB. trunk), bei 'Dateiauswahl' nicht. Trunk kann dann manuell an die URL angehängt werden, um nur den Hauptpfad auszuchecken.<br />Wenn die Checkbox mit dem eigenartigem Text "Füge Quell-URL an das Unterverzeichnis an" gesetzt ist (Default-Einstellung), wird der ausgewählte Zweig an den Ordnernamen der Arbeitskopie angehängt. Ich will das eher nicht, wenn ich 'trunk' auschecke, also Häkchen entfernen.<br />
<br />Voreinstellung für ein neues {{Tooltip|Archiv|Repository}} in {{Platz|/Pfad/zu/Repository}}/conf/svnserv.conf ist: anonyme Nutzer können lesen (<code>anon_access = read</code>), authorisierte Lesen und Schreiben (<code>auth_access = write</code>). Das soll auch so bleiben, wenn wir anonymen Nutzern Schreibzugriff gewähren, wird kein Autor eingetragen. Aber wir müssen eine Passwort-Datei festlegen mit <code>password-db = passwd</code> und in der Passwort-Datei (hier {{Platz|/Pfad/zu/Repository}}/conf/passwd) müssen wir einen Nutzer mit seinem Passwort eintragen mit <code>{{Platz|user}} = {{Platz|pass}}</code>. In svnserv.conf tragen wir auch noch einen {{Tooltip|Bereich(?)|realm}} ein: <code>realm = {{Platz|zB. Programmtitel}}</code>.<br />
<br />
== Benutzung Qt Creator (Linux<ref>Wahrscheinlich auch unter Windows, aber nicht getestet.</ref>) ==<br />
Wenn der Projektordner eine Arbeitsplatzkopie eines Repository ist, bietet der Qt Creator unter {{Menüaktion|Extras -> Subversion}} die gängigsten Befehle. Voraussetzung ist natürlich, dass Subversion installiert ist und das unter {{Menüaktion|Extras -> Einstellungen -> Versionskontrolle -> Subversion}} der richtige Befehl 'svn', unter Umständen mit vollständigem Pfad, eingetragen ist.<br />
Am besten den Ordner ohne Dateien auschecken und dann das Projekt in diesem Ordner anlegen. Es kann auch nachträglich der Projektordner zur Arbeitskopie gemacht werden, Extras->Subversion wird aber anscheinend erst nach Neustart sichtbar. <br />
== Fußnoten ==<br />
<references><br />
<ref name="inDatei">Versionsnummer in eine Datei schreiben: {{Isyn|lang=bash|code=svnversion > Dateiname}} oder anhängen: {{Isyn|lang=bash|code=svnversion >> Dateiname}}</ref><br />
<ref name="EigenschaftOrdner">Es können für alle Dateien in einem Ordner die Eigenschaft geändert werden. Dazu muß im Kontextmenü des Ordners Eigenschaften->Subversion->Properties ausgewählt werden. Im Eigenschaften-Editor (geöffnet nach "new" oder "edit") muß dann "... recursively" angekreuzt werden.</ref><br />
</references><br />
== Qellen ==<br />
*TortoiseSVN<br />
<references group="Tortoise" /><br />
*Version Control with Subversion<br />
<references group="svnbook" /></div>SysOpGerthttp://wiki.ggf-controls.de/index.php?title=Text_Eingeben_(MediaWiki)Text Eingeben (MediaWiki)2017-03-27T17:36:28Z<p>SysOpGert: 1 Version: Neuinstallation</p>
<hr />
<div>== Sonderzeichen ==<br />
Alle Zeichen sind in Unicode. Deshalb kann man auch beliebige Sonderzeichen (griechisch, thailändisch, mathematisch, graphisch usw.) eingeben, entweder in dem man sie kopiert, zB. von dieser [https://de.wikipedia.org/wiki/Hilfe:Sonderzeichen Wikipedia-Hilfe] oder dieser [http://www.utf8-zeichentabelle.de Unicode-Tabelle]. Man kann auch die Unicode-Nummer dezimal mit '''&#{{Platz|nnn}};''' oder hex mit '''&#x{{Platz|nnn}};''' eingeben, falls man kein Beispiel hat.<br />
==Textformatierungen==<br />
Eine kurze Beschreibung befindet sich im der [http://meta.wikimedia.org/wiki/Help:Wikitext_examples/de Wikimediahilfe].<br />
==Rechtschreibprüfung==<br />
MediaWiki beinhaltet keine eigene Rechtschreibprüfung, aber es wird die Rechtschreibprüfung im Browser verwendet.<br />
===Firefox===<br />
Wenn man mit der rechten Maustaste in das Textfeld klickt, befindet sich im Kontextmenü das Untermenü ''Sprachen''. Dort kann man seine Sprache auswählen oder ein weiteres Wörterbuch hinzufügen<ref group='FF'>[http://support.mozilla.org/de/kb/Rechtschreibpruefung-nutzen?redirectlocale=de&redirectslug=Rechtschreibpr%C3%BCfung+nutzen Rechtschreibprüfung]</ref>.<br />
== Tooltip ==<br />
Ein {{Tooltip|Ein erklärender Text, der erscheint, wenn man mit der Maus auf das Element zeigt.|Tooltip}} wird erreicht, wenn man dem Element einen Titel zuordnet. Ein Beispiel:<br />
{{Bsyn|lang=html4strict|code=<span title='Erklärung'>Begriff</span>}}<br />
Alternativ kann in diesem Wiki die [[Vorlage:Tooltip|Vorlage Tooltip]] eingesetzt werden, welches außerdem eine gepunktete Unterstreichung hinzufügt.<br />
<br />
== Fußnoten, Quellen ==<br />
Fußnoten (zB. Zitate) werden mit der Erweiterung [http://www.mediawiki.org/wiki/Extension:Cite/Cite.php Cite] gekennzeichtet. An die gewünschte Stelle wird mit dem Tag <nowiki><ref></nowiki>{{Platz|Fußnote}}<nowiki></ref></nowiki> die Fußnote angegeben (zB <nowiki><ref></nowiki>{{Platz|[http://www.quelle.de Quelle]}}<nowiki></ref></nowiki>. Dort wird dann eine Fußnotennummer stehen und an der Stelle des Tags <nowiki><references /></nowiki> wird als Link der Fußnotentext stehen.<br />
<br />
Fußnoten können gruppiert werden: (<nowiki><ref group="</nowiki>{{Platz|Gruppe}}<nowiki>"></nowiki>), auch wenn nur ein Dokument zitiert wird. Da der Gruppenname in dem Fußnotenzeichen erscheint, sollte eine handliche, aber sinnvolle Abkürzung gewählt werden. <br />
Fußnotentexte können zur Übersichtlichkeit auch zwischen <nowiki><references> und </references> angelegt werden. Dann erhält die Fußnote mit <ref name="</nowiki>{{Platz|Fname}}<nowiki>"> einen Namen, der Text wird mit <ref name="</nowiki>{{Platz|Fname}}<nowiki>"></nowiki> gekennzeichnet.<br />
<br />
Auch wenn man mit mehreren Referenzen auf die gleiche Fußnote zeigen will, muss man der Fußnote mit <nowiki><ref name="</nowiki>{{Platz|Fname}}<nowiki>"></nowiki> einen Namen geben. Verwendet wird der Text unter dem 1. Auftreten, die weiteren Referenzen können leer sein (<nowiki><ref name="</nowiki>{{Platz|Fname}}<nowiki>" /></nowiki>).<br />
<br />
Beispiel: [[Qt (C++)]]<br />
<br />
[[Kategorie:Wiki]]<br />
<br />
==Quellen==<br />
Aus [http://support.mozilla.org/de/home Mozilla-Hilfe]:<br />
<references group='FF' /><br />
[[Kategorie:Wiki]]</div>SysOpGerthttp://wiki.ggf-controls.de/index.php?title=Text_(Qt)Text (Qt)2017-03-27T17:36:27Z<p>SysOpGert: 1 Version: Neuinstallation</p>
<hr />
<div>{{Qt-Tour|Datum- und Zeiteingabe|Listen}}<br />
<br />
== Übersetzungen ==<br />
Qt bietet eine recht einfache Möglichkeit, Programme durch Übersetzung aller Ausgaben zu internationalisieren<ref group='QtR'>[http://qt-project.org/doc/qt-5/i18n-source-translation.html Writing Source Code for Translation]</ref>.<br />
*Die Verwendung von [[#QString Class|QString]] für alle Ausgaben garantiert [http://www.unicode.org/standard/standard.html Unicode] und damit alle Sprachen.<br />
*{{Iqt|1=static QString QObject::tr(const char * sourceText, const char * disambiguation = 0, int n = -1)}} gibt einen übersetzten Text zurück<ref>Um '''tr''' in einer Methode einer nicht von '''QObject''' abgeleiteten Klasse zu verwenden, muss die Klasse von '''tr''' explicit angegeben werden:<br />
{{Bsyn|lang=cpp-qt|code=class myClass { // Nicht von QOject abgeleitet.<br />
void myFunc() {<br />
QMessageBox* msgBox = new QMessageBox(p);<br />
msgBox->setWindowTitle(QMessageBox::tr("Buchhaltung")); // QMessageBox abgeleitet von QObject.<br />
.<br />
.<br />
}<br />
}<br />
}}. Man könnte auch '''QObject''' direkt verwenden {{Iqt|QObject::tr("Buchhaltung")}}, aber vielleicht liegt noch eine überlagerte Methode zur Optimierung dazwischen, also immer die Klasse, die der Verwendung am nächsten kommt.</ref>. Außerdem markiert '''tr''' den Text für das Übersetzungstool [http://qt-project.org/doc/qt-5/qtlinguist-index.html Qt Linguist].<br />
<br />
== [https://qt-project.org/doc/qt-5/qchar.html QChar Class] ==<br />
Ein QChar ist ein 16 Bit [http://www.unicode.org/standard/standard.html Unicode]-Zeichen (UTF-16)<br />
<br />
== [https://qt-project.org/doc/qt-5/qstring.html QString Class] ==<br />
Ein QString repräsentiert eine Zeichenkette aus [http://www.unicode.org/standard/standard.html Unicode]-Buchstaben. Jedes Zeichen ist ein QChar mit 16 Bit.<br />
=== QString arg(...) ===<br />
{{Isyn|lang=cpp-qt|code=QString QString::arg(double a, int fieldWidth = 0, char format = 'g', int precision = -1, QChar fillChar = QLatin1Char( ' ' )) const}} bietet eine einfache Möglichkeit, Werte in einen String einzubauen: {{Bsyn|lang=cpp-qt|code=double v1 = 123.456, v2 = 45.67;<br />
qDebug() << tr("Double %2 wird im C-Stil und double %L1 im ortsüblichen Format ausgegeben").arg(v1).arg(v2);<br />
// Double 45.67 wird im C-Stil und double 123,456 im ortsüblichen Format ausgegeben}}<br />
Der Vorteil von '''arg''' liegt in der Übersetzbarkeit, es ist garantiert, dass %1 immer das 1. arg ist usw., auch wenn eine vernünftige Übersetzung eine andere Anordnung im Text erzwingt. %Ln verwendet die lokale Schreibweise (zB. in Deutschland Komma statt Punkt), %n den C-Standart.<br />
{{Achtung}}'''arg''' verwendet die [http://www.cplusplus.com/reference/cstdio/printf/ printf-Syntax], die Vorgabe begrenzt die Ausgabe auf 6 Ziffern, egal wie groß der Wert ist. Für größere Werte muss {{Platz|precision}} angepasst werden. Im Format 'g' oder 'G' bestimmt precision die Anzahl aller Ziffern, in 'e', 'E' und 'f' nur die Anzahl hinter dem Komma.<br />
=== QString toDouble() ===<br />
Die Umkehrung von einer Zeichenkette in eine Fließkommazahl ist leider nicht so einfach: {{Iqt|1=double QString::toDouble(bool * ok = 0) const}} verwendet immer die {{Tooltip|C-Stil: Punkt als Dezimaltrenner|C-Locale}}. {{Tooltip|zB. mit Komma in Deutschland|Lokale Ziffernfolgen}} müssen mit {{Iqt|1=double QLocale::toDouble(const QString & s, bool * ok = 0) const}} umgewandelt werden. Außerdem scheitern beide Methoden, sobald andere Zeichen außer Ziffern, +, - oder Dezimaltrenner auftauchen. Ein Lösungsbeispiel für Geldbeträge:{{Bsyn|lang=cpp-qt|code=double value(123.455555);<br />
QString wert(tr("%L1 %2").arg(value, 0, 'f', 2).arg(QLocale().currencySymbol())); // In Deutschland: 123,46 €<br />
double sameValue(QLocale().toDouble(wert.remove(QLocale().currencySymbol())); // In Deutschland sameValue == 123.46, in USA sameValue == 0 (Umwandlung gescheitert, ok == false)}}<br />
=== QString section(...) ===<br />
Mit einem beliebigen Separator-Zeichen kann ein QString in Sektionen eingeteilt werden. Sektion 0 ist das 1. Feld vor dem 1. Separator. Wenn {{Iqt|1=SectionFlags flags = SectionSkipEmpty}}, dann wird dieses Feld nicht mitgezählt, wenn der String mit dem Separator beginnt.<br />
{{Iqt|1=QString QString::section(QChar sep, int start, int end = -1, SectionFlags flags = SectionDefault) const}} gibt die ausgewählte Sektion zurück.<br />
<br />
== [https://qt-project.org/doc/qt-5/QByteArray.html QByteArray Class] ==<br />
QByteArray ist eine Optimierung für [[Literale (C++)#Zeichenliterale|C-Strings]], auch zur Aufnahme von [[Objekte und ihr Speicherplatz (C++)#Basistypen|{{Iqt|char}}]] geeignet.<br />
QByteArray stellt sicher, dass wie bei [[Literale (C++)#Zeichenliterale|C-Strings]] immer eine \0 am Ende steht. {{Iqt|QByteArray::size()}} zählt diese \0 nicht mit. Auch ist ein {{Iqt|QByteArray::at(int i)}} auf diese \0 nicht zulässig, im Debug-Modus wird eine [[ASSERT (Qt)|ASSERT]] ausgegeben und das Programm beendet. {{Iqt|QByteArray::operator[](int i)}} hingegen ist unkritisch, da es das Array vergrößert.<br />
=== [https://qt-project.org/doc/qt-5/qbytearray.html#qChecksum CRC-16 Checksumme] ===<br />
{{Iqt|quint16 qChecksum(const char * data, uint len)}}<br />
<br />
== Eine Liste von Strings ==<br />
Ein [https://qt-project.org/doc/qt-5/QListView.html QListView] soll als Anzeigefeld für Strings dienen. QListView ist eine [[Grafik (Qt)#Model-View|'''view''']] des [https://qt-project.org/doc/qt-5/model-view-programming.html Model View Frameworks]. Somit benötigen wir noch ein passendes Modell für die Anzeige, in diesem Fall [https://qt-project.org/doc/qt-5/qstringlistmodel.html QStringListModel]. Beispiel:<br />
<syntaxhighlight lang="cpp-qt"><br />
QListView *sicht = new QlistView(this); // this als Zeiger auf das Elternelement.<br />
QStringListModel *model = new QStringListModel;<br />
QStringList liste;<br />
<br />
sicht->setModel(model);<br />
liste.append("Text 1"); liste.append("Text 2"); ....<br />
model->setStringList(liste);<br />
</syntaxhighlight><br />
<br />
== Quellen ==<br />
*aus der Qt-5 Reference Documentation<br />
<references group='QtR' /><br />
== Fußnoten ==<br />
<references /><br />
[[Kategorie:C++]]</div>SysOpGerthttp://wiki.ggf-controls.de/index.php?title=DLLs_(Qt)DLLs (Qt)2017-03-27T17:36:27Z<p>SysOpGert: 1 Version: Neuinstallation</p>
<hr />
<div>== Erstellen einer DLL ==<br />
=== mit Qt Creator ===<br />
Datei->Neu... → Vorlage:Anderes Projekt → C++-Bibliothek → Auswählen... →<br />
<br />Typ: Dynamisch gebunden, Name: {{Platz|DLL-Name}}, Erzeugen in: {{Platz|Projektordner}} → Weiter →<br />
<br />Ankreuzen Desktop<ref name=ziel /> → Weiter<br />
<br />Ankreuzen QtCore<ref>Voreinstellung, weitere Module bei Bedarf, nicht ausprobiert.</ref> → Weiter → <br />
<br />Eingeben der 1. Klasse des Projektes → Klassenname: {{Platz|MeineKlasse}} → Weiter → <br />
<br />Abschließen<br />
<br />
Es wird Grundstock für eine DLL angelegt mit den Dateien {{Platz|DLL-Name}}.pro, {{Platz|MeineKlasse}}.cpp, {{Platz|MeineKlasse}}.h und {{Platz|MeineKlasse}}_global.h.<br />
=== Öffentliche Symbole der DLL<ref group="QtR">[http://doc.qt.digia.com/4.7/sharedlibrary.html Creating shared Libraries]</ref> ===<br />
müssen in der DLL mit Q_DECL_EXPORT und bei der Verwendung mit Q_DECL_IMPORT<ref>Zumindest mit QLibrary scheint kein Q_DECL_IMPORT notwendig zu sein.</ref> gekennzeichnet werden.<br />
Am einfachsten geht das mit einer Präprozessorverzweigung:{{Bsyn|lang=cpp-qt|code=#if defined(MYDLL_LIBRARY)<br />
# define MYDLL_SHARED_EXPORT Q_DECL_EXPORT<br />
#else<br />
# define MYDLL_SHARED_EXPORT Q_DECL_IMPORT<br />
#endif}}<br />
Jedes öffentliche Symbol im DLL-Source wird dann mit {{Platz|MYDLL_SHARED_EXPORT}} gekennzeichnet.<br />
Wenn dann im Projektfile der DLL {{Isyn|lang=cpp-qt|code=DEFINES += MYDLL_LIBRARY}} hinzufügt, wird jedes öffentliche Symbol mit Q_DECL_EXPORT gekennzeichnet.<br />
== Einbinden mit QLibrary<ref group="QtR">[http://doc.qt.nokia.com/4.7/qlibrary.html QLibrary Class Reference]</ref> ==<br />
QLibrary importiert C-Objekte, die Funktionen müssen<ref>bei Verwendung eines C++-Compilers wie MinGW</ref> in der DLL mit {{Isyn|lang=cpp-qt|code=extern "C"}} [[Definitionen / Deklarationen (C++)|deklariert]] werden.<br />
<br />
Wenn die DLL mit QtCreator (oder MinGW ?) erzeugt wird, wird für Funktionen mit [[Aufrufkonventionen der x86-Architektur (C++)|_stdcall]]<ref>um mit Visual-C++ kompatibel zu sein</ref> in der DLL an den Funktionsnamen ein @n angefügt, wobei n anscheinend der Anzahl der Bytes der Parameter entspricht, mindestens 4 pro Parameter<ref>Der Name steht als Klartext in der DLL, man kann ihn mit einem Texteditor finden und überprüfen</ref>. Beispiel:<br />
{{Bsyn|lang=cpp-qt|code=extern "C" MYDLL_SHARED_EXPORT void _stdcall Out32(short adr, short data);}}<br />
<br />
ist von der Applikation unter Funktionsname {{Isyn|lang=cpp-qt|code="Out32@8"}} erreichbar:<br />
{{Bsyn|lang="cpp-qt"|code={<br />
typedef void _stdcall (*ParOutType)(short adr, short data);<br />
ParOutType ParOut;<br />
QLibrary parLib("Lib.dll");<br />
if (!parLib.load()) { qDebug() << "Lib not loaded"; }<br />
else ParOut = (ParOutType)parLib.resolve("Out32@8");<br />
}<br />
}}<br />
<br />
== Fußnoten ==<br />
<references><br />
<ref name=ziel>Unter {{Eingabe|Details}} kann ein Ordner für die DLL, jeweils debug und release, angegeben werden. {{Eingabe|ShadowBuild}} führt zu einem eigenem Pfad für die Zieldateien (zB. die DLLs), falls nicht angekreuzt, werden alle Dateien in den Projektordner (mit den Quelldateien) geschrieben. Die Vorgabe legt für Debug und Release unterschiedliche Pfade an, dies ist nicht notwendig, da in jeden Zielpfad Ordner "debug" und "release" angelegt werden.<br />
</references><br />
== Quellen ==<br />
*aus der Qt Reference Documentation 4.7<br />
<references group="QtR" /><br />
[[Kategorie:C++]]</div>SysOpGerthttp://wiki.ggf-controls.de/index.php?title=Zahleneingaben_(Qt)Zahleneingaben (Qt)2017-03-27T17:36:27Z<p>SysOpGert: 1 Version: Neuinstallation</p>
<hr />
<div>{{Qt-Tour|Taster|Datum- und Zeiteingabe}}<br />
== Grenzen und Sprungweiten ==<br />
Zu einer Spinbox gehören 2 kleine Pfeilschaltflächen zur Änderung des Wertes. Gleiches gilt für die &uarr;/&darr;-Pfeiltasten und den Bild&uarr;/Bild&darr;- Tasten.<br />
<br>Die Sprungweite für einfache Pfeiltasten / -schaltflächen werden mit {{Iqt|void QSpinBox::setSingleStep(int val)}} bzw. {{Iqt|void QDoubleSpinBox::setSingleStep(double val)}} geändert, Vorgabe 1 bzw 1.0. Die Bildtasten führen den 10-fachen Einfachsprung aus. Wenn man das nicht will, muss man sie im [[Events (Qt)|EventHandler]] abfangen.<br />
<br>Durch die Grenzen {{Iqt|void QSpinBox::setRange(int minimum, int maximum)}} bzw. {{Iqt|void QDoubleSpinBox::setRange(double minimum, double maximum)}} wird die Eingabe per Tastatur, Pfeiltasten oder -schaltflächen auf diesen Bereich eingeschränkt. Die Methode {{Iqt|void QAbstractSpinBox::stepBy(int steps)}} dagegen erweitert die Grenzen bei Bedarf.<br />
== Signale ==<br />
Signal <code>editingFinished()</code> wird gesendet, wenn Return/Enter gedrückt wird <b>UND</b> wenn der Focus verloren wird<ref name="auch" />.<br />
== Fußnoten ==<br />
<references><br />
<ref name="auch">Gilt auch für QLineEdit und QComboBox.<br />
</references><br />
== Quellen ==<br />
*aus der Qt5 Reference Documentation (ich weiß nicht, wie lange die Links gültig bleiben):<br />
[https://doc.qt.io/qt-5/qabstractspinbox.html QAbstractSpinBox Class Reference]<br />
[[Kategorie:C++]]</div>SysOpGerthttp://wiki.ggf-controls.de/index.php?title=MS-Windows_(C%2B%2B)MS-Windows (C++)2017-03-27T17:36:27Z<p>SysOpGert: 1 Version: Neuinstallation</p>
<hr />
<div><h4>Grundsätzliches:</h4><br />
<p>Ein Programm ist mit min. einem Fenster verbunden. Der Rahmen und die darin befindlichen Kontrollelemente werden von Windows verwaltet.Windows sendet an das Programm Nachrichten über Bedieneraktionen in diesem Fenster wie zB. die Auswahl eines Menüpunktes. Es sind auch eigene Nachrichten zulässig. Die Nachrichten werden in der Hauptprogrammschleife mit <code>[[#GetMessage | GetMessage(...)]]</code> gelesen, Tastatureingaben werden mit <code class="name">[[#MsgLoop | TranslateMessage]](&amp;msg)</code> umgesetzt und dann mit <code class="name">[[#MsgLoop | DispatchMessage]](&amp;msg)</code> an die CALLBACK-Funktion des Fensters gesandt. Die CALLBACK-Funktion ist das eigentliche Programm und bearbeitet die Nachrichten. Sie kann auch weitere Fenster öffnen, zB. Dialoge. Diese haben dann wiederum eine CALLBACK-Funktion zur Bearbeitung ihrer Nachrichten.</p><br />
<p>Das Aussehen des Fensters wird in der Resourcen-Datei vom Typ .rc festgelegt. Leider beinhaltet die Express Version keinen grafischen Resourceneditor für Win32 Resourcen mehr. Die Datei ist aber eine reine Textdatei, man kann sie mit einem Texteditor bearbeiten. Weitaus komfortabler ist aber die Verwendung eines externen Resourcen-Editors. Als Schnittstelle zwischen Resource und Code dient der Header resource.h, in dem die IDs als Integer-Konstanten definiert sind.</p><br />
<p>Eine Beschreibung befindet sich im Microsoft Developer Network MSDN unter [http://msdn.microsoft.com/en-us/library/aa383749%28v=vs.85%29.aspx Windows API Reference]. Die hier erwähnten Funktionen und Strukturen sind mit Links auf die jeweiligen Artikel im MSDN unterlagert.</p><br />
<h4>Erstellen eines neuen Win32 Projektes:</h4><br />
<p>Datei<span id="menupfad">→</span>Neu<span id="menupfad">→</span>Projekt</p><br />
<p>Win32-Projekt<span id="menupfad">→</span>{{Eingabe|Projektname eingeben}}<span id="menupfad">→</span>Neue Projektmappe erstellen<span id="menupfad">→</span>OK<span id="menupfad">→</span>Fertig stellen</p><br />
<p>Es wird eine Projekt mit allen Dateien für ein lauffähiges minimales Fenster erstellt. Dieses Programm kann erzeugt und ausgeführt werden, zB. mit {{Eingabe|Strg+F5}}</p><br />
<h4>Das Hauptfenster:</h4><br />
<h5>Das Hauptprogramm</h5><br />
<p>heißt jetzt nicht mehr {{Isyn|lang=cpp|code=int main(...)}}, sondern<br />
{{Bsyn|lang=cpp|code=int APIENTRY _tWinMain(<br />
HINSTANCE hInstance, // <dfn title="Handgriff">handle</dfn> für das Programm. Wird vom Betriebssystem vergeben und benutzt.<br />
HINSTANCE hPrevInstance, // Immer 0.<br />
LPTSTR lpCmdLine, // Enthält die Komandozeilenargumente an das Programm.<br />
int nCmdShow); // Teilt mit, ob das Fenster minimiert, maximiert oder normal geöffnet wird.<br />
}}<br />
<br />liest die Titelzeile des Fensters <code class="name">szTitle</code> und den Namen der Fensterklasse <code class="name">szWindowClass</code> aus der Resourcendatei,<br />
<br />registriert und initialisiert des Fenster,<br />
<br />und läuft dann in die <a name="MsgLoop">Hauptnachrichtenschleife]]<pre class="example"><code> while (GetMessage(&amp;msg, NULL, 0, 0)) { <span class="comment">// Nachricht WM_DESTROY führt zu Returnwert 0 <span id="menupfad">→</span> Ende der Schleife.</span><br />
if (!TranslateAccelerator(msg.hwnd, hAccelTable, &amp;msg)) {<br />
TranslateMessage(&amp;msg); <span class="comment">// wandelt Tatatureingaben in "character messages".</span><br />
DispatchMessage(&amp;msg); <span class="comment">// sendet die Nachrichten an die CALLBACK Funktion des Fensters.</span><br />
}<br />
}</code></pre><pre><code class="name">BOOL WINAPI [http://msdn.microsoft.com/en-us/library/ms644936%28v=vs.85%29.aspx" name="GetMessage">GetMessage](<br />
<table><br />
<tr><td> LPMSG lpMsg,</td></tr><br />
<tr><td> HWND hWnd,</td></tr><br />
<tr><td> UINT wMsgFilterMin,</td></tr><br />
<tr><td> UINT wMsgFilterMax</td></tr></table>);</code></pre> gibt 0 zurück, wenn in der CALLBACK-Funktion <code class="name">VOID WINAPI [http://msdn.microsoft.com/en-us/library/ms644945%28v=vs.85%29.aspx" name="PostQuitMessage">PostQuitMessage](<span class="type">int</span> nExitCode<br />
)</code> aufgerufen wird, üblicherweise als Reaktion auf die Nachricht <code class="name">WM_DESTROY</code> , ausgelöst durch Schließen des Fensters.</p><br />
<h5>Das Fenster registrieren und initialisieren:</h5><br />
<p>Das Fenster wird über die Mitglieder der Struktur <pre><code>struct [http://msdn.microsoft.com/en-us/library/ms633577%28v=vs.85%29.aspx WNDCLASSEX] {<br />
<table><br />
<tr><td class="proto"> UINT cbSize;</td></tr><br />
<tr><td class="proto"> UINT style;</td></tr><br />
<tr><td class="proto"> WNDPROC lpfnWndProc;</td></tr><br />
<tr><td class="proto"> <span class="type">int</span> cbClsExtra;</td></tr><br />
<tr><td class="proto"> <span class="type">int</span> cbWndExtra;</td></tr><br />
<tr><td class="proto"> HINSTANCE hInstance;</td></tr><br />
<tr><td class="proto"> HICON hIcon;</td></tr><br />
<tr><td class="proto"> HCURSOR hCursor;</td></tr><br />
<tr><td class="proto"> HBRUSH hbrBackground;</td></tr><br />
<tr><td class="proto"> LPCTSTR lpszMenuName;</td></tr><br />
<tr><td class="proto"> LPCTSTR lpszClassName;</td></tr><br />
<tr><td class="proto"> HICON hIconSm;</td></tr></table>};</code></pre> definiert und anschließend mit <code class="name">RegisterClassEx(const WNDCLASSEX*)</code> für die Erzeugung des Fensters mit <code class="name">CreateWindow(...)</code> angemeldet.<br />
<br />Anschließend wird das Fenster mit<br />
<pre><code >HWND WINAPI [http://msdn.microsoft.com/en-us/library/ms632679%28v=vs.85%29.aspx CreateWindow](<br />
<table border="0"><br />
<tr><td class="proto"> LPCTSTR lpClassName, </td><td class="comment">// Name der Fensterklasse, wie er bei der Registrierung des Fensters benutzt wurde.</td></tr><br />
<tr><td class="proto"> LPCTSTR lpWindowName, </td><td class="comment">//</td></tr><br />
<tr><td class="proto"> DWORD dwStyle,</td></tr><br />
<tr><td class="proto"> <span class="type">int</span> x, </td><td class="comment">// Horizontale Position des Fensters.</td></tr><br />
<tr><td class="proto"> <span class="type">int</span> y,</td></tr><br />
<tr><td class="proto"> <span class="type">int</span> nWidth,</td></tr><br />
<tr><td class="proto"> <span class="type">int</span> nHeight,</td></tr><br />
<tr><td class="proto"> HWND hWndParent,</td></tr><br />
<tr><td class="proto"> HMENU hMenu,</td></tr><br />
<tr><td class="proto"> HINSTANCE hInstance,</td></tr><br />
<tr><td class="proto"> LPVOID lpParam</td></tr></table>);</code></pre>erzeugt und mit<br />
<pre><code class="name">BOOL WINAPI [http://msdn.microsoft.com/en-us/library/ms633548%28v=vs.85%29.aspx ShowWindow](<br />
<table border="0"><br />
<tr><td class="proto"> HWND hWnd,</td></tr><br />
<tr><td class="proto"> <span class="type">int</span> nCmdShow</td></tr></table>);</code></pre>und<br />
<pre><code class="name">BOOL [http://msdn.microsoft.com/en-us/library/dd145167%28v=vs.85%29.aspx UpdateWindow](<br />
HWND hWnd<br />
);</code></pre>angezeigt.<pre class="example"><code>BOOL InitInstance(HINSTANCE hInstance, <span class="type">int</span> nCmdShow) {<br />
HWND hWnd;<br />
<br />
hInst = hInstance; <span class="comment">// Instanzenhandle in der globalen Variablen speichern</span><br />
<br />
<span class="comment">// Fenster erzeugen</span><br />
hWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);<br />
if (!hWnd) { return FALSE; }<br />
<br />
<span class="comment">// Fensteranzeigen</span><br />
ShowWindow(hWnd, nCmdShow);<br />
UpdateWindow(hWnd); <span class="comment">// Sendet WM_PAINT Nachricht wenn "update region"(?) nicht leer.</span><br />
<br />
return TRUE;<br />
}</code></pre></p><br />
<h5>Die CALLBACK-Funktion des Hauptfensters</h5><br />
<p>ist eine zu erstellende Funktion zur Behandlung der Nachrichten. Sie muss der Deklaration<pre><code> LRESULT CALLBACK [http://msdn.microsoft.com/en-us/library/ms633573%28v=vs.85%29.aspx WindowProc](<br />
<table><br />
<tr><td class="proto"> HWND hwnd, </td><td class="comment"> // Handle zum Fenster.</td></tr><br />
<tr><td class="proto"> UINT uMsg, </td><td class="comment"> // Der Code der Nachricht.</td></tr><br />
<tr><td class="proto"> WPARAM wParam, </td><td class="comment"> // Zusatzinformation zur Nachricht, abhängig vom Typ der Nachricht.</td></tr><br />
<tr><td class="proto"> LPARAM lParam </td><td class="comment"> // Zusatzinformation zur Nachricht, abhängig vom Typ der Nachricht.</td></tr><br />
</table>);</code></pre>entsprechen. Es gibt eine gewaltige Anzahl vordefinierter Nachrichten, die hier nicht alle aufgeführt werden können, eine Liste findet sich unter [http://msdn.microsoft.com/en-us/library/ms644927%28v=vs.85%29.aspx#system_defined MSDN: About Messages and Message Queues # System-Defined Messages]. Unser Basisprogramm behandelt die Nachrichten:<br />
<ul><br />
<li><strong><code>WM_COMMAND</code>:</strong> Ein Menüpunkt wurde ausgewählt. Welcher, steht in wParam. Die Menüpunkte und die zugehörigen Codes werden in der Resourcendatei festgelegt. In resource.h werden über <code class="preprocessor">#define</code> den Codes Namen zugewiesen.</li><br />
<li><strong><code>WM_PAINT</code>:</strong> Aufforderung, den Inhalt des Fensters neu zu zeichen, Wird zB. durch <code>UpdateWindow(...)</code> [#UpdateWindow (s.o.)] ausgelöst.</li><br />
<li><strong><code>WM_DESTROY</code>:</strong> Nachricht, dass das Fenster geschlossen wurde. Wird entweder durch Windows nach einer der üblichen Verfahren zum Schließen eines Fensters bzw. Beenden des Programms ausglöst oder durch Aufruf von<pre><code>BOOL WINAPI [http://msdn.microsoft.com/en-us/library/ms632682%28v=vs.85%29.aspx DestroyWindow](<br />
<table><br />
<tr><td class="proto"> HWND hWnd</td></tr><br />
</table>);</code></pre>In unserem Beispiel wird DestroyWindow(hWnd) nach Anklicken des Menupunktes Datei<span id="menupfad">→</span>Beenden aufgerufen: Nachricht <code class="name">WM_COMMAND</code><span id="menupfad">→</span>Parameter <code class="name">IDM_EXIT</code>. </li><br />
</ul>Alle anderen Nachrichten laufen in den <dfn>default-Zweig</dfn> und rufen <pre><code>LRESULT WINAPI [http://msdn.microsoft.com/en-us/library/ms633572%28v=vs.85%29.aspx DefWindowProc](<br />
<table><br />
<tr><td class="proto"> HWND hWnd,</td></tr><br />
<tr><td class="proto"> UINT Msg,</td></tr><br />
<tr><td class="proto"> WPARAM wParam,</td></tr><br />
<tr><td class="proto"> LPARAM lParam</td></tr><br />
</table>);</code></pre>auf. <code class="name">DefWindowProc(...)</code> enthält die Standardbehandlung für alle Nachrichten, zB. Minimieren oder Maximieren des Fensters. Deshalb werden an sie die Parameter der CALLBACK-Funktion 1 zu 1 übergeben.</p><br />
<h4>Ein Dialog</h4><br />
<p>ist ein Fenster zur Interaktion mit dem Benutzer. Es enthält Kontrollelemente oder auch Text- und Eingabefelder und wird in der Resource definiert. Es gibt <dfn>modale</dfn> Dialoge, die den Zugriff auf alle anderen Fenster des Programms blockieren und nichtblockierende <dfn>nichtmodale</dfn> Dialoge. Bei der Projekterstellung wird automatisch ein modaler Info-Dialog angelegt, der nach Anklicken des Menüpunktes Hilfe<span id="menupfad">→</span>Info aufgerufen wird.</p><br />
<h5>Erzeugen des Dialogs:</h5><br />
<p>Ein modaler Dialog wird mit <pre><code>INT_PTR WINAPI [http://msdn.microsoft.com/en-us/library/ms645452%28v=vs.85%29.aspx DialogBox](<br />
<table><br />
<tr><td class="proto"> HINSTANCE hInstance,</td></tr><br />
<tr><td class="proto"> LPCTSTR lpTemplate, </td><td class="comment">// Die Codenummer des Dialogs, wie sie in der Resourcen-Datei und resource.h definiert ist.</td></tr><br />
<tr><td class="proto"> </td><td class="comment">// MAKEINTRESOURCE wandelt diese Nummer in den Typ LPCTSTR.</td></tr><br />
<tr><td class="proto"> HWND hWndParent,</td></tr><br />
<tr><td class="proto"> DLGPROC lpDialogFunc</td></tr><br />
</table>);</code></pre>aufgerufen. <code class="name">DialogBox(...)</code> wird erst beendet, wenn der Dialog mit <code class="name"> [[#EndDialog | EndDialog]](...)</code> geschlossen wird.</p><br />
<h5>Die CALLBACK-Funktion des Dialogs</h5><br />
<p>Als Fenster gehört zu dem Dialog auch eine CALLBACK-Funktion zum Auffangen der Nachrichten aus dem Dialog. Diese soll <span class="type">true</span> für alle Nachrichten, die sie bearbeitet hat, zurückgeben. Wenn sie <span class="type">false</span> zurückgibt, wird die Standardaktion für die Nachricht ausgeführt. Sie hat eine ähnliche Deklaration wie die CALLBACK-Funktion des Hauptfensters:<pre><code>INT_PTR CALLBACK [http://msdn.microsoft.com/en-us/library/ms645469%28v=vs.85%29.aspx DialogProc](<br />
<table><br />
<tr><td class="proto"> HWND hwndDlg, </td><td class="comment">// Handle zum Dialog.</td></tr><br />
<tr><td class="proto"> UINT uMsg, </td><td class="comment">// Der Code der Nachricht.</td></tr><br />
<tr><td class="proto"> WPARAM wParam, </td><td class="comment">// Zusatzinformation zur Nachricht, abhängig vom Typ der Nachricht.</td></tr><br />
<tr><td class="proto"> LPARAM lParam </td><td class="comment">// Zusatzinformation zur Nachricht, abhängig vom Typ der Nachricht.</td></tr><br />
</table>);</code></pre></p><br />
<h5>Beenden des Dialogs:</h5><br />
<p>Ein modaler Dialog wird mit <pre><code>BOOL WINAPI [http://msdn.microsoft.com/en-us/library/ms645472%28v=vs.85%29.aspx EndDialog<a>(<br />
<table><br />
<tr><td class="proto"> HWND hDlg,</td></tr><br />
<tr><td class="proto"> INT_PTR nResult</td></tr><br />
</table>);</code></pre> beendet, aufgerufen in der CALLBACK-Funktion.</p><br />
<br />
[[Kategorie:C++]]</div>SysOpGerthttp://wiki.ggf-controls.de/index.php?title=Konfiguration_(Apache)Konfiguration (Apache)2017-03-27T17:31:57Z<p>SysOpGert: 1 Version: Neuinstallation</p>
<hr />
<div>== Verbindungen ==<br />
In /etc/apache2/ports.conf muss mit der Listen-Direktive der oder die {{platz|IP-Adresse:Port}} festgelegt werden, an denen der Server lauscht.<br />
<br />Zum Testen langt der lokale Zugriff auf localhost:80 {{isyn|lang=apache|code=Listen localhost:80}}. Falls man auf den Rechner aus einem Heimnetz zugreifen will, muss die IP-Adresse des Rechners im Netz hinzugefügt werden: {{isyn|lang=apache|code=Listen 192.168.3.17:80}}.<br />
== Ordnereinschränkungen ==<br />
Zugriffserlaubnis für Hosts auf Ordner muss man mit der [http://httpd.apache.org/docs/2.4/de/mod/mod_access_compat.html#order Order-Direktive] in Verbindung mit [http://httpd.apache.org/docs/2.4/de/mod/mod_access_compat.html#allow Allow]- und [http://httpd.apache.org/docs/2.4/de/mod/mod_access_compat.html#deny Deny-Direktive] festlegen<ref>Wenn keine {{Isyn|lang=apache|code=Allow}} oder {{Isyn|lang=apache|code=Deny}} angegeben werden, wird alle angenommen: {{Isyn|lang=apache|code=Order Allow,Deny}} alleine erlaubt erst alle und verbietet dann alle.</ref>:<br />
{{bsyn|lang=apache|code=<Directory><br />
.<br />
.<br />
Require all denied<br />
Order Allow,Deny<br />
#erstmal alle verbieten für alle Ordner<br />
</Directory><br />
<Directory /var/www/><br />
.<br />
.<br />
Require all granted<br />
#Zugriff für alle Nutzer auf /var/www<br />
<br />
Order Deny,Allow<br />
Deny from all<br />
Allow from 127.0.0.1 192.168.3.18<br />
#dann localhost und ...18 für /var/www erlauben<br />
</Directory>}}<br />
Mit der [http://httpd.apache.org/docs/2.4/de/mod/mod_authz_core.html#require Require-Direktive] werden {{Tooltip|Nutzer|User}}-Bedingungen festgelegt.<br />
== Fußnoten ==<br />
Siehe [[Hilfe:Bearbeiten|Bearbeitungshilfe]]<br />
<references><br />
<!-- <ref name="fehler">TODO: Wie werden Laufzeitfehler, Debuggerausgaben usw ohne IDE angezeigt. --><br />
</references><br />
<!-- Alternative können die Referenzadressen direkt im Text zwischen <ref> und </ref> eingegeben werden, dann muss hier nur ein leeres Tag <references /> stehen. --><br />
== Quellen ==<br />
Siehe [[Hilfe:Bearbeiten|Bearbeitungshilfe]]<br />
<references /><br />
<references group="QtR"><br />
<!-- <ref name="QObject">[http://doc.qt.nokia.com/4.7/qobject.html QObject Class Reference]</ref> --><br />
</ references><br />
[[Kategorie:Apache]]</div>SysOpGerthttp://wiki.ggf-controls.de/index.php?title=URL_umleiten_(Apache)URL umleiten (Apache)2017-03-27T17:31:57Z<p>SysOpGert: 1 Version: Neuinstallation</p>
<hr />
<div>[[Kategorie:Apache]]<br />
Man kann vom Besucher eingegebene Adressen auf andere Adressen umleiten. Dies ist zB. sinnvoll, falls man eine HTML-Dateien umbenannt hat, aber weiterhin möchte, das sie unter dem alten Namen erreichbar bleibt<ref>Ein einfacher Link ist nicht ausreichend, da relative Adressen immer relativ zum zur ursprünglich aufgerufenen Adresse betrachtet werden, auch wenn diese einen Link auf den eigentlichen Pfad/Datei enthält.</ref>.<br />
== Redirect ==<br />
Die einfachste Methode ist die {{Tooltip|Anweisung|Directive}} ''Redirect'' aus dem Modul ''mod_alias'':{{Bsyn|lang=apache|code=Redirect /alt.html /neu.php}}.<br />
Im der Browser-Adressleite wird die neue Adresse angezeigt, die Umleitung ist transparent.<br />
== Rewrite ==<br />
Komplexere Umleitungen kann man mit den {{Tooltip|Anweisungen|Directives}} ''RewriteRule'' und ''RewriteCond'' aus dem Module ''mod_rewrite'' realisieren. ''mod_rewrite'' bietet regelbasierte Methoden, indem alte und neu Adresse durch einen Regulären Ausdruck in PERL-Syntax beschrieben werden.<br />
==Fußnoten==<br />
<references /></div>SysOpGerthttp://wiki.ggf-controls.de/index.php?title=XAMPP_(Apache)XAMPP (Apache)2017-03-27T17:31:57Z<p>SysOpGert: 1 Version: Neuinstallation</p>
<hr />
<div>==MySQL-Passwort==<br />
Die Windows-Distribution läßt keine deutschen Sonderzeichen im MySQL-Passwort zu<ref>Wieso eigentlich nicht?</ref>. Auf der [http://localhost/security/index.php XAMPP Security Seite] wird eine entsprechende Eingabe mit Sonderzeichen abgefangen<ref>Dafür kann ich erstaunlicherweise ein falsches "Akuelles Passwort" eingeben, trotzdem wird behauptet, das Passwort wurde erfolgreich geändert</ref>. Mit phpMyAdmin kann ich aber ohne Mühe ein Passwort mit Sonderzeichen eingeben. Leider ist damit der Zugriff auf die Datenbanken für alle Zeiten gesperrt. Ich habe keinen Weg gefunden, mich wieder auf die Datenbank einzuloggen bzw. das Passwort zu ändern. Einzige Lösung ist Neuinstallation.<br />
== Fußnoten ==<br />
<br />
<references><br />
<!-- <ref name="fehler">TODO: Wie werden Laufzeitfehler, Debuggerausgaben usw ohne IDE angezeigt. --><br />
== Quellen ==<br />
<references group="QtR"><br />
<!-- <ref name="QObject">[http://doc.qt.nokia.com/4.7/qobject.html QObject Class Reference]</ref> --><br />
</references><br />
[[Kategorie:Apache]]</div>SysOpGerthttp://wiki.ggf-controls.de/index.php?title=Konfiguration_(MediaWiki)Konfiguration (MediaWiki)2017-03-27T17:31:56Z<p>SysOpGert: 1 Version: Neuinstallation</p>
<hr />
<div>[[Kategorie:Wiki]]<br />
== Einstellungen ==<br />
Über Variablen in LocalSettings.php können viele Dinge angepasst werden. Eine Übersicht ist im Mediawiki-Handbuch auf der Seite [http://www.mediawiki.org/wiki/Manual:Configuration_settings Configuration_settings]. <br />
=== Benutzerrechte ===<br />
[http://www.mediawiki.org/wiki/Manual:User_rights_management Eine Liste aller Rechte und Nutzergruppen]<ref>Talk bedeutet Diskussionsseite.</ref>.<br />
<br />Voreingestellte Benutzerrechte für alle Gruppen stehen in DefaultSettings.php. Diese können in LocalSettings.php überschrieben werden, zB. Schreibrechte nur für Administratoren:<br />
{{Bsyn|lang=php|code=$wgGroupPermissions['*']['edit'] = false;<br />
$wgGroupPermissions['user']['edit'] = false;<br />
$wgGroupPermissions['sysop']['edit'] = true;}}<br />
Alle Nutzer einschließlich anonyme sind implizit in der Gruppe '*', alle angemeldeten implizit in der Gruppe 'user'.<br />
Wenn ein Recht gesetzt wurde, kann es nicht für eingrenzende Gruppen entzogen werden: zB. wenn man {{Isyn|lang=php|code=$wgGroupPermissions['*']['edit'] = true;}} für alle setzt, kann man es nicht für registrierte Nutzer diese mit {{Isyn|lang=php|code=$wgGroupPermissions['user']['edit'] = false;}} wieder entziehen. Dazu dient die Variable {{Isyn|lang=php|code=$wgRevokePermissions}}, zB. {{Isyn|lang=php|code=$wgRevokePermissions['user']['edit'] = true;}}. Auch 'Revoke' kann nicht zurückgesetzt werden, wenn es für alle oder alle angemeldeten gesetzt wurde.<br />
<br />'includes/DefaultSettings.php' definiert Benutzergruppen und Rechte, aber es können mit {{Isyn|lang=php|code=$wgGroupPermissions}} eigene Gruppen und Rechte definiert werden.<br />
<br />
Nutzerrechte für einzelne Seiten sind nicht vorgesehen, aber man kann einzelne Seiten mit dem [[Seitenverwaltung (MediaWiki)#Schützen|Schützen-Feature]] gegen Änderungen sichern.<br />
<br />
=== Icons der Fußseite ===<br />
In das Array [http://www.mediawiki.org/wiki/Manual:$wgFooterIcons $wgFootericons] können die Icons/Links "Powered by MediaWiki" und das Copyright-Icon angepasst und zusätzliche Icons eingetragen werden.<br />
<br />Vorgabe ist:<br />
{{bsyn|lang="php"|code=$wgFooterIcons = array(<br />
"copyright" => array(<br />
"copyright" => array(), // placeholder for the built in copyright icon<br />
),<br />
"poweredby" => array(<br />
"mediawiki" => array(<br />
"src" => null, // Defaults to "$wgStylePath/common/images/poweredby_mediawiki_88x31.png"<br />
"url" => "http://www.mediawiki.org/",<br />
"alt" => "Powered by MediaWiki",<br />
)<br />
),<br />
);}}<br />
Anpassung der Standard-Icons:<br />
{{bsyn|lang="php"|code=$wgFooterIcons['poweredby']['myicon'] = array(<br />
"src" => "/path/to/my/image.png", // you may also use a direct path to the source, e.g. "http://example.com/my/custom/path/to/MyCustomLogo.png"<br />
"url" => "http://example.com/",<br />
"alt" => "Some text here...",<br />
);<br />
<br />
// Or if you have a non-default sized icon you can specify the size yourself.<br />
$wgFooterIcons['poweredby']['myicon'] = array(<br />
"src" => "/path/to/my/image.png",<br />
"url" => "http://example.com/",<br />
"alt" => "Some text here...",<br />
"height" => "50", <br />
"width" => "80", <br />
);}}<br />
== Spam-Schutz ==<br />
Ein öffentliches Wiki mit weitgehenden Rechten für anonyme oder automatisch registrierte Nutzer wird in kürzester Zeit mit Spam überlaufen, besonders wenn es in Suchmaschinen zu finden ist. Eine radikale Abwehr ist, nur manuell eingerichteten Nutzern Schreibrechte zu gewähren. Das hält aber die meisten freiwilligen Helfer ab.<br />
Aber MediaWiki bietet einige Möglichkeiten, Spammer abzuwehren, besonders {{Tooltip|Programme zur automatischen Bearbeitung von Webseiten|Bots}}.<br />
<br />Alle Variablen ($wg...) sollen in LocalSettings.php gesetzt werden.<br />
=== Verbot von Wortteilen und unsichtbarem Text ===<br />
Variable $wgSpamRegex erlaubt die Festlegungen von Regeln für verbotene Wortteile oder {{Tooltip|Wörter, die gemeinsame Buchstabenkombinationen aufweisen|Wortklassen}}. Verwendet werden [[Reguläre Ausdrücke (PHP)|Reguläre Ausdrücke]]. Ein Beispiel zur Erläuterung<ref group='Wiki'>Zitiert aus [http://www.mediawiki.org/wiki/Manual:$wgSpamRegex $wgSpamRegex].</ref>:<br />
<syntaxhighlight lang='php' style='position:relative; border:1px grey dashed; padding:0.5em; padding-left:1em'><br />
$wgSpamRegex = "/". # "/" öffnet die Regel<br />
"s-e-x|zoofilia|sexyongpin|grusskarte|geburtstagskarten|animalsex|".<br />
"sex-with|dogsex|adultchat|adultlive|camsex|sexcam|livesex|sexchat|".<br />
"chatsex|onlinesex|adultporn|adultvideo|adultweb.|hardcoresex|hardcoreporn|".<br />
"teenporn|xxxporn|lesbiansex|livegirl|livenude|livesex|livevideo|camgirl|".<br />
"spycam|voyeursex|casino-online|online-casino|kontaktlinsen|cheapest-phone|".<br />
"laser-eye|eye-laser|fuelcellmarket|lasikclinic|cragrats|parishilton|".<br />
"paris-hilton|paris-tape|2large|fuel-dispenser|fueling-dispenser|huojia|".<br />
"jinxinghj|telematicsone|telematiksone|a-mortgage|diamondabrasives|".<br />
"reuterbrook|sex-plugin|sex-zone|lazy-stars|eblja|liuhecai|".<br />
"buy-viagra|-cialis|-levitra|boy-and-girl-kissing|". # häufig verwendete Spam-Begriffe<br />
"dirare\.com|". # passt auf dirare.com, eine spammer's domain<br />
"overflow\s*:\s*auto|". # passt auf overflow:auto, CSS zum Verbergen von Spam (egal wie viele whitespaces um den Doppelpunkt )<br />
"height\s*:\s*[0-4]px|". # passt auf height:0px, eine Schrifthöhe von 0 - 4 Pixel, häufigster mit CSS verborgener Spam (egal wie viele whitespaces um den Doppelpunkt )<br />
"==<center>\[|". # This passt auf Spam verbunden mit starsearchtool.com und Co.<br />
"\<\s*a\s*href|". # Verhindert HTML-Anker auf externe Links (<a href...>), erzwingt wiki syntax<br />
"display\s*:\s*none". # passt auf display:none, CSS zum Verbergen von Spam (egal wie viele whitespaces um den Doppelpunkt )<br />
"/i"; # "/" beendet die Regel und der folgende "i" Schalter macht den Test case-insensitive<br />
# "\s" passt auf whitespace<br />
# "*" wiederholt das vorhergehende 0 oder öfter<br />
# "\s*" bedeutet 0 oder mehr whitespace<br />
</syntaxhighlight><br />
Damit kann man Bots gut abwehren, menschliche Spammer können Wege finden, das zu umgehen, besonders da das unerwünschte Wort angezeigt wird. Geeignete Modifikation von Spezial:MediaWiki-Systemnachrichten schaltet das ab, aber das macht es fast unmöglich, irrtümlich eingegebene gesperrte Texte zu korrigieren.<br />
<br />Eine unsaubere Auswahl der Regeln zerstört aber auch zulässige Texte: {{Isyn|lang=php|code=$wgSpamRegex = "/anal/i";}} verhindert auch das Speichern von Seiten mit ''analog'', was wahrscheinlich nicht gewünscht ist. Eine Option ist die Verwendung von '\b' zur Kennzeichnung einer Wortgrenze: {{Isyn|lang=php|code=$wgSpamRegex = "\b/anal\b/i";}} findet nur das Wort ''anal'' mit großen oder kleinen Buchstaben.<br />
=== Sperren von Namensräumen ===<br />
Die Auswahl von speziellen Rechten für einen Namensraum legt fest, das Seiten in diesem nur von Benutzergruppen mit diesen Rechten geändert werden können:<br />
{{Isyn|lang=php|code=$wgNamespaceProtection[NS_TEMPLATE] = $wgNamespaceProtection[NS_HELP] = array( 'edittemplate' );}}<br />
Es sollte aber einer Benutzergruppe [[#Benutzerrechte|dieses Recht gegeben]] worden sein, sonst hat keiner einen Zugriff. <br />
=== IP-Adressen anhand einer DNS-Blacklist überprüfen ===<br />
Aktivieren der Überprüfung jeder editierenden IP-Adresse<ref group='Wiki'>[http://www.mediawiki.org/wiki/Manual:Combating_spam#DNSBL DNS-based blacklists]</ref>:<br />
{{Bsyn|lang=php|code=$wgEnableDnsBlacklist = true;<br />
$wgDnsBlacklistUrls = array( 'xbl.spamhaus.org', 'opm.tornevall.org' );}}<br />
<br />
=== E-Mail-Adresse bestätigen ===<br />
Mit der Erweiterung [http://www.mediawiki.org/wiki/Extension:ConfirmAccount ConfirmAccount] wird statt einer normalen Registrierung eine E-Mail an die eingegebene Adresse mit einem Anmeldungslink versandt. Wenn der neue Nutzer diesen Link nutzt, wird er in eine Liste erreichbar über {{Eingabe|Spezial:Benutzerkontenanträge bestätigen}}<br />
eingetragen. Ein Bürokrat kann dann diesen manuell als Nutzer registrieren.<br />
<br />$wgGroupPermissions['*']['createaccount'] darf nicht auf true gesetzt werden, sonst wird ConfirmAccount umgangen.<br />
<br />Die Installation verlangt ein Ausführen von [http://www.mediawiki.org/wiki/Update.php maintenance/update.php] und ist damit ein wenig aufwendig.<ref>Das Formular ist abschreckend restriktiv, ich suche noch einen Weg das zu ändern.</ref><br />
<br />
== Erweiterungen ==<br />
In der deutschen Version fehlt die Spezialseite '''Download MediaWiki extension'''. Deshalb müssen Erweiterungen manuell von [http://www.mediawiki.org/wiki/Special:ExtensionDistributor ExtensionDistributor] runtergeladen und in den Ordner '''extensions''' kopiert werden. In LocalSettings.php muss dann die Erweiterung eingetragen werden, zB. für die Code-Darstellung:<br />
{{Bsyn|lang=php|code=# Erweiterung für syntaxhighlight<br />
require_once("$IP/extensions/SyntaxHighlight_GeSHi/SyntaxHighlight_GeSHi.php");<br />
}}<br />
=== Google Adsense ===<br />
Mit der Erweiterung '''[http://www.mediawiki.org/wiki/Extension:Google_AdSense_2 Google Adsense 2]''' wird in die linke {{Tooltip|Seitenleiste|sidebar}} ein Bereich für Google Adsense Werbung eingebaut:<br />
{{Bsyn|lang=php|code=require_once("$IP/extensions/GoogleAdSense/GoogleAdSense.php");<br />
$wgGoogleAdSenseClient = 'ca-pub-1697706253717655';<br />
$wgGoogleAdSenseSlot = '7036140523';<br />
$wgGoogleAdSenseID = 'Wiki'; // Erscheint im Anzeigencode als /* Wiki */, vermutlich der Name des Anzeigenblocks.<br />
$wgGoogleAdSenseWidth = 120;<br />
$wgGoogleAdSenseHeight = 240;<br />
$wgGoogleAdSenseSrc = "http://pagead2.googlesyndication.com/pagead/show_ads.js";<br />
}}<br />
Die Einträge für die obigen Variablen entnimmt man dem Adsense-Anzeigencode.<br />
== Short URL ==<br />
XLhost betreibt PHP als CGI. Dann werden die Seiten des Wikis über URL-Parameter für die Startseite ''index.php'' aufgerufen, zB. mit http://wiki.ggf-controls.de/MediaWiki/index.php?title=Konfiguration_(MediaWiki). Diese lange Adresse wird als unschön empfunden, besser wäre: http://wiki.ggf-controls.de/Konfiguration_(MediaWiki)<ref>[http://www.mediawiki.org/wiki/Manual:Wiki_in_site_root_directory Diese Konfiguration wird von MediaWiki nicht empfohlen], ich (und andere) empfinden sie aber als logisch.</ref>. Dieses wird im MediaWiki-Sprachgebrauch als ''{{Tooltip|kurze|Short}} URL'' oder auch ''{{Tooltip|hübsche|Pretty}} URL'' bezeichnet.<br />
<br />Für die Realisierung benötigt man das Apache-Modul [[URL umleiten (Apache)|mod_rewrite]] und muss einige Änderungen in LocalSettings.php vornehmen. Die Einträge für [[URL umleiten (Apache)|mod_rewrite]] sollten eigentlich in in einer Apache-Konfigurationsdatei vorgenommen werden, da man aber im Regelfall auf einem öffentlichem Webhoster wie XLhost keinen Zugriff auf die Serverkonfiguration hat, ist die geeignete Stelle in einer Datei mit dem Namen ''.htaccess''.<br />
Für ''{{Tooltip|kurze|Short}} URLs'' in obiger Konfiguration sind folgende Einträge notwendig<ref group='Wiki'>[http://www.mediawiki.org/wiki/Manual:Short_URL/Apache Short_URL/Apache]</ref>:<br />
=== .htaccess ===<br />
{{Bsyn|lang=apache|code=# Enable the rewrite engine<br />
RewriteEngine On<br />
<br />
# Short url for wiki pages<br />
# RewriteCond TestString CondPattern ZB.<br />
# Teststring => %{DOCUMENT_ROOT}%{REQUEST_URI}<br />
# CondPattern => !-f<br />
# -f Test auf reguläre Datei, ! Negation ==> !-f true, wenn keine Datei<br />
RewriteCond %{DOCUMENT_ROOT}%{REQUEST_URI} !-f<br />
# -d Test auf Directory<br />
RewriteCond %{DOCUMENT_ROOT}%{REQUEST_URI} !-d<br />
RewriteRule ^(.*)$ %{DOCUMENT_ROOT}/MediaWiki/index.php [L,PT]<br />
<br />
# Redirect / to Main Page<br />
RewriteRule ^(/*)$ %{DOCUMENT_ROOT}/MediaWiki/index.php [L,PT]<br />
}}<br />
=== LocalSettings.php<ref name='oneclick' /> ===<br />
{{Bsyn|lang=php|code=$wgScriptPath = "/MediaWiki"; // Das Installationsverzeichnis mit index.php<br />
$wgArticlePath = "/$1"; // Das Verzeichnis für die 'Short URLs', in diesem Fall root<br />
$wgScriptExtension = ".php";<br />
$wgServer = "http://wiki.ggf-controls.de"; // !! KEIN / am Ende !!<br />
<br />
$wgUsePathInfo = true; // Notwendig für XLhost, aber laut Dokumentation nicht überall<br />
}}<br />
== Fußnoten ==<br />
<references><br />
<ref name='oneclick'>Ich habe dieses Wiki mit dem OneClickInstaller von XLhost installiert. Bei mir enthielt $wgServer ein / am Ende, ich weis aber nicht mehr, ob aus der Installation oder ob ich es falsch eingetragen habe. Auf jeden Fall sollte man es kontrollieren, ein / am Ende führt zu einem doppeltem // in der Short URL und die Adresse existiert dann nicht.</ref><br />
</references><br />
== Quellen ==<br />
[http://www.mediawiki.org/wiki/Sysadmin_hub Das MediaWiki Handbuch für Systemverwalter]<br />
<references group='Wiki' /></div>SysOpGerthttp://wiki.ggf-controls.de/index.php?title=MediaWiki_(Wiki)MediaWiki (Wiki)2017-03-27T17:31:56Z<p>SysOpGert: 1 Version: Neuinstallation</p>
<hr />
<div>In diesem Abschnitt stehen Hilfen und Anmerkungen zu der frei verfügbaren Wiki-Verwaltungssoftware [http://www.mediawiki.org/wiki/MediaWiki '''MediaWiki'''].<br />
=== MediaWiki <-> Wikimedia ===<br />
'''Wikimedia''' steht für die [http://de.wikipedia.org/wiki/Wikimedia Wikimedia Foundation], welche unter anderem Wikipedia oder Wiktionary betreibt.<br />
<br />[http://de.wikipedia.org/wiki/MediaWiki '''MediaWiki'''] ist die Wiki-Engine, die für diese Projekte entwickelt wurde.<br />
== Hilfe ==<br />
Unter [http://meta.wikimedia.org/wiki/Help:Help/de MediaWiki-Handbuch] befindet sich eine Inhaltsangabe eines Handbuchs zur Verwendung der MediaWiki-Software. Soll aber laut englischer Seite nach [http://www.mediawiki.org/wiki/MediaWiki www.mediawiki.org] übertragen werden. Hier befindet sich auch eine Vielzahl von Hilfe, unter anderem auch gleicher Inhalt wie im Handbuch<ref>Stand Nov. 2012</ref>.<br />
<br />
Generell ist zu sagen, dass die englischen Seiten wesentlich ausführlicher und vollständiger sind.<br />
<br />
=== Starthilfen ===<br />
<br />
* [http://www.mediawiki.org/wiki/Manual:Configuration_settings Liste der Konfigurationsvariablen]<br />
* [http://www.mediawiki.org/wiki/Manual:FAQ MediaWiki-FAQ]<br />
* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Mailingliste neuer MediaWiki-Versionen]<br />
<br />
== Fußnoten ==<br />
<references /><br />
[[Kategorie:Wiki]]</div>SysOpGerthttp://wiki.ggf-controls.de/index.php?title=Seiten_verschieben_oder_l%C3%B6schen_(MediaWiki)Seiten verschieben oder löschen (MediaWiki)2017-03-27T17:31:56Z<p>SysOpGert: 1 Version: Neuinstallation</p>
<hr />
<div>[[Kategorie:Wiki]]<br />
In der Bearbeitungsleiste ist ein Pulldown-Menü versteckt<ref>Skin vector</ref>. Darin sind die Befehle Löschen und Verschieben.<br />
== Seiten löschen ==<br />
Befehl Löschen anklicken. Es muss ein Grund angegeben werden.<br />
<br />Die Seite bleibt aber weiterhin in der Datenbank erhalten, wird aber nicht exportiert. Sie kann eine Zeit lang über das Löschlogbuch wiederhergestellt werden:<br />
Spezialseiten->Gelöschte Seiten anzeigen<ref>So steht es im [http://www.mediawiki.org/wiki/Manual:Administrators#Deletion MediaWiki Handbuch]. Bei mir waren die Seiten sofort weg!</ref>.<br />
== Seiten verschieben, umbenennen ==<br />
<br />
== Fußnoten ==<br />
<references /></div>SysOpGerthttp://wiki.ggf-controls.de/index.php?title=Text_Eingeben_(MediaWiki)Text Eingeben (MediaWiki)2017-03-27T17:31:56Z<p>SysOpGert: 1 Version: Neuinstallation</p>
<hr />
<div>== Sonderzeichen ==<br />
Alle Zeichen sind in Unicode. Deshalb kann man auch beliebige Sonderzeichen (griechisch, thailändisch, mathematisch, graphisch usw.) eingeben, entweder in dem man sie kopiert, zB. von dieser [https://de.wikipedia.org/wiki/Hilfe:Sonderzeichen Wikipedia-Hilfe] oder dieser [http://www.utf8-zeichentabelle.de Unicode-Tabelle]. Man kann auch die Unicode-Nummer dezimal mit '''&#{{Platz|nnn}};''' oder hex mit '''&#x{{Platz|nnn}};''' eingeben, falls man kein Beispiel hat.<br />
==Textformatierungen==<br />
Eine kurze Beschreibung befindet sich im der [http://meta.wikimedia.org/wiki/Help:Wikitext_examples/de Wikimediahilfe].<br />
==Rechtschreibprüfung==<br />
MediaWiki beinhaltet keine eigene Rechtschreibprüfung, aber es wird die Rechtschreibprüfung im Browser verwendet.<br />
===Firefox===<br />
Wenn man mit der rechten Maustaste in das Textfeld klickt, befindet sich im Kontextmenü das Untermenü ''Sprachen''. Dort kann man seine Sprache auswählen oder ein weiteres Wörterbuch hinzufügen<ref group='FF'>[http://support.mozilla.org/de/kb/Rechtschreibpruefung-nutzen?redirectlocale=de&redirectslug=Rechtschreibpr%C3%BCfung+nutzen Rechtschreibprüfung]</ref>.<br />
== Tooltip ==<br />
Ein {{Tooltip|Ein erklärender Text, der erscheint, wenn man mit der Maus auf das Element zeigt.|Tooltip}} wird erreicht, wenn man dem Element einen Titel zuordnet. Ein Beispiel:<br />
{{Bsyn|lang=html4strict|code=<span title='Erklärung'>Begriff</span>}}<br />
Alternativ kann in diesem Wiki die [[Vorlage:Tooltip|Vorlage Tooltip]] eingesetzt werden, welches außerdem eine gepunktete Unterstreichung hinzufügt.<br />
<br />
== Fußnoten, Quellen ==<br />
Fußnoten (zB. Zitate) werden mit der Erweiterung [http://www.mediawiki.org/wiki/Extension:Cite/Cite.php Cite] gekennzeichtet. An die gewünschte Stelle wird mit dem Tag <nowiki><ref></nowiki>{{Platz|Fußnote}}<nowiki></ref></nowiki> die Fußnote angegeben (zB <nowiki><ref></nowiki>{{Platz|[http://www.quelle.de Quelle]}}<nowiki></ref></nowiki>. Dort wird dann eine Fußnotennummer stehen und an der Stelle des Tags <nowiki><references /></nowiki> wird als Link der Fußnotentext stehen.<br />
<br />
Fußnoten können gruppiert werden: (<nowiki><ref group="</nowiki>{{Platz|Gruppe}}<nowiki>"></nowiki>), auch wenn nur ein Dokument zitiert wird. Da der Gruppenname in dem Fußnotenzeichen erscheint, sollte eine handliche, aber sinnvolle Abkürzung gewählt werden. <br />
Fußnotentexte können zur Übersichtlichkeit auch zwischen <nowiki><references> und </references> angelegt werden. Dann erhält die Fußnote mit <ref name="</nowiki>{{Platz|Fname}}<nowiki>"> einen Namen, der Text wird mit <ref name="</nowiki>{{Platz|Fname}}<nowiki>"></nowiki> gekennzeichnet.<br />
<br />
Auch wenn man mit mehreren Referenzen auf die gleiche Fußnote zeigen will, muss man der Fußnote mit <nowiki><ref name="</nowiki>{{Platz|Fname}}<nowiki>"></nowiki> einen Namen geben. Verwendet wird der Text unter dem 1. Auftreten, die weiteren Referenzen können leer sein (<nowiki><ref name="</nowiki>{{Platz|Fname}}<nowiki>" /></nowiki>).<br />
<br />
Beispiel: [[Qt (C++)]]<br />
<br />
[[Kategorie:Wiki]]<br />
<br />
==Quellen==<br />
Aus [http://support.mozilla.org/de/home Mozilla-Hilfe]:<br />
<references group='FF' /><br />
[[Kategorie:Wiki]]</div>SysOpGerthttp://wiki.ggf-controls.de/index.php?title=Vorlagen_(MediaWiki)Vorlagen (MediaWiki)2017-03-27T17:31:56Z<p>SysOpGert: 1 Version: Neuinstallation</p>
<hr />
<div>Vorlagen findet man über '''Spezialseiten'''->'''AlleSeiten''', dort Namensraum '''Vorlagen''' auswählen.<br />
==Benutzen==<br />
Vorlagen werden im Text durch <nowiki>{{vorlage|parameter1|parameter2|...}}</nowiki> verwendet. Wenn <nowiki>{{subst:vorlage...}}</nowiki> hinzugefügt wird, ersetzt die Vorlage beim 1. Speichern den Aufruf. <nowiki>{{msgnw:vorlage...}}</nowiki> fügt den Text der Vorlage ohne Auswertung ein<ref>Tip: Änderung einer Vorlage wird in einer nutzenden Seite erst wirksam, den die Seite neu geladen wird. Bei Seiten in Bearbeitung wird das auch durch erneute Vorschau erreicht.</ref>.<br />
<br />
==Parameter==<br />
Parameter werden im Vorlagenaufruf durch | getrennt.<br />
Parameter werden in der Vorlage auf 2 Arten gekennzeichnet:<br />
* unbenannt, dann werden sie in der Aufrufreihenfolge durchgezählt: {{{1}}}, {{{2}}}.<br />Im aufrufendem Text werden die Parameter einfach nacheinander aufgelistet. Aber wenn der Parameter ein '=' enthält, wird die Vorlage nicht oder falsch übersetzt. Als Lösung kann man nummerierte Parameter als benannte verwenden: <nowiki>{{vorlage|2=einWert|1=anderer}}</nowiki>.<br />
* benannt, dann wird statt der Nummer ein Bezeichner verwendet: {{{parm1}}}, {{{auchParm}}}.<br/>Im aufrufendem Text werden Parameter und Wert mit Gleichheitszeichen zugeordnet: <nowiki>{{vorlage|auchParm=einWert|parm1=anderer}}</nowiki>.<br />
===Parameter in Tags===<br />
Statt {{Tooltip|durch Erweiterungen hinzugefügte Tags|Parser extension tags}} <...> kann auch die [http://www.mediawiki.org/wiki/Parser_function Parserfunktion] '''#tag'''<ref group="Help">[http://meta.wikimedia.org/wiki/Help:XML-style_tags Help:XML-style tags]</ref> verwendet werden. Dann müssen die Parameter benannt sein.<br />
<br/>zB.: <nowiki>{{#tag:syntaxhighlight|{{{code}}}|lang={{{lang}}}|enclose=none}}</nowiki>.<br />
<br />
=== geschweifte Klammern in Parametern ===<br />
<nowiki>{{isyn|lang=cpp|code=namespace {}}}</nowiki> expandiert zu {{isyn|lang=cpp|code=namespace {}}}.<br />
<br />Eine Lösung ist <nowiki>{{isyn|lang=cpp|code=namespace {}</nowiki><br />
<br /><nowiki>}}</nowiki>. Dies expandiert zu {{isyn|lang=cpp|code=namespace {}<br />
}}.<br />
=== Test auf gesetzte Parameter<ref group='Help'>[http://www.mediawiki.org/wiki/Help:Parser_functions_in_templates/de Help:Parser functions in templates]</ref> ===<br />
Mit [http://www.mediawiki.org/wiki/Help:Extension:ParserFunctions/de#.23if <nowiki>{{#if: Test|wenn wahr|wenn falsch}}</nowiki>] können Parameter auf leer (enthält nur Whitespaces) - <nowiki>{{#if:{{{1}}}|Zeige {{{1}}}|Mache nichts}}</nowiki> - oder undefiniert / leer - <nowiki>{{#if:{{{1|}}}|Zeige {{{1}}}|Mache nichts}}</nowiki><ref>Man beachte den senkrechten Strich in <nowiki>#if:{{{1|}}}</nowiki></ref> - getestet werden.<br />
'''#if:''' ist Bestandteil der Extension [http://www.mediawiki.org/wiki/Extension:ParserFunctions ParserFunctions], die ab Version 1.18 im MediaWiki-Paket enthalten ist. Sie muß aber am Ende von [[Konfiguration (MediaWiki)|LocalSettings.php]] mit der Zeile {{Bsyn|lang=php|code=require_once("$IP/extensions/ParserFunctions/ParserFunctions.php");}}aktiviert werden.<br />
<br />
==Fußnoten==<br />
<references /><br />
==Quellen==<br />
Aus der [http://www.mediawiki.org/wiki/MediaWiki MediaWiki Dokumentation]:<br />
<references group="Help" /><br />
[[Kategorie:Wiki]]</div>SysOpGerthttp://wiki.ggf-controls.de/index.php?title=Arrays_(PHP)Arrays (PHP)2017-03-27T17:31:56Z<p>SysOpGert: 1 Version: Neuinstallation</p>
<hr />
<div>[[Kategorie:PHP]]<br />
Bei Arrays handel es sich um "Ordered Map<ref>Ich hab keine sinnvolle Übersetzung gefunden.</ref>", dh. jedes Element besteht aus einem Schlüssel und einem zugehörigem Wert. Der Schlüssel muss vom Typ Integer oder String sein, der Wert kann jeden beliebigen Typ annehmen, also auch wiederum ein Array. Die Anordnung im Array ist nach dem Schlüssel sortiert.<br />
== Syntax ==<br />
=== Erzeugen eines Arrays: ===<br />
{{Bsyn|lang=php|code=$arr = array("erster" => "erster Wert", 2 => "zweiter", "noch einer" => 3, "vierter");}}<br />
erzeugt ein Array mit den Elementen arr["erster"], arr[2], arr["noch einer"] und arr[3]. Wenn der Schlüssel weggelassen wird, wird der höchste vorhandene Interger-Schlüssel + 1 verwendet. Falls kein Integer-Schlüssel vorhanden ist oder der höchste negativ ist, ist der Schlüssel 0.<br />
=== Zugriff auf Array-Elemente: ===<br />
{{Bsyn|lang=php|code=//Lesen<br />
echo $arr["noch einer"]; // 3<br />
//Schreiben<br />
$arr[3] = "dritter"; // Ändert Wert hinter Schlüssel 3 auf "dritter"<br />
$arr["neu"] = "vierter"; // Fügt Element "neu" => "vierter" an.<br />
$arr[] = "vierter"; // Fügt Element 4 (3+1) => "vierter" an.}}<br />
Wenn beim Schreiben der Schlüssel nicht existiert, wird ein neues Element eingefügt. Wenn kein Schlüssel angegeben wird, wird der nächsthöhere Integer verwendet. Wenn $arr nicht existiert, wird es angelegt.<br />
=== Mehrdimensionale Arrays: ===<br />
{{Bsyn|lang=php|code=$arr = array(array(1.1, 1.2), array(2.1, 2.2));<br />
echo $arr[0][1]; // 1.2<br />
echo $arr[1][0]; // 2.1}}<br />
Werden erzeugt, indem für einzelne Elemente wieder Arrays verwendet werden. Man kann das beliebig streuen, aber dann entstehen nur bunte Strukturen. Für mehrdimensionalen Arrays müssen alle Elemente identisch große Arrays sein.<br />
== Nützliche Funktionen ==<br />
Hier nur eine kleine Auswahl, [http://de2.php.net/manual/de/ref.array.php es gibt eine Menge mehr].<br />
=== foreach ===<br />
bietet eine einfache Syntax, alle Elemente eines Arrays zu durchlaufen:<br />
{{Bsyn|lang=php|code=$arr = array("eins" => 12, "zwei" => 14, "drei" => 16, "vier" => 18, 20);<br />
foreach ($arr as $key => $value) {<br />
echo "Wert von $key ist $value";<br />
}<br />
}}<br />
=== count ===<br />
Gibt die Anzahl der Elemente eines Arrays zurück.<br />
{{Bsyn|lang=php|code=$arr = array("eins" => 12, "zwei" => 14, "drei" => 16, "vier" => 18, 20);<br />
echo count($arr); // 5}}<br />
=== array_values ===<br />
Liefert alle Werte eines Arrays, aber ohne Schlüssel, statt dessen numerisch indiziert.<br />
{{Bsyn|lang=php|code=$arr = array("eins" => 12, "zwei" => 14, "drei" => 16, "vier" => 18, 20);<br />
$indiziert = array_values($arr);<br />
echo $indiziert[0]; // 12<br />
echo $indiziert[2]; // 16}}<br />
=== array_keys ===<br />
Liefert alle Schlüssel eines Arrays numerisch indiziert.<br />
{{Bsyn|lang=php|code=$arr = array("eins" => 12, "zwei" => 14, "drei" => 16, "vier" => 18, 20);<br />
$keys = array_keys($arr);<br />
echo $keys[2]; // drei}}<br />
<br />
== Fußnoten ==<br />
<references /></div>SysOpGerthttp://wiki.ggf-controls.de/index.php?title=Eclipse_(PHP)Eclipse (PHP)2017-03-27T17:31:56Z<p>SysOpGert: 1 Version: Neuinstallation</p>
<hr />
<div>[[Kategorie:PHP]]<br />
PHP als Scriptsprache, die auf dem Server ausgeführt wird, benötigt nicht<br />
* eine integriertes System zur Erstellung des endgültigem Programms (Build),<br />
* einen spezialisierten Editor <ref>Syntax-Highlightning wird von vielen Editoren beigestellt, unter Windows zB. [http://notepad-plus-plus.org/ notepad++], unter Linux so ziemlich jeder Editor komplexer als ''vi'' oder ''nano''.</ref>.<br />
Trotzdem verwende ich [http://wiki.eclipse.org/PDT/Installation Eclipse-PHP] als [http://de.wikipedia.org/wiki/Integrierte_Entwicklungsumgebung IDE], sie bietet doch einige nützliche Hilfen:<br />
* Automatisches Vervollständigen: Es werden nach Eingabe weniger Buchstaben die möglichen Funktionen bzw. Variablen angeboten.<br />
* Mit F3 direkter Sprung zur Deklaration einer Funktion<ref>In C++ würde man Definition sagen.</ref>.<br />
* Syntax Highlightning auch für HTML.<br />
* Markierung zusammengehöriger Klammerpaare und Tags<ref>Dies mach einen häufigen Wechsel zwischen PHP und HTML sinnvoll.</ref>.<br />
* Fehler- und Warnungsmarkierung.<br />
* und vieles mehr.<br />
<br />
== Installation ==<br />
Eclipse benötigt eine Java Runtime Engine.<br />
=== Kubuntu ===<br />
Mein bevorzugtes Betriebssystem und {{Tooltip|Desktop Environment|grafische Benutzeroberfläche}} ist Linux/KDE aus der [http://wiki.ubuntuusers.de/Downloads Kubuntu-Distribution]. In dieser Distribution ist ein Paket ''eclipse-platform'' enthalten. Wenn man dieses installiert hat, kann man das PDP-Plugin nachrüsten wie unter [http://wiki.eclipse.org/PDT/Installation PHP Development Tools] beschrieben<ref>Es gibt ein Paket von [http://www.zend.com/en/company/community/pdt/downloads zend] Eclipse nur für PHP, aber die Installation bedarf einiger manueller Einstellungen. Ich habe es abgebrochen.</ref>. <br />
== Fußnoten ==<br />
<references /></div>SysOpGerthttp://wiki.ggf-controls.de/index.php?title=Fehlerausgaben_(PHP)Fehlerausgaben (PHP)2017-03-27T17:31:56Z<p>SysOpGert: 1 Version: Neuinstallation</p>
<hr />
<div>Um Fehlerausgaben zu erhalten, muss in der php.ini<ref>/etc/php5/apache2/</ref> ''display_errors = On'' gesetzt werden. Man sollte aber auf jedem Fall die [http://de2.php.net/manual/de/security.errors.php Sicherheitsrisiken] beachten.<br />
<syntaxhighlight lang="mysql"><br />
</syntaxhighlight><br />
<br />
== Fußnoten ==<br />
<references><br />
<!-- <ref name="fehler">TODO: Wie werden Laufzeitfehler, Debuggerausgaben usw ohne IDE angezeigt. --><br />
</references><br />
<!-- Alternative können die Referenzadressen direkt im Text zwischen <ref> und </ref> eingegeben werden, dann muss hier nur ein leeres Tag <references /> stehen. --><br />
== Quellen ==<br />
<references group="QtR"><br />
<!-- <ref name="QObject">[http://doc.qt.nokia.com/4.7/qobject.html QObject Class Reference]</ref> --><br />
</ references><br />
[[Kategorie:PHP]]</div>SysOpGerthttp://wiki.ggf-controls.de/index.php?title=Formulare_(PHP)Formulare (PHP)2017-03-27T17:31:56Z<p>SysOpGert: 1 Version: Neuinstallation</p>
<hr />
<div>==Bearbeiten der Formulareinträge==<br />
Im HTML-Tag <form> wird über Attribut ''action'' eine Bearbeitungsseite festgelegt. Diese Seite wird aufgerufen, wenn der Absendeknopf <input type="submit" ...> angeklickt wird<ref name="return" />.<br />
==Übergabe der Werte==<br />
Im HTML-Tag <form> wird über Attribut ''method'' die Übergabemethode festgelegt. Mögliche Werte sind:<br />
* '''get''': Werte werden an die URL der Bearbeitungsseite angehängt. Zielarray $_GET.<br />
* '''post''': Werte werden gesondert übertragen. Zielarray $_POST.<br />
Die Werte können dann auf der Bearbeitungsseite aus den assoziativen Arrays $_GET und $_POST ausgelesen werden. Schlüssel ist der im Attribut ''name'' des Formularfeldes angegebene Bezeichner<ref name="_" />. Felder ohne Bezeichner werden nicht übertragen, Felder mit gleichen Bezeichner werden im Array überschrieben.<br />
<br />In die Array werden auch die Werte der Absendeknöpfe eingetragen, Schlüssel ist Attribut ''name'' des Absendeknopfes. Damit können mehrere Absendeknöpfe für unterschiedliche Bearbeitungen definiert werden.<br />
<br />Checkboxen {{isyn|lang=php|code=<input type='checkbox' name='Checkboxname' />}} werden nur übertragen, wenn sie gesetzt wurden<ref name='checkbox' />. Sie müssen also mit {{isyn|lang=php|code=if (isset($_POST(['Checkboxname'])) {...}} abgefragt werden.<br />
<br />
==Beispiel==<br />
{{bsyn|lang=html4strict|code=<br />
<form action="Werte.php" method="post"><br />
<table border = 0><br />
<tr><th>Kennnr</th><th>Name</th><th>Wert</th></tr> <!-- Table-Überschrift --><br />
<tr><td>AB12345</td><td>Aktie1</td><td><input type="text" name="aktie1" /></td></tr><br />
.<br />
.<br />
</table><br />
<input type="submit" name="aktualisieren" value="Datenbank aktualisieren"><br />
<input type="reset" value="alte Werte" /><br />
</form>}}<br />
<br />
<br />
== Fußnoten ==<br />
<references><br />
<ref name="return">Auch wenn die Eingabetaste gedrückt wird, wird gesendet.</ref><br />
<ref name="_">Bei der Übertragung werden Leerzeichen und Punkte im Bezeichner in Unterstriche (_) umgewandelt.</ref><br />
<ref name="checkbox">Dann als String "on".</ref><br />
<!-- <ref name="fehler">TODO: Wie werden Laufzeitfehler, Debuggerausgaben usw ohne IDE angezeigt. </ref>--><br />
</references><br />
<!-- Alternative können die Referenzadressen direkt im Text zwischen <ref> und </ref> eingegeben werden, dann muss hier nur ein leeres Tag <references /> stehen. --><br />
== Quellen ==<br />
<references group="QtR"><br />
<!-- <ref name="QObject">[http://doc.qt.nokia.com/4.7/qobject.html QObject Class Reference]</ref> --><br />
</ references><br />
[[Kategorie:PHP]]</div>SysOpGerthttp://wiki.ggf-controls.de/index.php?title=Lokalisation:_Anpassung_an_%C3%B6rtliche_Begebenheiten_(PHP)Lokalisation: Anpassung an örtliche Begebenheiten (PHP)2017-03-27T17:31:56Z<p>SysOpGert: 1 Version: Neuinstallation</p>
<hr />
<div>Zahlen und Datums/Zeitangaben werden in jedem Land anders dargestellt, obwohl die interne Repräsentation in PHP immer identisch ist. PHP bietet mehrere Klassen zur Konvertierung in landestypische Strings.<br />
== Installation ==<br />
*Linux, Kubuntu: Zur Nutzung muss unter Kubuntu das Paket php5-intl installiert werden, welches bei PHP5-Ubuntu nicht standardmäßig dabei ist.<br />
*Windows, Win7: In XAMPP<ref>Version 1.8.1</ref> ist das Paket zwar vorhanden, aber inaktiv. In der '''php.ini''' (xampp\php\) muss das Kommentarzeichen<ref>Semikolon ;</ref> in der Zeile {{isyn|lang=php|code=extension=php_intl.dll}} entfernt werden. Und es müssen die Dateien mit '''icu*.dll''' aus '''\xampp\php\''' nach '''\xampp\apache\bin\''' verschoben/kopiert werden.<br />
<br />
== Zahlenformate ==<br />
Mit der Klasse [http://de2.php.net/manual/de/class.numberformatter.php NumberFormatter] können die Zahlenaus- bzw. eingaben den landesspezifischen Eigenarten angepasst werden. Das betrifft zB. das Dezimal- und Tausendertrennzeichen.<br />
<br />Festlegung der ''locale'' im Konstruktor: {{isyn|lang=php|code=$form = new NumberFormatter('de-DE', NumberFormatter::DECIMAL);}}<br />
<br />Umwandlung einer Zahl in einen landestypischen String: {{isyn|lang=php|code=$zahlenstring = $form->format($nummer);}}<br />
<br />Umwandlung eines landestypischen String in eine Zahl: {{isyn|lang=php|code=$nummer = $form->parse($kursString);}}. parse() überließt keine führenden Leerzeichen, sondern gibt {{isyn|lang=php|code=false}} zurück. Führende Whitespaces können mit [http://de2.php.net/manual/de/function.trim.php trim({{platz|$string}})] entfernt werden: {{isyn|lang=php|code=$nummer = $form->parse(trim($kursString));}}.<br />
<br />
== Datumsformate ==<br />
Mit der Klasse [http://de2.php.net/manual/de/class.intldateformatter.php IntlDateFormatter] können die Datumsaus- bzw. eingaben den landesspezifischen Eigenarten angepasst werden. Das betrifft zB. die Reihenfolge Tag.Monat.Jahr (deutsch) oder Monat.Tag.Jahr (US).<br />
<br />Festlegung der ''locale'' im Konstruktor: {{isyn|lang=php|code=$form = new IntlDateFormatter('de-DE', IntlDateFormatter::SHORT, IntlDateFormatter::NONE);}}<br />
<br />Umwandlung einer Zahl in einen landestypischen String: {{isyn|lang=php|code=$datumstring = $form->format($datum);}}<br />
<br />Umwandlung eines landestypischen String in eine Zahl: {{isyn|lang=php|code=$datum = $form->parse($datumString);}}. parse() akzeptiert auch ungültige Werte für Tag oder Monat und berücksichtigt Schaltjahre: 29.14.2008 wird zu 01.03.2009.<br />
[http://de2.php.net/manual/de/class.intldateformatter.php IntlDateFormatter] beinhaltet auch die Uhrzeit und die Zeitzone.<br />
<br />
== Fußnoten ==<br />
<references /><br />
== Quellen ==<br />
Aus dem Online [http://de2.php.net/manual/de/ PHP-Handbuch].<br />
<references group="PHP"><br />
<!-- <ref name="QObject">[http://doc.qt.nokia.com/4.7/qobject.html QObject Class Reference]</ref> --><br />
</ references><br />
[[Kategorie:PHP]]</div>SysOpGerthttp://wiki.ggf-controls.de/index.php?title=MySQL_(PHP)MySQL (PHP)2017-03-27T17:31:56Z<p>SysOpGert: 1 Version: Neuinstallation</p>
<hr />
<div>== Datenbankabfrage mit PDO ==<br />
# Mit MySQL-Server verbinden: <syntaxhighlight lang="php" enclose="none">$server = new PDO("mysql:host=localhost;dbname=Datenbank", "Nutzer", "Passwort", array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION));</syntaxhighlight><br />
# Abfragestring erstellen: <syntaxhighlight lang="php" enclose="none">$sql = "SELECT `Text`, `Autor` FROM `Infos` WHERE `Quelle`='neue' ORDER BY Name";</syntaxhighlight><br />
# Datenbankabfrage, holt die Daten(?): <syntaxhighlight lang="php" enclose="none">$query = $server->query($sql);</syntaxhighlight> query() gibt ein Objekt der Klasse PDOStatement zurück. Diese Klasse bietet mehrere Methoden zum Lesen der Daten an, zB:<br />
#* fetch(): holt NÄCHSTES Datum (Tabellenzeile) aus dem PDOStatement.<br />
#* fetchAll(): holt alle Daten.<br />
#* foreach: PDOStatement implements Traversable. Damit ist es auch möglich, den Datensatz mit <syntaxhighlight lang="php" enclose="none">foreach</syntaxhighlight> zu durchlaufen.<br />
# Lesen der Daten: <syntaxhighlight lang="php" enclose="none">foreach ($query as $info) { echo "Text = {$info['Text']}, Autor = {$info['Autor']}"; }</syntaxhighlight> Das Lesen eines Datums (einer Tabellenzeile) entfernt dieses aus dem PDOStatement. Eine Mehrfachnutzung von $query ist somit nicht möglich.<br />
<br />
== Fußnoten ==<br />
<references><br />
<!-- <ref name="fehler">TODO: Wie werden Laufzeitfehler, Debuggerausgaben usw ohne IDE angezeigt. --><br />
</references><br />
== Quellen ==<br />
<references group="QtR"><br />
<!-- <ref name="QObject">[http://doc.qt.nokia.com/4.7/qobject.html QObject Class Reference]</ref> --><br />
</ references><br />
[[Kategorie:PHP]]</div>SysOpGerthttp://wiki.ggf-controls.de/index.php?title=Operatoren_(PHP)Operatoren (PHP)2017-03-27T17:31:56Z<p>SysOpGert: 1 Version: Neuinstallation</p>
<hr />
<div><syntaxhighlight lang="mysql"><br />
</syntaxhighlight><br />
==Vergleichsoperatoren<ref group="PHP">http://de2.php.net/manual/de/language.operators.comparison.php</ref>==<br />
{|<br />
| $a == $b||Gleich<br />
|-<br />
| $a === $b||Identisch||Wert UND Typ gleich.<br />
|}<br />
<pre><br />
$a != $b Ungleich <br />
$a <> $b Ungleich <br />
$a !== $b Nicht identisch Wert ODER Typ ungleich.<br />
$a < $b Kleiner Als <br />
$a > $b Größer Als <br />
$a <= $b Kleiner Gleich <br />
$a >= $b Größer Gleich<br />
</pre><br />
<br />
== Fußnoten ==<br />
Siehe [[Hilfe:Bearbeiten|Bearbeitungshilfe]]<br />
<references><br />
<!-- <ref name="fehler">TODO: Wie werden Laufzeitfehler, Debuggerausgaben usw ohne IDE angezeigt. --><br />
</references><br />
<!-- Alternative können die Referenzadressen direkt im Text zwischen <ref> und </ref> eingegeben werden, dann muss hier nur ein leeres Tag <references /> stehen. --><br />
== Quellen ==<br />
Siehe [[Hilfe:Bearbeiten|Bearbeitungshilfe]]<br />
<references group="PHP"><br />
<!-- <ref name="QObject">[http://doc.qt.nokia.com/4.7/qobject.html QObject Class Reference]</ref> --><br />
</ references><br />
[[Kategorie:PHP]]</div>SysOpGerthttp://wiki.ggf-controls.de/index.php?title=PhpMyAdmin_(PHP)PhpMyAdmin (PHP)2017-03-27T17:31:56Z<p>SysOpGert: 1 Version: Neuinstallation</p>
<hr />
<div>== Datenbank anlegen ==<br />
Eine neue Datenbank wird mit Nutzer (user) "root" und leerem Password erstellt. Ein weiterer Nutzer kann unter Reiter "Rechte" angelegt werden, das Password hat keinen Zusammenhang mit eventuellen gleichen Nutzern vom XAMP.<br />
<br />wenn man bei <code>mysql_connect</code> keinen Nutzer angibt, lässt die Fehlermeldung <code>Access denied for user ''@'localhost' (using password: NO)</code> darauf schließen, dass nich wie unter [http://www.php.net/manual/de/function..php mysql-connect]<br />
[[Kategorie:PHP]]</div>SysOpGerthttp://wiki.ggf-controls.de/index.php?title=Programmteile_auslagern_(PHP)Programmteile auslagern (PHP)2017-03-27T17:31:56Z<p>SysOpGert: 1 Version: Neuinstallation</p>
<hr />
<div>[[Kategorie:PHP]]<br />
==Links und Includepfade==<br />
Der Apache-Webserver sucht Pfade/Dateien aus der vom Browser übermittelten Adresse in einem ganz bestimmten Ordner<ref>Einstellbar?</ref>, unter Linux ist dies /var/www/. Es ist zulässig, hier Links auf die physikalische Datei zu verwenden. Man muss dann aber die einen feinen Unterschied bei der Verwendung relativer Adressen beachten:<br />
Sobald man einen relativen Pfad mit .. (ein Ordner höher) verwendet, bezieht sich der Pfadname nur noch auf aufgerufenen Ordner, hier domainOrdner genannt.<br />
# mit ..: require_once '../{{Platz|IncludeOrdner}}/{{Platz|IncludeDatei.inc.php}}';<br />
## {{Platz|sourceOrdner}}/../{{Platz|IncludeOrdner}}/{{Platz|IncludeDatei.inc.php}} existiert physikalisch. Funktioniert nicht.<br />
## Link var/www/{{Platz|domainOrdner}}/../{{Platz|IncludeOrdner}}/{{Platz|IncludeDatei.inc.php}}. Funktioniert.<br />
# direkt: require_once '{{Platz|IncludeOrdner}}/{{Platz|IncludeDatei.inc.php}}';<br />
## Link var/www/{{Platz|domainOrdner}}/{{Platz|IncludeOrdner}}/{{Platz|IncludeDatei.inc.php}}. Funktioniert.<br />
## Link {{Platz|sourceOrdner}}/{{Platz|IncludeOrdner}}/{{Platz|IncludeDatei.inc.php}}. Funktioniert.<br />
Dies weicht von dem Verhalten von HTML-Ankern (<a>) ab. Relative Adressen werden immer relativ zum domainOrdner betrachtet, auch wenn der einen Link auf den eigentlichen Ordner enthält<ref>Getestet für [[URL umleiten (Apache)| Apache Webserver]]</ref>.<br />
<br />
==Fußnoten==<br />
<references /></div>SysOpGerthttp://wiki.ggf-controls.de/index.php?title=Werte%C3%BCbergabe_an_einen_neuen_Seitenauruf_(PHP)Werteübergabe an einen neuen Seitenauruf (PHP)2017-03-27T17:31:56Z<p>SysOpGert: 1 Version: Neuinstallation</p>
<hr />
<div>Inhalte von Formularen stehen im neuen Seitenaufruf in dem Array $_POST bzw. $_GET zur Verfügung.<br />
<br/>Aber wie übergebe ich Werte außerhalb eines Formulars? Dazu gibt es mehrere Möglichkeiten:<br />
# Doch innerhalb eines Formulars mit einem verstecktem Formularfeld, für den Nutzer unsichtbar, wird aber mitübertragen:<br/>zB. {{isyn|lang=html4strict|code=<input type="hidden" name="versteckt" value="wert">}}.<br />
# Im Seitenaufruf durch anhängen mit '?': {{Platz|URL}}?{{platz|Schlüssel1}}={{Platz|Wert}}&{{Platz|Schlüssel2}}={{Platz|andererWert}}. Dann steht auf der neuen Seite in {{isyn|lang=php|code=$_GET['Schlüssel1']}} der ''Wert''.<br/>zB. {{isyn|lang=php|code=echo "<form action='{$_SERVER['PHP_SELF']}?Depots=$depotString' method='post'>";}}<br />
# In einem [[Cookie]]: Gesetzt wird ein Cookie mit {{isyn|lang=php|code=setcookie("Schlüssel", "Wert")}}, ausgelesen über die Superglobal {{isyn|lang=php|code=$_COOKIE['Schlüssel']}}<ref group="PHP">[http://de2.php.net/manual/de/function.setcookie.php setcookie]</ref>.<br />
# Im Superglobal $_SESSION: Dazu muss in der aufrufenden Seite mit {{isyn|lang=php|code=session_start();}} eine Sitzung initialisiert werden, und in der Zieldatei ebenfalls mit {{isyn|lang=php|code=session_start();}} die Sitzung forgesetz werden<ref group="PHP">[http://de2.php.net/manual/de/function.session-start.php session_start]</ref>.<br />
<br />
== Fußnoten ==<br />
Siehe [[Hilfe:Bearbeiten|Bearbeitungshilfe]]<br />
<references><br />
<!-- <ref name="fehler">TODO: Wie werden Laufzeitfehler, Debuggerausgaben usw ohne IDE angezeigt. --><br />
</references><br />
<!-- Alternative können die Referenzadressen direkt im Text zwischen <ref> und </ref> eingegeben werden, dann muss hier nur ein leeres Tag <references /> stehen. --><br />
== Quellen ==<br />
Aus dem Online [http://de2.php.net/manual/de/ PHP-Handbuch].<br />
<references group="PHP"><br />
<!-- <ref name="QObject">[http://doc.qt.nokia.com/4.7/qobject.html QObject Class Reference]</ref> --><br />
</ references><br />
[[Kategorie:PHP]]</div>SysOpGerthttp://wiki.ggf-controls.de/index.php?title=Zeichenketten_(PHP)Zeichenketten (PHP)2017-03-27T17:31:56Z<p>SysOpGert: 1 Version: Neuinstallation</p>
<hr />
<div>Zeichenketten (strings) können auf 4 Arten definiert werden:<br />
==Apostroph<ref>Das Zeichen über #.</ref>==<br />
Zeichenketten geklammert wie ''<nowiki>'</nowiki>Dies ist ein Text ohne $var Auswertung<nowiki>'</nowiki>'' werden so verwendet wie eingegeben. Eine Auswertung von Variablen findet nicht statt. Escaped werden nur ' und \.<br />
==Anführungszeichen<ref>Beide oben, das Zeichen über der 2.</ref>==<br />
In Zeichenketten geklammert wie {{isyn|lang=php|code=echo "Dies ist ein Text mit $var1 und {$arr['key']} Auswertung";}} werden Variablen ausgewertet, auch Arrays. Wenn es zu Konflikten mit dem Schlüssel, der ja auch ein String ist, kommt, ist eine Möglichkeit die Variable in geschweifte Klammern einzubinden<ref name="curly" />.<br />
<br />
Da es egal ist, ob die Attributwerte in HTML-Tags mit Apostroph (') oder Anführungszeichen (") gerahmt sind, sollte man in diesen Zeichenketten innerhalb HTML-Tags immer Apostrophs verwenden: {{isyn|lang=php|code=echo "<input type='submit' name='Button' value='$Press'>\n";}}.<br />
<br />Es stehen die Standard-Escaped-Steuerzeichen wie \n zur Verfügung.<br />
<br />
Funktionen werden nie ausgewertet. Aber man kann die Funktionsaufrufe mit dem [[#Operatoren|Operator '.']] verketten. Dann werden die Rückgabewerte zu einem String verbunden. ZB.: {{isyn|lang=php|code=echo "<p>" . func1() . func2() . "</p>\n";}}.<br />
<br />Als Alternative gibt es anonyme Funktionen, die einer Variablen zugeordnet sind:<br />
{{isyn|lang=php|code=$var = function($parm) {...};}}. Die Verwendung von {{isyn|lang=php|code=$var}} innerhalb der Anführungszeichen ruft dann die Funktion auf und wertet das Ergebnis wie eine Variable aus. Erstaunlicherweise findet diese Auswertung nicht in selbstgeschriebenen Funktionen statt.<br />
<br />
Falls die Variable vom Typ ''bool'' ist, wird für {{isyn|lang=php|code=true}} 1 ausgegeben, und für {{isyn|lang=php|code=false}} gar nichts!<br />
<br />
==Heredoc==<br />
==Nowdoc==<br />
==Operatoren==<br />
Verkettung zweier Zeichenketten mit '.' gibt einen neuen String zurück, Verkettung mit '.=' hängt an den linken String den rechten an.<br />
<br />
<syntaxhighlight lang="mysql"><br />
</syntaxhighlight><br />
<br />
== Fußnoten ==<br />
Siehe [[Hilfe:Bearbeiten|Bearbeitungshilfe]]<br />
<references><br />
<ref name="curly">Für mich die sauberste und generell gültige Methode. Aber es gibt auch andere.</ref><br />
</references><br />
== Quellen ==<br />
Siehe [[Hilfe:Bearbeiten|Bearbeitungshilfe]]<br />
<references group="QtR"><br />
<!-- <ref name="QObject">[http://doc.qt.nokia.com/4.7/qobject.html QObject Class Reference]</ref> --><br />
</ references><br />
[[Kategorie:PHP]]</div>SysOpGerthttp://wiki.ggf-controls.de/index.php?title=DoxygenDoxygen2017-03-27T17:31:55Z<p>SysOpGert: 1 Version: Neuinstallation</p>
<hr />
<div>[[Kategorie:Tools]]<br />
Ein wundervolles Dokumentationswerkzeug von [http://www.stack.nl/~dimitri/doxygen/index.html Dimitri van Heesch]. Vielen Dank für diese Hilfe.<br />
== Installation ==<br />
=== Kubuntu <ref>getestet für 12.04</ref> ===<br />
Doxygen ist in den Ubuntu-Paketquellen vorhanden, aber es wird das Paket doxygen-latex empfohlen, und das ist riesig. Wenn man LaTex nicht benötigt, sollte man darauf verzichten. Leider werden von der Muon-Paketverwaltung<ref>Wahrscheinlich der Ubuntu-Paketverwaltung.</ref> auch empfohlen Pakete mit installiert. Ein Ausweg ist die Installation über die Konsole:<br />
{{Eingabe|sudo apt-get install --no-install-recommends doxygen}}<br />
Dagegen wird das Paket GraphViz mit dem Tool '''dot''' nicht mitinstalliert, welches Doxygen für die wundervollen Vererbungsgraphen nutzt. Sollte also zusätzlich installiert werden.<br />
<br />Verwendet wird '''dot''' erst, nachdem in der Konfigurationsdatei HAVE_DOT = YES gesetzt wird.<br />
<br />
== Gebrauch ==<br />
Aufruf von<br />
{{Eingabe|doxygen }}{{Platz|Konfigurationsdatei}}<br />
in der Kommandozeile erzeugt und verknüpft Dokumentation zu allen Dateien mit der in der {{Platz|Konfigurationsdatei}} angegebenen Endung. Wenn in der {{Platz|Konfigurationsdatei}} 'RECURSIVE = YES' gesetzt ist, werden auch die Unterordner durchsucht. Wenn {{Platz|Konfigurationsdatei}} weggelassen wird, wird eine Datei namens 'Doxyfile' verwendet.<br />
<br />
== Einstellungen ==<br />
{{Eingabe|doxygen -g}} erzeugt eine projekteigene Konfigurationsdatei namens Doxyfile, in der eine Menge "tags" stehen, mit denen Doxygen eingestellt werden kann. zB.<br />
* PROJECT_NAME = "{{Platz|Projektname}}": Die Überschrift aller Seiten.<br />
* JAVADOC_AUTOBRIEF = YES: Der 1. Satz (bis zum 1. Punkt, wenn ein . Teil der Kurzbeschreibung sein soll, muss man ihn mit nachfolgendem \ und Leerzeichen kennzeichnen) wird als Kurzbeschreibung verwendet und taucht ganz oben und in der Auflistung auf<ref >In Kommentaren im JavaDoc - Stil /** <Kommentar> */</ref>.<br />
* EXTRACT_ALL = YES: Auch nicht kommentierte Klassen werden in die Dokumentation aufgenommen. Das ist hilfreich, wenn auch Kommentar fehlt, so wird doch die Klassenhierarchie dargestellt.<br />
* EXTRACT_STATIC = YES: Auch statische Member werden dokumentiert.<br />
* RECURSIVE = YES: Dateien werden auch in Unterordnern gesucht.<br />
* HAVE_DOT = YES: Erzeugung von Graphen mittels '''dot''' (mehr und bessere Graphen).<br />
* HIDE_UNDOC_RELATIONS = NO: Nur dann werden auch die Klassen aus Bibliotheken in die Graphen mit aufgenommen. Sehr wichtig für Qt, wo fast alles von Klassen aus den Qt-Bibliotheken abgeleitet wird.<br />
=== Navigationsleiste ändern ===<br />
{{Eingabe|doxygen -l}} erzeugt eine projekteigene Layoutdatei namens DoxygenLayout.xml. Diese Datei wird beim Aufruf geladen<ref>Mit Tag 'LAYOUT_FILE' im Doxyfile kann die Layoutdatei ausgwählt werden, Vorgabe DoxygenLayout.xml.</ref>. Modifikationen dieser Datei ändern das Erscheinungsbild der Dokumentation.<br />
<br /><nowiki><tab>-Elemente</nowiki> im <nowiki><navindex>-Element</nowiki> in dieser Datei sind die Abschnitte der Navigationsleiste. Es können eigene Elemente mit Attribut 'user' hinzugefügt werden:<br />
{{Bsyn|lang="xml"|code=<tab type="user" url="Buchhaltung.zip" title="Download"/>}}<br />
== Kommentarformate ==<br />
Eine SEHR beschränkte Auswahl der Möglichkeiten entsprechend MEINER Präferenz! Andere mögen anderes vorziehen.<br />
*Javadoc Kommentare (über dem Objekt): /** {{Platz|Kommentar}} */<br />
<syntaxhighlight lang="cpp"><br />
/** Beschreibung zur Nummer */<br />
int number;<br />
</syntaxhighlight><br />
*Javadoc Kommentare hinter dem Objekt: ///< {{Platz|Kommentar}}<br />
<syntaxhighlight lang="cpp"><br />
int number; ///< Kurzbeschreibung zur Nummer<br />
</syntaxhighlight><br />
Kommentare können im Prinzip an jeder beliebigen Stelle stehen, dann muss mit einem [[#Spezielle Kommandos|Special Command]] die Zuordnung benannt werden.<br />
<br />Special Command [http://www.stack.nl/~dimitri/doxygen/commands.html#cmdfile \file] ist zB. die einzige Möglichkeit, eine Datei zu kommentieren.<br />
{{Bsyn|lang=cpp|code=/** \file datei.h<br />
*Kommentar....<br />
*/}}<br />
In die Projektseite ''index.html''<ref>Die Seite, die zuerst aufgerufen wird.</ref> wird mit [http://www.stack.nl/~dimitri/doxygen/commands.html#cmdmainpage \mainpage] Kommentar eingefügt.<br />
<br />
== Spezielle Kommandos ==<br />
beginnen mit einem \ oder @. Es gibt eine Unmenge von [http://www.stack.nl/~dimitri/doxygen/commands.html Special Commands], die das Aussehen der Dokumentation beeinflussen. Einige Beispiele:<br />
*[http://www.stack.nl/~dimitri/doxygen/commands.html#cmdparam \param] : Für die Parameter einer Funktion / Methode.<br />
*[http://www.stack.nl/~dimitri/doxygen/commands.html#cmdreturn \return] : Für den Rückgabewert einer Funktion / Methode.<br />
<syntaxhighlight lang="cpp"><br />
/** Kurzbeschreibung. Ausführliche Beschreibung.<br />
\param c a character.<br />
\param n an integer.<br />
\exception std::out_of_range parameter is out of range.<br />
\return a character pointer. */<br />
char* Funktion(char c, int n);<br />
</syntaxhighlight><br />
Spezielle Kommandos können Parameter haben, wobei unterschieden wird zwischen:<br />
* Einzelwörter: im [http://www.stack.nl/~dimitri/doxygen/manual/commands.html Doxygen Manual] mit <spitzen> Klammern gekennzeichnet.<br />
* Texte bis zum Ende der Zeile: Im [http://www.stack.nl/~dimitri/doxygen/manual/commands.html Manual] mit (runden) Klammern gekennzeichnet.<br />
* Paragraphen: Ein Paragraph reicht bis zur nächsten Leerzeile oder dem nächsten Kommando. Im [http://www.stack.nl/~dimitri/doxygen/manual/commands.html Manual] mit {geschweiften} Klammern gekennzeichnet.<br />
[Eckige] Klammern kennzeichnen optionale Parameter.<br />
=== Code-Teile übernehmen ===<br />
Oft ist es sinnvoll, in die Dokumentation {{Tooltip|Ausschnitte|Snippets}} aus dem eigentlichem Programm-Code zu übernehmen, als Beispiel oder um Hilfetexte nicht wiederholen zu müssen. Eine Möglichkeit ist<br />
*[http://www.stack.nl/~dimitri/doxygen/manual/commands.html#cmddontinclude \dontinclude {{Platz|file}}]: Setzt einen internen Zeiger auf den Anfang von {{Platz|file}}.<br />
in Verbindung mit<br />
*[http://www.stack.nl/~dimitri/doxygen/manual/commands.html#cmdskip \skip {{Platz|pattern}}]: Setzt in {{Platz|file}} den internen Zeiger auf die nächste Zeile mit {{Platz|pattern}}.<br />
*[http://www.stack.nl/~dimitri/doxygen/manual/commands.html#cmdskipline \skipline {{Platz|pattern}}]: Setzt in {{Platz|file}} den internen Zeiger auf die nächste Zeile mit {{Platz|pattern}} und fügt diese ein.<br />
*[http://www.stack.nl/~dimitri/doxygen/manual/commands.html#cmduntil \until {{Platz|pattern}}]: Fügt alle Zeilen aus {{Platz|file}} ab dem internen Zeiger bis zur Zeile mit {{Platz|pattern}} inklusive ein.<br />
*[http://www.stack.nl/~dimitri/doxygen/manual/commands.html#cmdline \line {{Platz|pattern}}]: Fügt die 1. nicht leere Zeile mit {{Platz|pattern}} hinter dem internen Zeiger ein.<br />
<br />
<syntaxhighlight lang="cpp"><br />
/** Klasse AccountAddChangeDialog: Kurzbeschreibung. Ausführliche Beschreibung.<br />
* Quellcode zur Klasse in Datei accountaddchangedialog.cpp öffnen:<br />
* \dontinclude accountaddchangedialog.cpp<br />
* Einbinden des Hilfetextes von 'cbAccounts':<br />
* \skip ui->cbAccounts->setWhatsThis(<br />
* \until )<br />
* Einbinden des Hilfetextes von 'checkDelete':<br />
* \skip ui->checkDelete->setWhatsThis(<br />
* \until )<br />
*/<br />
</syntaxhighlight><br />
fügt die Befehle zum Setzen der [[Anwendungshilfe (Qt)#QWhatsThis|WhatsThis]] inklusive der Texte in die Doku ein.<br />
<br />Damit das alles funktioniert, muss in der Konfigurationsdatei (zB. Doxyfile) der Beispielpfad gesetzt werden, geht auch mit '.' für den aktuellen Ordner:<br />
*EXAMPLE_PATH = /Pfad/zum/Ordner oder<br />
*EXAMPLE_PATH = .<br />
*EXAMPLE_RECURSIVE = YES<br />
<br />
=== Test ===<br />
Es ist sinnvoll, jede Methode zu testen, erscheint sie auch noch so simpel. Um eine Testbeschreibung einzufügen, wichtig für die Reproduzierbarkeit, gibt es das Kommando [http://www.stack.nl/~dimitri/doxygen/manual/commands.html#cmdtest \test]. Damit wird der nachfolgende [[#Spezielle Kommandos | Paragraph]] gekennzeichnet und eine Kopie in einer '''Test-Liste''' angelegt. '''Test-Liste''' ist über den Abschnitt '''Zusätzliche Informationen''' erreichbar.<br />
=== Bilder ===<br />
Mit [http://www.stack.nl/~dimitri/doxygen/manual/commands.html#cmdimage \image] können Bilder in die Dokumentation aufgenommen werden. Es muss das Ausgabeformat,<br />
zB. html und der Dateinamen benannt werden, eine Unterschrift und Größe ist optional:<br />
{{Bsyn|lang=xml|code=\image html bild.png}}<br />
Es können die Bildformate verwendet werden, die der Browser unterstützt.<br />
<br />Damit das alles funktioniert, muss in der Konfigurationsdatei (zB. Doxyfile) der Bilderpfad gesetzt werden:<br />
*IMAGE_PATH = /Pfad/zum/Ordner<br />
<br />
== Kommentarformatierung ==<br />
Es sind eine große Anzahl von [http://www.stack.nl/~dimitri/doxygen/manual/htmlcmds.html HTML-Tags] zulässig, zB. <nowiki><table> oder <H1></nowiki>.<br />
<br />Es können [http://www.stack.nl/~dimitri/doxygen/manual/lists.html Listen] mit HTML-Tags, den Special Commands [http://www.stack.nl/~dimitri/doxygen/commands.html#cmdli \li] oder [http://www.stack.nl/~dimitri/doxygen/commands.html#cmdarg \arg] oder mit -(Aufzählungszeichen) und -#(nummeriert) erzeugt werden<ref>Die in der [http://www.stack.nl/~dimitri/doxygen/manual/markdown.html#md_lists doxygen-Dokumentation unter Markdown-Support] beschriebenen Möglichkeiten +, *, 1. funktionieren bei mir (doxygen 1.7.6.1, Kubuntu 12:04) nicht</ref>. Bei -, -# gibt der Spalteneinzug die Aufzählungsebene an.<br />
<br />Wenn man für Doxygen reservierte Zeichen verwenden will, muss man sie mit \ maskieren.<br />
=== Automatische Link-Erzeugung ===<br />
Falls innerhalb einer Beschreibung Namen von Klassen und ihrer {{Tooltip|Mitglieder|Member}}, Funktionen, Typdefinition und Dateien verwendet werden, die in der Dokumentation vorkommen, werden automatisch Links auf deren Dokumentationsseiten erzeugt. Das funktioniert unter Linux<ref>Kubuntu 14.04, Doxygen 1.8.6</ref> problemlos, unter Windows<ref>Win7, Doxygen 1.8.11</ref> weigert sich Doxygen aber, {{Tooltip|Erweiterung .h|Header-Dateien}} zu verlinken. {{Tooltip|Umgehungslösung|Workaround}} ist das spezielle Kommandopaar [http://www.stack.nl/~dimitri/doxygen/manual/commands.html#cmdlink \link] - [http://www.stack.nl/~dimitri/doxygen/manual/commands.html#cmdendlink \endlink] um den Dateinamen. Dann wird auf die 1. Seite<ref>Ich habe noch keinen Weg gefunden, Dateien gleichen Namens, aber aus unterschiedlichen Ordnern, zu unterscheiden.</ref> verlinkt, die den Dateinamen enthält, bzw. die allererste Seite, wenn die Datei nicht dokumentiert ist.<br />
== Fußnoten ==<br />
<references /></div>SysOpGerthttp://wiki.ggf-controls.de/index.php?title=Subversion_(SVN)Subversion (SVN)2017-03-27T17:31:55Z<p>SysOpGert: 1 Version: Neuinstallation</p>
<hr />
<div>[[Kategorie:Tools]]<br />
Subversion ist ein Tool zur Versionsverwaltung und stellt sicher, dass mehrere Personen gleichzeitig und parallel an einem Projekt arbeiten können. Hauptaufgaben sind:<br />
*Jeder Stand eines Projektes wird archiviert, je nach Programm nur die Änderungen: Dadurch ist es jederzeit möglich, auf alte Versionen zurückzugreifen.<br />
*Koordinierung des gemeinsamen Zugriffs von mehreren Entwicklern auf die Dateien: Konflikte bei gleichzeitigem Speichern werden automatisch gelöst oder für manuelle Bearbeitung gemeldet.<br />
*Gleichzeitige Entwicklung mehrerer Entwicklungszweige (engl. Branches) eines Projektes: Die unterschiedlichen Zweige können wieder zusammengeführt werden.<br />
Subversion besteht aus einem Server, der die verschiedenen Versionen und Entwicklungszweige im {{Tooltip|Repository|Projektarchiv}} speichert und verwaltet, und Clients zur {{Tooltip|Checkout|Erstellung}}/{{Tooltip|Update|Erneuerung}} und {{Tooltip|Commit|Übergabe}} von Arbeitskopien.<br />
<br />
== Eigenschaften ==<br />
Automatische Übernahme der Eigenschaften wird erreicht, in dem in '''config''' {{Eingabe|1=enable-auto-props = yes}} eingetragen wird und im Abschnitt <nowiki>[auto-props]</nowiki> ausgewählt wird, welche Datei welche Eigenschaft übernimmt. Dann werden beim Hinzufügen (und nur dann) einer Datei zur Versionskontrolle die Eigenschaften übernommen.<br />
<br />'''config''' findet man unter:<br />
*Windows7: ...\Anwendungsdaten\Subversion\<br />
*Linux: /etc/subversion (global) oder ~/.subversion (nutzerspezifisch).<br />
Die Eigenschaften können nur in der Arbeitskopie geändert werden, eine Änderung fügt die Datei der {{Tooltip|Commit|Übergabe}}liste hinzu.<br />
=== Schlüsselwörter ===<br />
in einer Datei werden bei der Übergabe durch einen entsprechenden Text ersetzt. Mögliche Schlüsselwörter sind<br />
* $Author$<br />
* $Date$<br />
* $Revision$<br />
* $URL$<br />
* $Id$: eine verkürzte Zusammenfassung der obigen.<br />
Indem ein doppelter Doppelpunkt (::) nach dem Namen des Schlüsselwortes geschrieben wird, dem eine Anzahl von Leerzeichen folgt, definieren diese eine feste Breite. Falls der ersetzte Wert zu lang ist, wird er mit einem speziellen Nummernzeichen (#) unmittelbar vor dem letzten Dollarzeichen abgeschnitten<ref group="svnbook">[http://svnbook.red-bean.com/de/1.6/svn.advanced.props.special.keywords.html Subversion Book -> Ersetzung von Schlüsselwörtern]</ref>.<br />
<br />
Um für eine Datei unter Versionsverwaltung die Schlüsselwörter zu aktivieren, müssen in die Eigenschaft svn:keywords die gewünschten Schlüsselwörter eingetragen werden<ref name="EigenschaftOrdner" />. Wenn in svn:keywords die Schlüsselwörter fehlen, wird der Schlüsselwortinhalt gelöscht und damit doch die Datei verändert.<br />
<br />
== Globale Versionsnummer ==<br />
Die letzte (höchste) Versionsnummer aller Dateien einer Arbeitskopie kann mit dem Komandozeilen-Tool '''svnversion'''<ref>Hilfe: <code>svnversion -h</code></ref> abgefragt werden. Nur nach einem Update wird eine eindeutige Nummer ausgegeben, sonst ein Bereich aus aktualisierten und übertragenen Versionen (168:171).<ref name="inDatei" /><ref>[[Erstellen einer Anwendung (Qt)#Build automatisieren| Automatisieren mit Qt Creator]]</ref><br />
<br />
== Ein lokales Repository ==<br />
Es macht durchaus Sinn, auch auf einem Einzelplatzrechner ein {{Tooltip|Archiv|Repository}} anzulegen, zB. um ältere Stände leicht zu rekonstruieren, Änderungen erst mal in Parallelzweigen auszuprobieren oder für ein einfaches Backup.<br />
<br />Für dieses {{Tooltip|Archiv|Repository}} benötigen wir keine sichere Passwortabfrage, aber es soll der Autor der Änderung gespeichert werden, also kein anonymer Zugriff.<br />
<br />Aber wir benötigen einen Server. Bei '''TortoiseSVN''' ist dieser Server im Paket enthalten, unter Linux reicht uns '''svnserve''' aus dem Paket '''Subversion'''.<br />
=== svnserve ===<br />
'''svnserve''' muss manuell<ref>Es kann natürlich auch über die Startscripts gestartet werden, siehe [http://wiki.ubuntuusers.de/Subversion#svnserve Ubuntuusers]. Aber so häufig werden wir es nicht benutzen, das sich ein ständiger Daemon lohnt.</ref> im Terminal gestartet werden mit<br />
{{Bsyn|lang=bash|code=svnserve -d -r /Wurzelpfad/der/Repository/}}<br />
Voreinstellung ist, das Passwörter in KWallet<ref>bzw. gnome-keyring bei Ubuntu</ref> gespeichert werden. Das ist für ein lokales {{Tooltip|Archiv|Repository}} eher lästig (wer will schon ständig seinen Passwort-Save öffnen), deshalb erlauben wir das Speichern eines Klartext-Passworts mit <code>store-plaintext-passwords = yes</code> in /etc/subversion/servers oder ~/.subversion/servers.<br />
<br />
== Dateien unter Versionsverwaltung stellen ==<br />
# Ein leeres Repository erstellen.<br />
# Eine Arbeitskopie erstellen (checkout).<br />
# Dateien in die Arbeitskopie verschieben oder neu erstellen.<br />
# Dateien zum Repository hinzufügen (add).<br />
<br />
== Benutzung Kommandozeile ==<br />
=== Status ===<br />
{{Isyn|lang=bash|code=svn status}} gibt den aktuellen Status geänderter Dateien aus. Die Buchstaben der Ausgabe bedeuten:<br />
*'''?''' Die Datei, das Verzeichnis oder der symbolische Link item ist nicht unter Versionskontrolle.<br />
*'''A''' Die Datei, das Verzeichnis oder der symbolische Link item ist zum Hinzufügen in das Projektarchiv vorgemerkt.<br />
*'''C''' Die Datei item befindet sich in einem Konfliktzustand. D.h., Änderungen, die vom Server bei einer Aktualisierung empfangen wurden, überlappen sich mit lokalen Änderungen, die Sie in Ihrer Arbeitskopie haben (und konnten beim Aktualisieren nicht automatisch aufgelöst werden). Sie müssen den Konflikt auflösen, bevor Sie Ihre Änderungen in das Projektarchiv übergeben können.<br />
*'''D''' Die Datei, das Verzeichnis oder der symbolische Link item ist zum Löschen im Projektarchiv vorgemerkt.<br />
*'''M''' Der Inhalt der Datei ist geändert worden.<br />
=== Übergeben ===<br />
{{Isyn|lang=bash|code=svn commit -m "Kommentar"}} {{Tooltip|commits|übergibt}} die Änderungen an das {{Tooltip|Repository|Projektarchiv}}. Es muss mit der Option -m ein {{Tooltip|Kommentar zur Revision|Log-Eintrag}} mitgegeben werden, oder es wird Editor<ref>Unter Linux zB. '''nano'''.</ref> für die Eingabe geöffnet. Dann einfach in die 1. Zeile den Kommentar schreiben und speichern. In der temporären(?) Datei stehen auch der [[#Status|Status]] der zu übergebenden Dateien.<br />
<br />
== Benutzung TortoiseSVN (MS-Windows<ref>Windows7</ref>) ==<br />
'''Gilt nicht mehr ab Version 1.7.4:''' Enthält keine Komandozeilen-Tools, bei Bedarf muss ein zusätzliches Paket installiert werden, zB. [http://www.sliksvn.com Slik SVN].<br />
<br />
TortoiseSVN integriert SVN in die MS-Windows-Oberfläche. Im Datei-Explorer wird der Status der Dateien durch kleine Symbole angezeigt und das Kontextmenü enthält alle SVN-Befehle.<br />
=== Zugangsberechtigungen ===<br />
Unter Windows speichert der Subversion-Client Passwörter im Verzeichnis %APPDATA%/Subversion/auth/. Unter Windows 2000 und dessen Nachfolger verwendet der Subversion-Client die Standard-Kryptographiedienste von Windows, um das Passwort auf der Festplatte zu verschlüsseln. Da der Schlüssel durch Windows verwaltet wird und mit den benutzereigenen Zugangsdaten verknüpft ist, kann nur der Benutzer selbst das zwischengespeicherte Passwort entschlüsseln. (Beachten Sie, dass beim Zurücksetzen des Windows-Benutzerkonto-Passworts durch einen Administrator alle zwischengespeicherten Passwörter nicht mehr zu entschlüsseln sind. Der Subversion-Client verhält sich dann so, als wären sie nicht vorhanden und fragt die Passwörter gegebenenfalls ab.)<ref group="svnbook">[http://svnbook.red-bean.com/de/1.6/svn.serverconfig.netmodel.html#svn.serverconfig.netmodel.credcache Subversion Book]</ref><br />
=== Änderungen rückgängig machen ===<br />
# Alle nicht abgegebene Änderungen in der Arbeitskopie entfernen (zurück auf die letzte Version im Repository):<br />
#* Auf Datei mit rechter Maustaste -> TortoiseSVN -> Revert<br />
# Auf eine vorherige Version zurückgehen:<br />Die Datei wird auf den alten Inhalt zurückgeändert und als geändert markiert, dh. sie hat jetzt den neuesten Revisionsstand. Die Änderung kann mit [[Subversion (SVN)#Revert|<code>Revert</code>]] rückgängig gemacht werden.<br />
#* Auf Datei mit rechter Maustaste -> TortoiseSVN -> Show log<br />
#* Auf gewünschte Version mit rechter Maustaste -> Revert to this Revision -> Yes<br />
=== Alte Versionen ansehen ===<br />
# Eine vorherige Version laden:<br />Die Datei wird nicht als geändert gekennzeichnet und somit beim nächsten Update wieder überschrieben. Nur zum Ansehen, muss hinterher mit <code>Update</code> wieder auf aktuellen Stand gebracht werden. Änderungen nicht möglich. Besser ist <code>Save revision to ..</code>.<br />
#* Auf gewünschte Version mit rechter Maustaste -> Update to Revision -> Version eingeben<br />
# Eine vorherige Version speichern:<br />
#* Auf Datei mit rechter Maustaste -> TortoiseSVN -> Show log<br />
#* Auf gewünschte Version mit rechter Maustaste -> Save revision to ..<br />
<br />
== Benutzung kdesvn (Linux<ref>Kubuntu 12:04</ref>) ==<br />
Als Client und Bedieneroberfläche benutzen wir '''kdesvn''' aus dem gleichnamigen Paket.<br />
=== Repository anlegen: ===<br />
{{Menüaktion|Datei -> Subversion-Admin -> Erstelle und öffne ein neues Repository}}.<br />
<br />Dieses noch leere {{Tooltip|Archiv|Repository}} checken wir dann in unsere Arbeitskopie aus und fügen die gewünschten Dateien hinzu.<br />
*Im Dateimanager: Im Arbeitkopieordner mit rechtem Mausklick -> Checkout (kdesvn)<br />
*In '''kdesvn''': Entweder Werkzeugleistensymbol '''Auschecken''' oder besser mit '''Subversion->Repository->Checke aktuellen Repository-Pfad''' im Menü.<br />Es öffnet sich immer ein Fenster. Zu beachten ist, das in dem Feld URL die Adresse mit '''ksvn+file:''' beginnt, sonst gibt es die Fehlermeldung '... ist kein Repository'. Bei der Menüvariante wird dies automatisch gesetzt, auch der ausgewählte Zweig (zB. trunk), bei 'Dateiauswahl' nicht. Trunk kann dann manuell an die URL angehängt werden, um nur den Hauptpfad auszuchecken.<br />Wenn die Checkbox mit dem eigenartigem Text "Füge Quell-URL an das Unterverzeichnis an" gesetzt ist (Default-Einstellung), wird der ausgewählte Zweig an den Ordnernamen der Arbeitskopie angehängt. Ich will das eher nicht, wenn ich 'trunk' auschecke, also Häkchen entfernen.<br />
<br />Voreinstellung für ein neues {{Tooltip|Archiv|Repository}} in {{Platz|/Pfad/zu/Repository}}/conf/svnserv.conf ist: anonyme Nutzer können lesen (<code>anon_access = read</code>), authorisierte Lesen und Schreiben (<code>auth_access = write</code>). Das soll auch so bleiben, wenn wir anonymen Nutzern Schreibzugriff gewähren, wird kein Autor eingetragen. Aber wir müssen eine Passwort-Datei festlegen mit <code>password-db = passwd</code> und in der Passwort-Datei (hier {{Platz|/Pfad/zu/Repository}}/conf/passwd) müssen wir einen Nutzer mit seinem Passwort eintragen mit <code>{{Platz|user}} = {{Platz|pass}}</code>. In svnserv.conf tragen wir auch noch einen {{Tooltip|Bereich(?)|realm}} ein: <code>realm = {{Platz|zB. Programmtitel}}</code>.<br />
<br />
== Benutzung Qt Creator (Linux<ref>Wahrscheinlich auch unter Windows, aber nicht getestet.</ref>) ==<br />
Wenn der Projektordner eine Arbeitsplatzkopie eines Repository ist, bietet der Qt Creator unter {{Menüaktion|Extras -> Subversion}} die gängigsten Befehle. Voraussetzung ist natürlich, dass Subversion installiert ist und das unter {{Menüaktion|Extras -> Einstellungen -> Versionskontrolle -> Subversion}} der richtige Befehl 'svn', unter Umständen mit vollständigem Pfad, eingetragen ist.<br />
Am besten den Ordner ohne Dateien auschecken und dann das Projekt in diesem Ordner anlegen. Es kann auch nachträglich der Projektordner zur Arbeitskopie gemacht werden, Extras->Subversion wird aber anscheinend erst nach Neustart sichtbar. <br />
== Fußnoten ==<br />
<references><br />
<ref name="inDatei">Versionsnummer in eine Datei schreiben: {{Isyn|lang=bash|code=svnversion > Dateiname}} oder anhängen: {{Isyn|lang=bash|code=svnversion >> Dateiname}}</ref><br />
<ref name="EigenschaftOrdner">Es können für alle Dateien in einem Ordner die Eigenschaft geändert werden. Dazu muß im Kontextmenü des Ordners Eigenschaften->Subversion->Properties ausgewählt werden. Im Eigenschaften-Editor (geöffnet nach "new" oder "edit") muß dann "... recursively" angekreuzt werden.</ref><br />
</references><br />
== Qellen ==<br />
*TortoiseSVN<br />
<references group="Tortoise" /><br />
*Version Control with Subversion<br />
<references group="svnbook" /></div>SysOpGerthttp://wiki.ggf-controls.de/index.php?title=Daten_(SQL)Daten (SQL)2017-03-27T17:31:55Z<p>SysOpGert: 1 Version: Neuinstallation</p>
<hr />
<div>[[Kategorie:Datenbanken]]<br />
If you access a column from the table to be updated in an expression, UPDATE uses the current value of the column. For example, the following statement sets col1 to one more than its current value:<br />
<br />
UPDATE t1 SET col1 = col1 + 1;<br />
<br />
The second assignment in the following statement sets col2 to the current (updated) col1 value, not the original col1 value. The result is that col1 and col2 have the same value. This behavior differs from standard SQL.<br />
<br />
UPDATE t1 SET col1 = col1 + 1, col2 = col1;<br />
<br />
Single-table UPDATE assignments are generally evaluated from left to right. For multiple-table updates, there is no guarantee that assignments are carried out in any particular order.<br />
== Daten einfügen ==<br />
*für beliebige Spalten: {{Isyn|lang=sql|code=INSERT INTO `Tabelle` (Spalte3, Spalte5, Spalte7, Datumspalte) VALUES(Wert3, Wert5, Wert7, date('now'))}}<br />
{{Isyn|lang=sql|code=date('now')}} fügt das aktuelle Datum als Wert ein.<br />
== Daten anzeigen ==<br />
Beliebige Spalten können in beliebiger Reihenfolge mit {{Isyn|lang=mysql|code=SELECT `Spalte3`, `Spalte5`, `Spalte1` FROM `Tabelle` WHERE `Spalte2` == '4711' ORDER BY `Spalte1` LIMIT '100' OFFSET '50'}} angezeigt werden. Das Ergebnis sind dann die ausgewählte Spalten aller Datensätze mit folgenden Bedingungen: <br />
*WHERE benennt das Auswahlkriterium für die Datensätze.<br />
*ORDER BY bestimmt die Spalte, nach der das Ergebnis sortiert wird. Es können mehrere Spalten mit Komma getrennt angegeben werden, die folgende bestimmt die Reihenfolge innerhalb der vorhergehenden.<br />
*LIMIT, OFFSET begrenzt das Ergebnis auf LIMIT Datensätze ab OFFSET Datensatz des Ergebnisses.<br />
Alle Bedingungen sind optional, {{Isyn|lang=mysql|code=SELECT * FROM `Tabelle`}} zeigt alle Spalten aller Datensätze an.<br />
Mehrere SELECT-Abfragen können durch<br />
*UNION Alle SELECT-Ergebnisse werden zu einem Gesammtergebnis zusammengefasst, aber doppelte Datensätze werden entfernt.<br />
*UNION ALL Wirklich alle SELECT-Ergebnisse, auch doppelte Datensätze.<br />
*INTERSECT Die Schnittmenge der Ergebnisse.<br />
*EXCEPT Alle Datensätze der 1. (linken) Abfrage, die nicht auch in der 2. (rechten) Abfrage vorkommen.<br />
zwischen den SELECT .... zu einem Ergebnis zusammengefasst werden, wenn sie die gleichen Ergebnis-Spalten haben.<br />
Wenn mehr als zwei SELECT verwendet werden, werden sie von links nach rechts abgearbeitet (((A UNION B) UNION C) UNION D).<br />
Wenn ORDER BY und LIMIT verwendet werden, müssen die einzelnen Abfragen geklammert werden<ref>[[SQLite_Besonderheiten#Zusammengesetztes_SELECT|Besonderheit SQLite]]</ref>.<br />
== Fußnoten == <br />
<references><br />
<!-- <ref name="fehler">TODO: Wie werden Laufzeitfehler, Debuggerausgaben usw ohne IDE angezeigt. --><br />
</references><br />
<!-- Alternative können die Referenzadressen direkt im Text zwischen <ref> und </ref> eingegeben werden, dann muss hier nur ein leeres Tag <references /> stehen. --><br />
== Quellen ==<br />
[http://dev.mysql.com/doc/refman/5.7/en/index.html MySQL] und [http://www.sqlite.org/lang.html SQLite]<br />
<references group="QtR"><br />
<!-- <ref name="QObject">[http://doc.qt.nokia.com/4.7/qobject.html QObject Class Reference]</ref> --><br />
</ references></div>SysOpGerthttp://wiki.ggf-controls.de/index.php?title=MySQL_BesonderheitenMySQL Besonderheiten2017-03-27T17:31:55Z<p>SysOpGert: 1 Version: Neuinstallation</p>
<hr />
<div>[[Kategorie:Datenbanken]]<br />
Fremdschlüssel sind nur in InnoDB-Tabellen möglich.</div>SysOpGerthttp://wiki.ggf-controls.de/index.php?title=SQLite_BesonderheitenSQLite Besonderheiten2017-03-27T17:31:55Z<p>SysOpGert: 1 Version: Neuinstallation</p>
<hr />
<div>[[Kategorie:Datenbanken]]<br />
== Zeilennummer ==<br />
*Jede Zeile hat eine eindeutige Nummer 'rowid'. Wenn der Typ einer Spalte 'INTEGER PRIMARY KEY'<ref>aber nicht 'INTEGER PRIMARY KEY DESC'(!)</ref> ist, dann entspricht der Wert in dieser Spalte der 'rowid'. Nur dann ist die Kombination von PRIMARY KEY und AUTOINCREMENT zulässig<ref group='SQLite'>[http://www.sqlite.org/lang_createtable.html#rowid INTEGER PRIMARY KEY]</ref>.<br />
*Kennt nicht Attribute 'ZERO_FILL', statt dessen kann man 'DEFAULT 0' nutzen<ref>Oder ist ZERO_FILL eine Besonderheit von mySQL?</ref>.<br />
== Datentypen und Speicherklassen ==<br />
SQLite kennt 5 Speicherklassen:<br />
*NULL.<br />
*INTEGER: Signed Integer, gespeichert in 1, 2, 3, 4, 6, oder 8 Byte abhängig vom Wert.<br />
*REAL: Fließkomma gespeichert in 8 Byte nach IEEE.<br />
*TEXT: Text string, gespeichert unter Berücksichtigung der Datenbank-Zeichenkodierung (UTF-8, UTF-16BE or UTF-16LE).<br />
*BLOB: Binärdaten (zB. Bild), werden unverändert gespeichert.<br />
<br />
SQLite verwendet ein dynamisches Typsystem, in einer Zelle können beliebig Binär-, Text, Integer- oder Real-Werte abgelegt werden. Aber einer Spalte kann eine "Typneigung" zugeordnet werden. Es stehen TEXT, NUMERIC, INTEGER, REAL und NONE zur Verfügung.<br />
*Eine Spalte mit TEXT-Neigung speichert alles als Text, Integer- oder Real-Werte werden entsprechend umgewandelt.<br />
*NUMERIC und INTEGER akzeptieren alle 5 Speicherklassen, aber konvertieren Texte, die einen Wert darstellen, in Integer oder Real, wobei Integer bevorzugt wird, wenn möglich ("30.0" wird zu 30). Alle Texte, die nicht verlustfrei in eine Zahl umgewandelt werden können, werden als Text gespeichert.<br />
*REAL wie NUMERIC, aber Zahlen werden immer in Fließkomma umgewandelt und in Speicherklasse REAL gespeichert.<br />
<br />
<br />
Die fehlende Typfestlegung und die Tatsache, dass Vergleichsoperatoren auch mit Strings glücklich werden, führt manchmal zu eigenartigen Ergebnissen: {{Bsyn|lang=sql|code=SELECT '2013' - '4' -- Ergebnis 2009<br />
SELECT strftime('%Y', '2012-04-13') -- Ergebnis 2012<br />
SELECT strftime('%Y', '2012-04-13') > '2009' -- Ergebnis 1}}<br />
Bisher sind alle Ergebnisse wie erwartet. Nun sollte man aber auch erwarten, dass {{Bsyn|lang=sql|code=SELECT strftime('%Y', '2013-04-13') > '2018' - '4' -- Ergebnis 1 !!! VERKEHRT!!!}} Ergebnis 0 (false) hat. Aber nein, Ergebnis ist 1 (true)! Eine Lösung ist die explizite Typumwandlung mit CAST: {{Bsyn|lang=sql|code=SELECT CAST(strftime('%Y', '2013-04-13') AS INTEGER) > '2018' - '4' -- Ergebnis 0}} oder {{Bsyn|lang=sql|code=SELECT strftime('%Y', '2013-04-13') > CAST('2018' - '4' AS INTEGER) -- Ergebnis 0}}<br />
== Datum und Uhrzeit ==<br />
SQLite kennt kein eigenes Format für Datum und Uhrzeit. Daten können entweder als TEXT im ISO8601-Format YYYY-MM-DD HH:MM:SS.SSS oder NUMERIC als Anzahl Tage seit 24. November 4714 B.C. (Julian days) oder Sekunden seit 1970-01-01 00:00:00 (Unix Time) gespeichert werden. Date And Time Functions bieten ein einfache Möglichkeit, mit diesen Einträgen zu rechen oder sie umzuformen: ....<br />
== Zusammengesetztes SELECT ==<br />
Bei mit UNION usw. zusammengesetzte Abfragen ist eine ORDER BY Bedingung ist nur fürs letzte SELECT zulässig.<br />
== Tabelle ändern ==<br />
SQLite kennt 'ALTER TABLE' nur zum Umbenennen der Tabelle ({{Isyn|lang=sql|code=ALTER TABLE `alter Name` RENAME TO `neuer Name`}}) oder zum hinzufügen von Spalten ({{Isyn|lang=sql|code=ALTER TABLE `Tabelle` ADD COLUMN `Spalte` REAL}}). Löschen oder Umbenennen einer Spalte oder Hinzufügen oder Entfernen eines 'CONSTRAINT' wie zum Beispiel eines [[Tabellenstruktur (SQL)#Fremdschlüssel|Fremdschlüssels]] ist nicht möglich.<ref>CONSTRAINTs müssen bei Erstellen der Tabelle angelegt werden.</ref><br />
== Fußnoten ==<br />
<references /><br />
== Quellen ==<br />
<references group='SQLite' /></div>SysOpGerthttp://wiki.ggf-controls.de/index.php?title=SyntaxSyntax2017-03-27T17:31:55Z<p>SysOpGert: 1 Version: Neuinstallation</p>
<hr />
<div>[[Kategorie:Datenbanken]]<br />
== Zeichenketten (Strings) ==<br />
Strings werden in Apostrophs <nowiki>'xxx'</nowiki> eingeschlossen. Tabellennamen oder -spaltennamen müssen in Backticks `xxx` eingeschlossen werden, wenn sie Leerzeichen enthalten.<br />
<br />Werte in Ausdrücken (Zuweisungen, Vergleiche, Berechnungen usw.) müssen in Apostrophs eingeschlossen werden, sonst werden sie als Spaltenname interpretiert. D.h. SQL versucht den Wert aus der Spalte mit diesem Namen zu verwenden.<br />
== NULL ==<br />
NULL ist nicht 0, sondern bedeutet ein leerer Wert. Vergleiche und mathematische Operationen mit NULL geben wiederum NULL zurück. Mit {{isyn|lang=mysql|code=IS NULL}} bzw. {{isyn|lang=mysql|code=IS NOT NULL}} kann ein Wert auf NULL getestet werden (gibt 0 oder 1 zurück).<br />
<br />
== Fußnoten ==<br />
Siehe [[Hilfe:Bearbeiten|Bearbeitungshilfe]]<br />
<references><br />
<!-- <ref name="fehler">TODO: Wie werden Laufzeitfehler, Debuggerausgaben usw ohne IDE angezeigt. --><br />
</references><br />
<!-- Alternative können die Referenzadressen direkt im Text zwischen <ref> und </ref> eingegeben werden, dann muss hier nur ein leeres Tag <references /> stehen. --><br />
== Quellen ==<br />
Siehe [[Hilfe:Bearbeiten|Bearbeitungshilfe]]<br />
<references group="QtR"><br />
<!-- <ref name="QObject">[http://doc.qt.nokia.com/4.7/qobject.html QObject Class Reference]</ref> --><br />
</ references></div>SysOpGerthttp://wiki.ggf-controls.de/index.php?title=Tabellenstruktur_(SQL)Tabellenstruktur (SQL)2017-03-27T17:31:55Z<p>SysOpGert: 1 Version: Neuinstallation</p>
<hr />
<div>[[Kategorie:Datenbanken]]<br />
== Fremdschlüssel ==<br />
<syntaxhighlight lang="mysql"><br />
ALTER TABLE `tabelle` ADD CONSTRAINT `Constraint-Name` FOREIGN KEY (`Spalte`) REFERENCES `Bezugstabelle` (`Bezugsspalte`) ON DELETE RESTRICT ON UPDATE CASCADE<br />
</syntaxhighlight><br />
Mit RESTRICT oder CASCADE (Änderungen werden übertragen) kann man Konsistenz erreichen. Mögliche andere Werte sind: NO ACTION oder SET NULL.<br />
<br />Ein Fremdschlüssel kann nicht angelegt, wenn in der FOREIGN KEY-''Spalte'' ein Wert steht, der in der ''Bezugsspalte'' fehlt.<br />
Löschen eines Fremdschlüssels:<syntaxhighlight lang="mysql"><br />
ALTER TABLE `tabelle` DROP FOREIGN KEY `Constraint-Name`<br />
</syntaxhighlight><br />
== Tabelle ändern ==<br />
<syntaxhighlight lang="mysql"><br />
ALTER TABLE `tabelle`<br />
ADD [COLUMN] Spaltenname Typ [Optionen] [FIRST|AFTER Spaltenname]<br />
| DROP [COLUMN] Spaltenname<br />
| CHANGE COLUMN Spaltenname NeuerSpaltenname Typ [Optionen] [FIRST|AFTER Spaltenname]<br />
| ADD INDEX [Indexname] [Indextyp] (Spaltenname, ...)<br />
| DROP INDEX Indexname<br />
| ADD PRIMARY KEY (Spaltenname, ...)<br />
| DROP PRIMARY KEY<br />
| RENAME [TO] `NeuerTabellenname`<br />
</syntaxhighlight><br />
<br />Spalte an die 1. Stelle verschieben:<syntaxhighlight lang="mysql"><br />
ALTER TABLE `tabelle` CHANGE `alter Spaltenname` `neuer Spaltenname` DECIMAL(8,2) NOT NULL DEFAULT 1 COMMENT 'meine Spalte' FIRST. </syntaxhighlight><br />
Nur Verschieben mit {{platz|neuer Spaltenname}} gleich {{platz|alter Spaltenname}}.<br />
<br />
== Fußnoten ==<br />
Siehe [[Hilfe:Bearbeiten|Bearbeitungshilfe]]<br />
<references><br />
<!-- <ref name="fehler">TODO: Wie werden Laufzeitfehler, Debuggerausgaben usw ohne IDE angezeigt. --><br />
</references><br />
<!-- Alternative können die Referenzadressen direkt im Text zwischen <ref> und </ref> eingegeben werden, dann muss hier nur ein leeres Tag <references /> stehen. --><br />
== Quellen ==<br />
Siehe [[Hilfe:Bearbeiten|Bearbeitungshilfe]]<br />
<references group="QtR"><br />
<!-- <ref name="QObject">[http://doc.qt.nokia.com/4.7/qobject.html QObject Class Reference]</ref> --><br />
</ references></div>SysOpGerthttp://wiki.ggf-controls.de/index.php?title=Backup_(MediaWiki)Backup (MediaWiki)2017-03-27T17:31:55Z<p>SysOpGert: 1 Version: Neuinstallation</p>
<hr />
<div>Die Datenbanken mit den Seiteninhalten können entweder mittels phpMyAdmin (bei XLhost) oder der Spezialseite [[Spezial:Exportieren|Seiten exportieren]] gesichert werden.<br />
<br />"Seiten exportieren" erzeugt eine XML-Datei, die mit Spezialseite [[Spezial:Importieren|Seiten importieren]] wieder eingelesen werden kann.<br />
<br />Andere Dateien wie LocalSettings.php müssen manuell gesichert werden.<br />
== Quellen ==<br />
[http://www.mediawiki.org/wiki/Manual:Backing_up_a_wiki MediaWiki-Handbuch zum Backup]<br />
[[Kategorie:Wiki]]</div>SysOpGerthttp://wiki.ggf-controls.de/index.php?title=Formatierung_(MediaWiki)Formatierung (MediaWiki)2017-03-27T17:31:55Z<p>SysOpGert: 1 Version: Neuinstallation</p>
<hr />
<div>[[Kategorie:Wiki]]<br />
==Formatierung mit CSS==<br />
=== inline ===<br />
Auf einer Wikiseite können auch HTML-Tags wie <nowiki><div> oder <span></nowiki> eingesetzt werden. Und diese können mit dem Attribute style formatiert werden, wie auf einfachen HTML-Seiten. Das gilt auch für Tags aus den Extensions wie <nowiki><syntaxhighlight></nowiki>.<br />
=== Für alle Oberflächen ===<br />
Auf einer Seite [[MediaWiki:Common.css]]<ref>Findet man über Spezialseiten->Alle Seiten->Namensraum MediaWiki</ref> kann ein Stylesheet gültig für alle Seiten, User und Skins angelegt werden. Es gelten dir Regeln für CSS. Ein Beispiel für eine Klasse{{Bsyn|lang=css|code=/* Klasse box */<br />
.box {<br />
position:relative;<br />
border:1px grey dashed;<br />
padding:0.5em;<br />
padding-left:1em;<br />
}<br />
}}<br />
Im Text muss dann das Tag mit class='box' erweitert werden, zB. <syntaxhighlight lang='html4strict' enclose='none'><syntaxhighlight class='box' ></syntaxhighlight><br />
<ref><nowiki><syntaxhighlight></nowiki> scheint aber kein reguläres HTML-Tag zu sein. Formatierung für ein globales <nowiki><syntaxhighlight></nowiki> müssen über eine Klasse realisiert werden.</ref>.<br />
== Fußnoten ==<br />
<references /></div>SysOpGerthttp://wiki.ggf-controls.de/index.php?title=Installation_(MediaWiki)Installation (MediaWiki)2017-03-27T17:31:55Z<p>SysOpGert: 1 Version: Neuinstallation</p>
<hr />
<div>== Database erstellen ==<br />
MySQL weil von XLHost angeboten.<br />
#Bei XLHost einloggen und MySQL-Datenbanken->Neue Datenbank erstellen.<br />
#Benutzerpasswort festlegen (fraglich, welcher Fremdzugriff möglich ist?). '''Achtung:''' Username = sql{{Platz|Nummer}}'''-'''1 (Minus), Datenbankname = dbsql{{Platz|Nummer}}'''_'''1 (Underline).<br />
== MediaWiki installieren ==<br />
#Neues {{Tooltip|Directory, Ordner|Verzeichnis}} {{Platz|MediaWiki}}<ref>Der ursprüngliche Verzeichnisname ''Wiki'' könnte zu Konflikten mit der Subdomain wiki bei [[Konfiguration (MediaWiki)#Short URL|Short URLs]] führen</ref> erstellen.<br />
#mediawiki-{{Platz|Version}}.tar.gz (von http://www.mediawiki.org/wiki/Download) in dieses {{Tooltip|Directory, Ordner|Verzeichnis}} hochladen. Dauert Minuten ohne Anzeige, also nicht abbrechen, sondern geduldig auf Fertigmeldung warten.<br />
#Archiv extrahieren und löschen.<br />
#Aufrufen: {{Platz|home/MediaWiki}} (zB. wiki.ggf-controls.de/MediaWiki, hinter / Groß/Kleinschreibung beachten).<br />
#Formblatt ausfüllen: Bei der Wahl einer Creative Commons Lizenz erst diese wählen, da eine Übernahme eine neue Seite ohne bisherige Einträge aufmacht. Alle anderen Einträge nach Gefühl, Datenbankmaschine IMNO, was immer das sein mag.<br />
#LocalSettings.php nach {{Platz|home/MediaWiki}} verschieben und Berechtigungen auf rw------- (nur Besitzer).<br />
== Fußnoten ==<br />
<references /><br />
[[Kategorie:Wiki]]</div>SysOpGert