You are on page 1of 124

LazInfos Das Lazarus Beispielbuch

Andreas Frie Die Community von www.lazarusforum.de 7. Januar 2010

Version SVN $LastChangedRevision: 94 $ Copyright (C) 2007 Andreas Frie. Es wird die Erlaubnis gewhrt, dieses Dokument zu kopieren, zu verteilen und/oder zu modizieren, unter den Bestimmungen der GNU Free Documentation License, Version 1.2 oder jede sptere Version, verffentlicht von der Free Software Foundation; mit keinen unvernderlichen Abschnitten, keinen vorderen Umschlagtexten und keinen hinteren Umschlagtexten. Eine Kopie der Lizenz ist aufgenommen in den Abschnitt mit dem Titel "GNU Free Documentation License". Copyright c 2007 Andreas Friess Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.2 or any later version published by the Free Software Foundation; with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. A copy of the license is included in the section entitled GNU Free Documentation License.

Inhaltsverzeichnis
1 Vorwort 1.1 Danksagung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2 Lazarus Pascal 2.1 Anweisungen, Verzweigungen, Schleifen . . . . . . . 2.1.1 Anweisungen . . . . . . . . . . . . . . . . . . 2.1.2 Verzweigungen . . . . . . . . . . . . . . . . . 2.1.3 Prozeduren und Funktionen . . . . . . . . . . Funktionen . . . . . . . . . . . . . . . . . . . Prozeduren . . . . . . . . . . . . . . . . . . . Parameterliste . . . . . . . . . . . . . . . . . . Parameterbergabe per Wert . . . . . . . . . . Parameterbergabe per Referenz . . . . . . . . Parameterbergabe von Objekten und Klassen . berladen von Funktionen . . . . . . . . . . . 2.2 Variablen, Konstanten, Datentypen . . . . . . . . . . . 2.2.1 Konstanten . . . . . . . . . . . . . . . . . . . Normale Konstanten . . . . . . . . . . . . . . Typisierte Konstanten . . . . . . . . . . . . . . Resourcen Strings . . . . . . . . . . . . . . . 2.2.2 Variablen . . . . . . . . . . . . . . . . . . . . Begriff . . . . . . . . . . . . . . . . . . . . . Deklaration . . . . . . . . . . . . . . . . . . . 2.2.3 Initialisierung . . . . . . . . . . . . . . . . . . 2.2.4 Datentypen . . . . . . . . . . . . . . . . . . . 2.3 Objekte . . . . . . . . . . . . . . . . . . . . . . . . . 2.3.1 Was ist ein Objekt . . . . . . . . . . . . . . . 2.3.2 Zur Laufzeit erzeugen und zerstren . . . . . . 2.3.3 Was sollte man unterlassen . . . . . . . . . . . Erzeugung von Speicherleichen (Memoryleaks) 3 Grundlagen Datenbank 3.1 Datenbanken . . . . . . . . . . . . . . . . 3.1.1 Einfhrung in die Datenbanktheorie Begriffe . . . . . . . . . . . . . . . Was ist eine Datenbank . . . . . . . 10 10 11 11 11 12 14 15 15 16 16 17 18 18 20 20 20 20 21 21 21 22 22 23 24 24 25 26 26 28 28 28 28 28

. . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

Inhaltsverzeichnis Desktop und Client-Server Datenbankarten Relationale Datenbanken . . . . . . . . . . Grunddaten . . . . . . . . . . . . . . . . . DDL Datendenitionssprache . . . . . . . DML Datenvernderungssprache . . . . . . SELECT . . . . . . . . . . . . . . . . . . Beispiele zu SELECT . . . . . . . . . . . INSERT . . . . . . . . . . . . . . . . . . . Beispiele zu INSERT . . . . . . . . . . . . UPDATE . . . . . . . . . . . . . . . . . . Beispiele zu UPDATE . . . . . . . . . . . DELETE . . . . . . . . . . . . . . . . . . Beispiele zu DELETE . . . . . . . . . . . DCL Datenkontrollsprache . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29 30 32 34 34 34 35 38 39 39 39 40 41 41 43 43 43 44 45 45 46 46 47 48 50 51 52 55 55 56 56 56 57 58 58 58 60 61 61 62 62 63

3.1.2 3.1.3

3.1.4

4 Installation 4.1 Linux openSUSE Erweiterte Lazarusinstallation . 4.1.1 Installation von Freepascal 2.2.0 . . . . . 4.1.2 Systemvorbereitung fr Lazarus . . . . . Subversion . . . . . . . . . . . . . . . . Abhngigkeiten von Lazarus . . . . . . . FPC-Quellen . . . . . . . . . . . . . . . 4.1.3 Installation von Lazarus aus dem SVN . . 4.1.4 Erstellen der Crosscompiling-Umgebung Anpassung der fpc.cfg . . . . . . . . . . 4.1.5 Wine . . . . . . . . . . . . . . . . . . . Programme in WINE ausfhren . . . . . 4.1.6 Eyecandy - GTK2 . . . . . . . . . . . . 4.2 Linux Debian Etch Snapshotinstallation . . . . . 4.2.1 Vorbereitung . . . . . . . . . . . . . . . 4.2.2 Download . . . . . . . . . . . . . . . . . 4.2.3 Umwandeln RPM -> DEB . . . . . . . . 4.2.4 Installation . . . . . . . . . . . . . . . . 4.2.5 Ausfhrung . . . . . . . . . . . . . . . . 5 Lazarus IDE 5.1 Entwicklungsumgebung . . 5.1.1 Tastenkombinationen 5.1.2 Fehlersuche . . . . . DebugLn . . . . . . Heap Trace . . . . . 5.1.3 Projektschablonen . Beschreibung . . . . Beispiel . . . . . . .

. . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

Inhaltsverzeichnis 6 Codebeispiele & FAQ 6.1 FAQ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6.1.1 Oberche . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Schrift auf einen Label ndert sich nicht . . . . . . . . . . . . . . . . . 7 Bibliotheken 7.1 SQLdb - Serverdatenbank Komponenten . . . . . . . . . . . 7.1.1 Beschreibung . . . . . . . . . . . . . . . . . . . . . Einleitung . . . . . . . . . . . . . . . . . . . . . . . Debbuging von SQLdb . . . . . . . . . . . . . . . . Active, Open oder ExecSQL . . . . . . . . . . . . . Wie kommen die genderten Daten in die Datenbank Filtern, aber wo ? . . . . . . . . . . . . . . . . . . . Anzahl der Datenstze abfragen . . . . . . . . . . . Navigieren durch eine Datenmenge . . . . . . . . . Was ist BOF und EOF . . . . . . . . . . . . . . . . Zugriff auf Felder . . . . . . . . . . . . . . . . . . . Zugriff auf Parameter . . . . . . . . . . . . . . . . . Schlsselfelder . . . . . . . . . . . . . . . . . . . . 7.1.2 TxxxConnection . . . . . . . . . . . . . . . . . . . Close . . . . . . . . . . . . . . . . . . . . . . . . . EndTransaction . . . . . . . . . . . . . . . . . . . . ExecuteDirect . . . . . . . . . . . . . . . . . . . . . GetFieldNames . . . . . . . . . . . . . . . . . . . . GetProcedureNames . . . . . . . . . . . . . . . . . GetTableNames . . . . . . . . . . . . . . . . . . . . Open . . . . . . . . . . . . . . . . . . . . . . . . . StartTransaction . . . . . . . . . . . . . . . . . . . CharSet . . . . . . . . . . . . . . . . . . . . . . . . Connected . . . . . . . . . . . . . . . . . . . . . . DatabaseName . . . . . . . . . . . . . . . . . . . . HostName . . . . . . . . . . . . . . . . . . . . . . KeepConnection . . . . . . . . . . . . . . . . . . . LoginPrompt . . . . . . . . . . . . . . . . . . . . . Params . . . . . . . . . . . . . . . . . . . . . . . . Password . . . . . . . . . . . . . . . . . . . . . . . Role . . . . . . . . . . . . . . . . . . . . . . . . . . StreamedConnected . . . . . . . . . . . . . . . . . Transaction . . . . . . . . . . . . . . . . . . . . . . UserName . . . . . . . . . . . . . . . . . . . . . . 7.1.3 TMySQL50Connection . . . . . . . . . . . . . . . 7.1.4 TMySQL41Connection . . . . . . . . . . . . . . . 7.1.5 TMySQL40Connection . . . . . . . . . . . . . . . 7.1.6 TOracleConnection . . . . . . . . . . . . . . . . . . 65 65 65 65 66 66 66 66 66 66 67 67 68 68 68 69 69 69 69 69 69 70 70 70 70 71 71 71 71 71 71 72 72 72 72 72 73 73 73 73 73 73 73

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

Inhaltsverzeichnis 7.1.7 7.1.8 7.1.9 TPQConnection . . . . . . . . . . . . . TODBCConnection . . . . . . . . . . . . TSQLTransaction . . . . . . . . . . . . . Commit . . . . . . . . . . . . . . . . . . CommitRetaining . . . . . . . . . . . . . EndTransaction . . . . . . . . . . . . . . Rollback . . . . . . . . . . . . . . . . . RollbackRetaining . . . . . . . . . . . . StartTransaction . . . . . . . . . . . . . Action . . . . . . . . . . . . . . . . . . . Database . . . . . . . . . . . . . . . . . Params . . . . . . . . . . . . . . . . . . 7.1.10 TSQLQuery . . . . . . . . . . . . . . . . Allgemeines . . . . . . . . . . . . . . . Methoden von TSQLQuery . . . . . . . ApplyUpdates . . . . . . . . . . . . . . CancelUpdates . . . . . . . . . . . . . . Close . . . . . . . . . . . . . . . . . . . ExecSQL . . . . . . . . . . . . . . . . . IsEmpty . . . . . . . . . . . . . . . . . . Locate . . . . . . . . . . . . . . . . . . . Open . . . . . . . . . . . . . . . . . . . Prepare . . . . . . . . . . . . . . . . . . SetSchemaInfo . . . . . . . . . . . . . . Unprepare . . . . . . . . . . . . . . . . . UpdateStatus . . . . . . . . . . . . . . . Eigenschaften von TSQLQuery . . . . . Active . . . . . . . . . . . . . . . . . . . Database . . . . . . . . . . . . . . . . . DataSource . . . . . . . . . . . . . . . . Filter . . . . . . . . . . . . . . . . . . . Filtered . . . . . . . . . . . . . . . . . . FilterOptions . . . . . . . . . . . . . . . Params . . . . . . . . . . . . . . . . . . ParseSQL . . . . . . . . . . . . . . . . . Prepared . . . . . . . . . . . . . . . . . ReadOnly . . . . . . . . . . . . . . . . . RecordCount . . . . . . . . . . . . . . . ServerFilter . . . . . . . . . . . . . . . . ServerFiltered . . . . . . . . . . . . . . . SQL, UpdateSQL, InsertSQL, DeleteSQL Transaction . . . . . . . . . . . . . . . . StatementType . . . . . . . . . . . . . . UpdateMode . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 74 74 74 74 74 75 75 75 75 75 75 76 76 76 76 76 76 76 77 77 77 77 77 78 78 78 78 79 79 79 79 80 80 80 80 81 81 81 81 81 82 82 82 83

Inhaltsverzeichnis UsePrimaryKeyAsKey . . . . . . . . Data Access - Clientdatenbank Komponenten 7.2.1 Beschreibung . . . . . . . . . . . . . Einleitung . . . . . . . . . . . . . . . 7.2.2 TDatasource . . . . . . . . . . . . . 7.2.3 SDF . . . . . . . . . . . . . . . . . . 7.2.4 FIXED . . . . . . . . . . . . . . . . 7.2.5 TDBF . . . . . . . . . . . . . . . . . 7.2.6 MEM . . . . . . . . . . . . . . . . . 7.2.7 SQLite . . . . . . . . . . . . . . . . ExecSQL . . . . . . . . . . . . . . . ApplyUpdates . . . . . . . . . . . . ExecSQL . . . . . . . . . . . . . . . Active . . . . . . . . . . . . . . . . . SaveOnClose . . . . . . . . . . . . . SaveOnRefetch . . . . . . . . . . . . SQL . . . . . . . . . . . . . . . . . . lNet Leightweight NETworking Library . . . 7.3.1 Beschreibung . . . . . . . . . . . . . Einleitung . . . . . . . . . . . . . . . 7.3.2 Installation . . . . . . . . . . . . . . utils.pas . . . . . . . . . . . . . . . . . . . . 7.4.1 Beschreibung . . . . . . . . . . . . . 7.4.2 Code . . . . . . . . . . . . . . . . . ClearDir . . . . . . . . . . . . . . . . DateTimeToHourString . . . . . . . . DateTimeToIndustrialTime . . . . . . DrawText . . . . . . . . . . . . . . . ExecProcessEx . . . . . . . . . . . . IsNumeric . . . . . . . . . . . . . . . InstallExt . . . . . . . . . . . . . . . HTTPEncode . . . . . . . . . . . . . ValidateFileName . . . . . . . . . . . ValidateFileDir . . . . . . . . . . . . ValidateDate . . . . . . . . . . . . . GetTempPath . . . . . . . . . . . . . GetCongDir . . . . . . . . . . . . . GetGlobalCongDir . . . . . . . . . SizeToText . . . . . . . . . . . . . . GetMainIconHandle . . . . . . . . . CanWriteToProgramDir . . . . . . . OpenBrowser . . . . . . . . . . . . . HexToBin . . . . . . . . . . . . . . . LoadLanguage . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 83 84 84 84 84 84 84 84 84 84 84 85 85 85 85 85 86 87 87 87 87 88 88 88 88 88 88 89 89 89 90 90 90 90 91 91 91 91 92 92 92 92 92 93

7.2

7.3

7.4

Inhaltsverzeichnis RoundTo . . . . . . . . . . TimeTotext . . . . . . . . . ExecProcess . . . . . . . . ExecVisualProcess . . . . . GetProcessforExtension . . GetMimeTypeforExtension . GetSystemLang . . . . . . . RPos . . . . . . . . . . . . StripHTML . . . . . . . . . StrTimeToValue . . . . . . SystemUserName . . . . . . uFileMisc.pas . . . . . . . . . . . . 7.5.1 Beschreibung . . . . . . . . 7.5.2 Typendenitionen . . . . . 7.5.3 Code . . . . . . . . . . . . SearchFile Variante 1 . . . . SearchFile Variante 2 . . . . 7.5.4 Beispiel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 93 93 93 94 94 94 94 95 95 95 95 96 96 96 96 96 96 97 99 99 99 99 100 101 101 106 110 110 111 111 111 111 113 113 114

7.5

8 Beispiele 8.1 Datenbanken MySQL 5.x . . . . . . . . . 8.1.1 Demodatenbank MySQL . . . . . Installieren von MySQL 5.x . . . Erstellung der DEMO Datenbank Windows FAQ . . . . . . . . . . 8.1.2 Projekt MySQLSimple . . . . . . 8.1.3 Projekt MySQLTestData . . . . . 8.2 Datenbanken SQLite 3.x . . . . . . . . . 8.3 Datenbanken DBase, FoxPro . . . . . . . 9 Programme 9.1 Ntzliche Werkzeuge . . . . . . . . . . 9.1.1 Versionskontrolle . . . . . . . . svn Kommandozeile . . . . . . 9.1.2 Tool Versionenselektierer . . . . Was macht das Tool eigentlich? Konguration . . . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

10 Anhang 115 10.1 Tabellenverzeichnis . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 115 10.2 GNU Free Documentation License . . . . . . . . . . . . . . . . . . . . . . . . 118 GNU Free Documentation License 118 1. APPLICABILITY AND DEFINITIONS . . . . . . . . . . . . . . . . . . . . . . 118

Inhaltsverzeichnis 2. VERBATIM COPYING . . . . . . . . . . . . . . . . . . 3. COPYING IN QUANTITY . . . . . . . . . . . . . . . . 4. MODIFICATIONS . . . . . . . . . . . . . . . . . . . . . 5. COMBINING DOCUMENTS . . . . . . . . . . . . . . . 6. COLLECTIONS OF DOCUMENTS . . . . . . . . . . . 7. AGGREGATION WITH INDEPENDENT WORKS . . . 8. TRANSLATION . . . . . . . . . . . . . . . . . . . . . . 9. TERMINATION . . . . . . . . . . . . . . . . . . . . . . 10. FUTURE REVISIONS OF THIS LICENSE . . . . . . . ADDENDUM: How to use this License for your documents . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 119 120 120 122 122 123 123 123 123 124

1 Vorwort
1.1 Danksagung
Meiner Frau Vor allen mchte ich meiner Frau danken. Fr ihre schier endlose Geduld mit mir, beim Schreiben dieses Buches.

10

2 Lazarus Pascal
2.1 Anweisungen, Verzweigungen, Schleifen
Vorbereitung Bei den hier verwendeten Beispielen handelt es sich um ein neu erstelltes grasches Projekt mit einem Formular mit dem Namen TestForm und einem darauf plazierten Button mit dem klingenden Namen Button1. Die Ereignisroutine Button1Click wird durch ein Doppelklicken auf den Button automatisch von Lazarus erzeugt.

2.1.1 Anweisungen
Einleitung Ein Programm besteht aus einer Reihe von Anweisungen1 . Diese werden zur Laufzeit nacheinander ausgefhrt. Und zwar werden Anweisungen immer von links nach rechts und von oben nach unten durchgefhrt. Um diesen Ablauf zu durchbrechen gibt es zustzlich auch noch Verzeigungen und Schleifen. Anweisungen werden immer mit einem Strichpunkt2 abgeschlossen. Ausnahmen sind unmittelbar vor einem Blockende und am Ende einer Unit - dort wird ein Punkt gesetzt. Block Bildung Anweisungen werden immer in Blcken zusammengefasst. Dieser Block wird mit begin eingeleitet und mit end abgeschlossen. Zustzlich bilden die Schleife repeat ... until und die Verzweigung case ... end auch automatisch einen Block. begin ..... Anweisungen ... end; Die Anweisungen zwischen begin und end werden wie eine einzelne Anweisung betrachtet. Das wird dann bei Schleifen und Verzweigungen verwendet. Blcke knnen verschaltelt werden, die Blockgrenzen drfen sich aber nicht schneiden. Daher schliesst end immer das letzte begin ein. Das folgende Beispiel demonstriert wie es richtig ist, denn der zweite Block bendet sich komplett innerhalb des ersten Blockes. begin Anweisung1; ... Anweisungen Block 1.Stufe... Anweisung2; begin AnweisungA;
1 2

Englisch: Statement Semikolon ;

11

2 Lazarus Pascal ... Anweisungen Block 2.Stufe... AnweisungB; AnweisungC <- keine Strichpunkt notwendig end; Anweisung3; ... Anweisungen Block 1.Stufe... Anweisung4; Anweisung5 <- keine Strichpunkt notwendig end;

2.1.2 Verzweigungen
Einleitung Verzweigungen dienen zum Unterbrechen des geradlinigen Ablaufes und zum Treffen von Entscheidungen. Bedingte Verzweigungen Bei den bedingten Verzweigungen wird eine Bedingung als Entscheidung genommen, wohin sich der Programmablauf verzweigt. if then else Bei if Bedingung then Anweisung; wird abgeprft ob eine Bedingung, die boolsch3 sein mu, den Wert true angenommen hat. Wenn nicht so wird die Anweisung nicht durchgefhrt. Im folgenden Beispiel kann die Bedingung nie Wahr4 werden und somit wird die Hinweisbox5 nie am Bildschirm angezeigt, da die Anweisung einfach bersprungen wird. procedure TTestForm.Button1Click(Sender: TObject); var i : integer; begin i := 0; if i=1 then showmessage(Geht nicht); end; Wenn man sowohl den Fall behandeln will, dass die Bedingung wahr ist, als auch den Fall, dass es nicht so ist, kann man die if Bedingung then Anweisung1 else Anweisung Verzweigung nehmen. procedure TTestForm.Button1Click(Sender: TObject); var i : integer; begin i := 0; if i=1 then showmessage(Geht nicht) else showmessage(Geht doch) end;
3

bei boolscher Logik gibt es nur True und False den Wert True annehmen 5 Die Anweisung showmessage() erzeugt eine Hinweisbox am Bildschirm
4

12

2 Lazarus Pascal Hier wird dann im else Zweig der Bedingung die Hinweisbox mit dem Text Geht doch angezeigt. Bis jetzt konnte das Beispiel nur unterscheiden, ob die Variable i gleich 1 ist oder nicht. Will man mehere Werte voni abprfen so mu man die Verzweigungen entsprechend verschachteln. Im folgend Beispiel prfen wir die Zahlen von null bis zwei ab, alles andere wird als unbekannt bewertet. procedure TTestForm.Button1Click(Sender: TObject); var i : integer; begin i := 2; if i=0 then showmessage(i=0) else if i=1 then showmessage(i=1) else if i=2 then showmessage(i=2) else showmessage(Wert unbekannt); end; Es gibt im folgenden eine einfachere Art solche Verzweigungen zu behandeln, wenn aber die case Verzweigung nicht verwendet werden kann, so ist es mit Hilfe des obigen Beispiels mglich das case nachzubauen. case Bei case wird ein so gennanter Selektor eingesetzt, anhand dessen entschieden wird, welcher Zweig genommen wird. Der Selektor darf aber nur ein ordinaler Typ6 sein. procedure TTestForm.Button1Click(Sender: TObject); var i : integer; begin i := 2; case i of 0 : showmessage(i=0); 1 : showmessage(i=1); 2 : showmessage(i=2); else showmessage(Wert unbekannt) end; end; Unbedingte Verzweigungen goto und label Der Befehl goto ... mit nachgestellter Sprungmarke, bewirkt das die Abarbeitung der Befehle an der Stelle weitergefhrt wird, wo sich die Sprungmarke bendet. Der Befehl kann nur lokal springen. Das heisst die Sprnge mssen sich innerhalb derselben Prozedur oder
6

Byte, Word, Integer, Char siehe auch Kapitel Datentypen

13

2 Lazarus Pascal Funktion bewegen. In einigen Fllen kann er die Lesbarkeit und Funktion von Programmenteilen erhhen. Im Normalfall wird der Befehl nicht bentigt. Es mu ein Label deklariert werden, bevor es innerhalb der Prozedure oder Funktion verwendet werden kann, dieses Label dient als Sprungmarke. procedure TTestForm.Button1Click(Sender: TObject); var i : integer; label hier; begin i := 2; goto hier; .... .... hier: i := 3; end; Exit Exit7 bewirkt das die aktuelle Funktion oder Prozedure beendet wird, ohne das nachfolgende Befehle abgearbeitet werden. Es ist vergleichbar mit einem Goto, wobei die Sprungmarke unmittelbar vor dem letzen end sich bendet. In dem Beispiel wird die case Anweisung nicht bearbeitet, solange i den Wert drei hat. procedure TTestForm.Button1Click(Sender: TObject); var i : integer; begin i := 3; if i=3 then exit; case i of 0 : showmessage(i=0); 1 : showmessage(i=1); 2 : showmessage(i=2); else showmessage(Wert unbekannt) end; end;

2.1.3 Prozeduren und Funktionen


Einleitung Durch das Schreiben von Routinen, das sind Prozeduren und Funktionen, kann man sich den Funktionsumfang den Lazarus hat, selbst erweitern. Das Wesen von Routinen ist, Anweisungen die immer wieder in fast gleicher Weise verwendet werden, zusammenzufassen und an einer Stelle zu warten. Es ist wird so der Quelltext auch leichter lesbar und vor allem wird der Code auch leichter zu warten. Eine Verbesserung muss nicht an etlichen Stellen im Code durchgefhrt werden. So kann man auch keine Stellen zu ndern vergessen. Der Code liegt an einer Stelle.
7

Wird bei Schleifen auch verwendet, wirkt dort nur auf den lokalen Block

14

2 Lazarus Pascal Funktionen Funktionen sind in Blcken zusammengefasste und gekapselte Ansammlungen von Anweisungen. Zustzlich gibt die Funktion einen (aber nur einen!) Wert zurck. Sie kann somit im Programm wie eine Variable verwendet werden. Im folgenden Beispiel schreiben wir eine Funktion mit dem Namen MyFunction die zwei Zahlen addieren soll. Dazu denieren wir den Funktionskopf. Die Variablenliste mit den Parametern a und b denieren wir von Typ Integer und zustzlich, dass die Funktion ein Ergebnis auch vom Typ Integer zurckgibt. In den die Funktion begrenzenden begin ... end Block, knnen wir jetzt unsere Anweisungen hineinschreiben. Der automatisch erstellen Variable result bergeben wir den Wert der Berechnung. Beim Aufruf der Funktion bergeben wir die Parameter i1,i2 und das Ergebnis speichern wir in der Variablen erg ab. In der nchsten Zeile wird der Wert der Variablen erg in eine Zeichkette umgewandelt und in einer Hinweisbox ausgegeben. function MyFunction(a,b : integer):integer; begin result := a + b end; procedure TTestForm.Button1Click(Sender: TObject); var i1,i2,erg : integer; begin i1 := 2; i2 := 3; erg := MyFunction(i1,i2); showmessage(Ergebnis= + IntToStr(erg)) end; Prozeduren Prozeduren sind eine Sonderform der Funktion. Sie sind komplett gleich, bis auf die Tatsache, das eine Prozedure kein Ergebnis zurckliefert. Das Beispiel ist gleich zum obigen, mit dem Unterschied, das die Ausgabe in die Hinweisbox jetzt ber eine Prozedure abluft. function MyFunction(a,b : integer):integer; begin result := a + b end; procedure MyHinweisBox(a:integer); begin showmessage(Ergebnis= + IntToStr(a)) end;

15

2 Lazarus Pascal

procedure TTestForm.Button1Click(Sender: TObject); var i1,i2,erg : integer; begin i1 := 2; i2 := 3; erg := MyFunction(i1,i2); MyHinweisBox(erg) end; Parameterliste Die Parameter dienen dazu, um Daten in die Funktion bzw. Prozedure zu bertragen und auch in der anderen Richtung von diesen zu erhalten. In den bisherigen Beispielen zu Funktionen und Parameter ist nur die Richtung in die Funktion oder Parameter betrachtet worden. Bei der Denition werden gleichartige Parameter durch einen Beistrich, ansonsten durch einen Strichpunkt getrennt. Beim Aufruf werden die Parameter einfach durch Beistriche getrennt angegeben. Die Reihenfolge der Parameter ist bindend. procedure MyProc(param1,param2 : integer; param3 : single); begin // ... einige sinnvolle Anweisungen end; procedure TTestForm.Button1Click(Sender: TObject); begin MyProc(11,30,12.5); end; Parameterbergabe per Wert Wenn der Parameter als Wert bergeben wird, so wird der Inhalt des bergebenen Wertes kopiert und diese Kopie der Funktion oder Prozedur zur Verfgung gestellt. nderungen am Wert innerhalb der Funktion werden deshalb nur auf der Kopie gemacht und haben keine Auswirkung auf den Originalwert ausserhalb der Funktion oder Prozedure. procedure MyProc(param1: integer); begin // ... einige sinnvolle Anweisungen param1 := param1 + 5; showmessage(Wert in MyProc ist + IntToStr(param1)); //<-- Anzeige ist 6 end; procedure TTestForm.Button1Click(Sender: TObject); var iWert : integer;

16

2 Lazarus Pascal begin iWert := 1; showmessage(Wert vorher ist + IntToStr(iWert)); //<-- Anzeige ist 1 MyProc(iWert); showmessage(Wert nachher ist + IntToStr(iWert)); //<-- Anzeige ist 1 end; Anhand diese Beispieles sieht man, das der Wert innerhalb der Prozedur zwar gendert wird, es aber keinerlei Auswirkung auf den Wert in der aufrufenden Prozedur hat. Parameterbergabe per Referenz Bei der Parameterbergabe als Referenz, wird nicht der Wert selbst sondern eine Referenz8 bergeben. Dadurch das keine Kopie erstellt wird, sondern auf eine Variable referenziert wird, betreffen nderungen sehr wohl die ursprngliche Variable. procedure MyProc(var param1: integer); begin // ... einige sinnvolle Anweisungen param1 := param1 + 5; showmessage(Wert in MyProc ist + IntToStr(param1)); //<-- Anzeige ist 6 end; procedure TTestForm.Button1Click(Sender: TObject); var iWert : integer; begin iWert := 1; showmessage(Wert vorher ist + IntToStr(iWert)); //<-- Anzeige ist 1 MyProc(iWert); showmessage(Wert nachher ist + IntToStr(iWert)); //<-- Anzeige ist 6 end; Bei dieser Art der Parameterbergabe ist aber eine Variable notwendig und es kann kein fester Wert verwendet werden. Das folgende Beispiel ist deshalb nicht erlaubt. procedure MyProc(var param1: integer); begin // ... einige sinnvolle Anweisungen param1 := param1 + 5; showmessage(Wert in MyProc ist + IntToStr(param1)); end; procedure TTestForm.Button1Click(Sender: TObject); begin
8

auch oder Zeiger, Pointer genannt

17

2 Lazarus Pascal MyProc(5); end; Es wird mit folgender Meldung richtigerweise zurckgewiesen, da aus einem festen Wert der Kompiler keine Referenz bilden kann. umain.pas(39,11) Error: Variable identifier expected umain.pas(30,11) Hint: Found declaration: MyProc(var LongInt) umain.pas(47) Fatal: There were 1 errors compiling module, stopping Parameterbergabe von Objekten und Klassen Objekte und Klassen werden immer als Referenz bergeben, das heisst nderungen werden immer auf der Klasse oder Objekt durchgefhrt und keine Kopien davon angelegt. berladen von Funktionen Funktionen und Prozeduren knnen auch berladen werden, das heisst es gibt mehrer Versionen einer gleichnamigen Funktion oder Prozedur aber mit unterschiedlichen Parameterliste. In dem Beispiel wird die Funktion ToString mit verschiedenen Parametertypen berladen. Zuerst mit boolschem Parameter, dann mit einem Integer Parameter und zum Schlu mit einem Double Parameter. Die Funktionkpfe sehen fast gleich aus, aber durch die verschiedene Paramatertypen kann der Compiler das sehr wohl auseinander halten und richtig zuweisen. function ToString(value:boolean):string; begin if value then result := true else result := false; end; function ToString(value:integer):string; begin result := IntToStr(value); end; function ToString(value:double):string; begin result := FloatToStr(value); end; Hier sieht man dann sehr gut, dass der Compiler immer die richtige Version der Funktion anhand des Typs auswhlen kann. Beim drcken des Button 1 wird im Editfeld der Text true eingetragen. Bei den anderen Buttons wird der entsprechnde Wert im Editfeld angezeigt. procedure TForm1.Button1Click(Sender: TObject); begin

18

2 Lazarus Pascal edit1.Text:= ToString(true); end; procedure TForm1.Button2Click(Sender: TObject); begin edit1.text := ToString(10); end; procedure TForm1.Button3Click(Sender: TObject); begin edit1.text := ToString(11.01); end; Version: $LastChangedRevision: $
9

Autor: Andreas Frie Lizenz: GFDL

19

2 Lazarus Pascal

2.2 Variablen, Konstanten, Datentypen


Ein groer Teil der hier verwendeten Denitionen und Texte stammen aus dem Language Reference Guide[FPCLangRef]. Es handelt sich hier nicht um eine exakte bersetzung, sondern um eine fr dieses Buch angepasste Form.

2.2.1 Konstanten
Bei Konstanten mu der Compiler zur Kompilierzeit fhig sein, den Term aufzulsen. Das heisst das sehr viele Funktionen die nur zur Laufzeit zur Verfgung stehen nicht verwendet werden knnen. Die folgenden Operatoren knnen immer verwendet werden - +, -, *, /, not, and, or, div, mod, ord, chr, sizeof, pi, int, trunc, round, frac, odd. Normale Konstanten Die Deklaration von Konstanten ist nur fr Ordinale-, Reale-, Char- und Stringtypen erlaubt. const co_real = 3.14; { Reale Typen Konstante } co_int = 25; { Integer Typen Konstante } co_char = A; { Character Typen Konstante } co_str = Irgend ein String; {String Typen Konstante} co_ls = SizeOf(Longint); co_ls_real = SizeOf(co_real); Eine Zuweisung10 an die Konstante ist nicht mglich. co_str := Ein anderer String; Das ist bei normalen Konstanten nicht erlaubt und wird mit der Fehlermeldung xxx.pas(47,11) Error: Variable identier expected quittiert. Die Fehlermeldung resultiert daher, das zwar eine Konstante mit dem Namen existiert, aber keine Variable. Typisierte Konstanten Typisierte Konstanten sind ein Weg um das Programm mit initialisierten Variablen zu versorgen. Im Gegensatz zu normalen Variablen, wo der Programmierer sich um die Initialisierung selbst kmmern mu, wird ihr Wert initialisiert wenn das Programm startet. Anders als bei normalen Konstanten kann ihnen zur Laufzeit ein neuer Wert zugewiesen werden. const co_char : char = A;{Character Typen Konstante} co_str : string = Irgendein String;{String Typen Konstante} Somit ist das gltiger Code.
10

Nur mit typisierten Konstanten mglich

20

2 Lazarus Pascal co_str := Ein anderer String; Typisierte Konstanten werden oft benutzt um Arrays und Records zu initialisieren. const co_tt : array [1..3] of string[20] = (Mike, Ros, Heh); co_ti : array [1..3] of Longint = (1,2,3); Bei Arrays mssen die initialen Werte in runden Klammern angegeben werden, mit Kommas getrennt und die Anzahl der Elemente mu genau gleich sein, als die Anzahl der Elemente in der Deklaration. type Point = record X,Y : Real end; const aOrigin : Point = (X:0.0; Y:0.0); In typisierten Recordkonstanten, mu jedes Element des Records speziziert sein und zwar in der Form: Feldname, Doppelpunkt, Werte getrennt durch Strichpunkt und das ganze von runden Klammern umschlossen. Die Felder mssen in der Reihenfolge in der Deklaration verwendet werden, ansonsten gibt es eine Compilerfehlermeldung xxx.pas(47,11) Error: Some elds coming before "Y"werent initialized Resourcen Strings Sie verhalten sich Grundlegend wie normale Konstanten, es ist aber nur der Typ Strings zugelassen. Zustzlich sind sie nur im Modus objfpc und Delphi erlaubt. Resourcen Strings sind in erster Linie dazu da, um die Internationalisierung einfacher zu gestalten und einen einheitlichen Weg fr das behandeln von konstanten Strings zu haben. Die Strings werden dazu in eigene Dateien abgelegt, auf die dann ber ein Programmierinterface zur Laufzeit zugegriffen werden kann. Dadurch knnen Strings fr die bersetzung benutzt werden. Ausserdem kommen mit dem Free Pascal Compiler Werkzeuge um die Resourcen Strings zu bearbeiten und in andere Formate (Linux, Windows, ...) zu konvertieren. Resourcestring FileMenu = &File...; EditMenu = &Edit...;

2.2.2 Variablen
Begriff Eine Variable ist ein genau bekannter Speicherbereich mit einem bestimmten Typ. Wenn Werte einer Variable zugewiesen werden, so erzeugt der Free Pascal Compiler Maschinencode um den

21

2 Lazarus Pascal Wert zu dem reservierten Speicherbereich zu transportieren. Wo sich die Variable bendet, ist vom Ort der Deklaration abhngig. Globale Variablen Sind Variablen die innerhalb einer Unit oder Programmes deniert sind, aber NICHT innerhalb von Prozeduren oder Funktionen. Diese werden auf xen Speicherbereichen gelegt und sind whrend der ganzen Programmbearbeitung verfgbar. Lokale Variablen Sind innerhalb von Prozeduren oder Funktionen deniert. Sie werden auf den Stack, daher nicht auf einen xen Speicherbereichen gelegt. Beim FPC und somit auch innerhalb von Lazarus ist das bereitstellen der Speicherbereiche komplett transparent11 . Das Hantieren (Schreiben, Lesen) mit den Werten erfolgt ebenfalls transparent, kann aber explizit durch den Programmierer vorgegeben werden, durch das verwenden von Eigenschaften(Properties). Variablen mssen extra deklariert werden, wenn sie gebraucht werden. Es wird solange kein Speicherbereich zur Verfgung gestellt, bis die Variable deklariert ist. Wird eine Variable verwendet die nicht zuerst deklariert ist, so wird vom Compiler eine Fehlermeldung erzeugt. Deklaration Hier ist Platz fr Informationen zum Thema. Ich bin leider noch nicht soweit.

2.2.3 Initialisierung
Variablen, wie auch andere Indentizierer gehorchen den generellen Regeln der Gltigkeit. Zustzlich werden die zu inititialisierten Variablen zur folgenden Zeit initialisiert. Globale initialisierte Variablen Werden einmalig initialisiert wenn des Programm startet. Lokale initialisierte Variablen Werden jedes mal initialisiert wenn die Funktion oder Prozedur ausgefhrt wird. Man beachte, dass das Verhalten von lokal initialisierten Variablen ein anderes ist, als von lokal denierten Konstanten. Eine lokal denierte Konstante verhlt sich wie eine global initialisierte Variable. Welche Variablen werden berhaupt, wie initialisiert ? AnsiString teilweise Der Platz fr den Pointer wird erstellt und mit nil vorbelegt. Gltig nur fr globale und lokale AnsiStrings, die ein Teil einer Struktur sind (Statische Arrays, Records und Objekte). Typisierte Konstanten Verhlt sich wie eine Globale initialisierte Konstante, wird einmalig initialisiert wenn des Programm startet, auch wenn sie sich Lokal in einer Prozedur oder Funktion bendet.

11

Fr den Programmierer nicht sichtbar, im Hintergrund

22

2 Lazarus Pascal Es werden die meisten Variablen aus Geschwindigkeitsgrnden nicht initialisiert. Folgendes soll als Beispiel dienen. var anArray : array[1..100000] of string; Bei dieser Deklaration wird, wenn die Variable initialisiert wird, hunderttausend Mal der Wert nil in das Array geschrieben. Das braucht seine Zeit, auch wenn die noch so kurz ist. Bendet sich der Code in einer Prozedur oder Funktion, die in einer Schleife aufgerufen wird, so kann der Zeitaufwand dafr erheblich werden.

2.2.4 Datentypen
ToDo: Hier ist Platz fr Informationen zum Thema. Ich bin leider noch nicht soweit. Version: $LastChangedRevision: $ 12

12

Originalautor: Michal Van Canneyt, Lizenz: free bersetzung und Bearbeitung: Andreas Frie

23

2 Lazarus Pascal

2.3 Objekte
2.3.1 Was ist ein Objekt
Was ist ein Objekt, eine gute Frage. Nhern wir uns einmal dem Begriff indem wir ein Objekt beschreiben. Ein Objekt hat Eigenschaften und kann Aktionen durchfhren, weiters beinhaltet es Daten zum Verwalten seiner Zustnde. Auerdem mu das Objekt auch einen Namen besitzen. Wie denieren wir ein Objekt? Unter (Lazarus) Pascal verwenden wir dazu die Klassendenition class. TMyObject = class end; Mit diesen Zeilen kann mal ein grundlegendes Objekt denieren. Es hat einen Namen, aber kann weder Aktionen durchfhren, noch hat es Eigenschaften, aber es ist das minimalste Beispiel. In unseren Fall hat das Objekt den Namen TMyObject. Sehen wir uns jetzt eine volle Denition an. { TMyGreatObject } TMyGreatObject = class(TParentObject) private FIsValid: Boolean; procedure SetIsValid(const AValue: Boolean); protected function GetWert: integer; procedure SetWert(const AValue: integer); public constructor Create; override; destructor Destroy; override; published property IsValid : Boolean read FIsValid write SetIsValid; property Wert : integer read GetWert write SetWert; end; var aMyGreatObject : TMyGreatObject; Mittels der Klassendenition class(TParentObject)denieren wir ein Objekt mit dem Namen TMyGreatObject, das alle Eigenschaften, Aktionen etc. vom Elternobjekt erbt. Das heit alles was das Elternobjekt kann oder hat, hat unser Objekt auch. Durch die Deklarationen private, protected, public und published wird die Sichtbarkeit der Eigenschaften und Aktionen deniert. private Nur hier in dieser Deklaration kann auf diese Eigenschaften und Aktionen zugegriffen werden protected Wie private, zustzlich kann auch bei Kindobjekten auf die Eigenschaften und Aktionen zugegriffen werden

24

2 Lazarus Pascal public Auf die Eigenschaften und Aktionen kann immer zugegriffen werden published Wie public zustzlich sind die Eigenschaften auch im Objektinspektor verfgbar Im private Teil ist eine Boolsche-Variable und eine Prozedur zum ndern der Variablen deniert. Generell ndert man den Wert einer Variablen nicht direkt, sondern verwendet eine Prozedur dazu, in der auch eventuell die ntigen Prfungen oder Bearbeitungsschritte durchgefhrt werden. Als Namen fr die Prozeduren13 und Funktionen14 die interne Variablen ndern haben sich GetXXXX 15 und SetXXXX durchgesetzt. Das setzt sich auch im protected Abschnitt fort. Im public Bereich sind die Konstruktoren (immer Create16 ), Destruktoren (immer Destroy) und die von ausserhalb sichtbaren Variablen17 , Eigenschaften, Prozeduren und Funktionen.

2.3.2 Zur Laufzeit erzeugen und zerstren


Gerade am Anfang erweist sich das richtige Erzeugen und Lschen von Objekten als Problem. Denn die Zuweisung mittels var aListe : TStringList; reicht nicht aus. Damit wird nur der Platz fr den Verweis auf das Objekt erzeugt, nicht aber das Objekt selbst! Zu diesem Zeitpunkt ist das Objekt, in diesem Fall eine Stringliste nicht in einem gebrauchsfhigen Zustand, der Verweis ist undeniert (und zeigt ins Nirgendwo). Deshalb wird auch eine Anweisung wie aListe.Create nicht funktionieren und eine Exception auslsen. Wie geht es also richtig. Alle Objekte haben einen Konstruktor, entweder direkt in der Klasse oder in einem Vorfahren, der aufgerufen werden kann und der das Objekt richtig erstellt und uns den richtigen Verweis zurck liefert, den wir dann in unserer Variablen ablegen knnen. procedure TForm1.buObjektClick(Sender: TObject); var aListe : TStringList; begin aListe := TStringList.Create; try aListe.Add(Eine Zeile); aListe.Add(Eine zweite Zeile); aListe.Add(Eine dritte Zeile); Memo1.Lines.Assign(aListe); finally aListe.Free; end; end; Sehen wir uns den Beispielcode18 einmal von oben nach unten an.
13 14

Zum Setzen Zum Abfragen 15 Auch Getter und Setter genannt 16 manchmal kommen Namensabwandlungen vor 17 Variablen macht man normalerweise ber Eigenschaften zugnglich 18 Aus dem Projekt: BspObjErzeug

25

2 Lazarus Pascal var aListe : TStringList; Denieren einer Variable fr den Verweis auf ein Objekt von Typ TStringlist aListe := TStringList.Create; Erzeugen des Objektes und initialisieren der Variablen mit dem Verweis aListe.Add(Eine Zeile); Einfgen eines Strings in die Stringliste Memo1.Lines.Assign(aListe); Fllen des Memos mit den Strings aus der Stringliste aListe aListe.Free; Freigeben des Objektes Stringliste durch aufruf von Free. Nach dem Aufruf von Free ist der Inhalt der Variablen aListe nicht mehr deniert! Free ruft den Destruktor des Objektes auf. Der Inhalt zeigt jetzt auf kein gltiges Objekt mehr und enthlt einen beliebigen Inhalt, er ist nicht Null oder nil. Zustzlich ist mit der Exceptionbehandlung try..nally..end sichergestellt, da das Objekt sicher zerstrt wird, auch wenn innerhalb des try..nally Blocks ein Fehler aufgetreten ist. Das zwischen dem nally..end eingegrenzte Anweisung wird in jedem Falle ausgefhrt.

2.3.3 Was sollte man unterlassen


Es gibt bei Klassen immer wieder Kode, den man besser nicht schreiben sollte. Ich werde hier versuchen Beispiele zu bringen, meistens werden sie aus dem Forum stammen. Erzeugung von Speicherleichen (Memoryleaks)
19

Eine einfacher Weg um Speicherleichen zu erzeugen ist das wilde zuweisen von Klassen. Meistens wird der Gedanke aus einer vermeintlichen Abkrzung im Kode geboren. Bei der Deklaration ist ja noch alles in Ordnung. Obj1 : TObject; Obj2 : TObject; bj1,2 sind nur Zeiger die im Moment auf irgendwas zeigen wenn man drauf zugreifen will gibt es eine Zugriffsverletzung (Access violation), weil das Objekt ja noch nicht erstellt wurde. Obj1 := TObject.Create; Obj2 := TObject.Create; jetzt zeigen unsere Zeiger auf die Objekte die erstellt wurden und die Objekte sind jetzt auch benutzbar. Wenn man jetzt aus welchen Grund auch immer die folgende Zuweisung macht, hat man eine Leiche erschaffen. Obj1 := Obj2;

19

Basierend auf Informationen von christian[11] im deutschen Lazarusforum

26

2 Lazarus Pascal Mit dieser Zuweisung zeigen beide Zeiger auf Obj2. Obj1 kann nie wieder benutzt werden, da jegliche Referenzierung darauf verschwunden ist. Somit kann Obj1 auch nicht mehr gelscht und der Speicherplatz frei gegebnen werden, wie im folgenden Kode. Obj1.Free; Obj2.Free; Das erste Obj1.Free wird anstandslos ausgefhrt, da ja in Wirklichkeit das Obj2 freigegeben wird und nicht das ursprngliche Obj1 - das ist ja in Vergessenheit geraten. Das nachfolgende Obj2.Free erzeugt jetzt eine Zugriffsverletzung, da das Objekt ja bereits freigegeben wurde und das ursprngliche Obj1 ist eine Leiche (im Speicher-Keller). Version: $LastChangedRevision: 59 $
20

20

Autor: Andreas Frie Lizenz: GFDL

27

3 Grundlagen Datenbank
3.1 Datenbanken
3.1.1 Einfhrung in die Datenbanktheorie
Das Folgende Kapitel wendet sich speziell an den Personenkreis der in die Theorie von Datenbanken noch nicht so eingedrungen ist, beziehungsweise dient als Nachschlagwerk fr die verschiedenen Begriffe. Man kann also bei entsprechenden Vorwissen die folgenden erklrenden Kapitel berspringen und bei Bedarf nachschlagen. Begriffe Um Missverstndnisse auszuschlieen und zu einer gemeinsamen Sprachregelung zu kommen, sollte man die verwendeten Begriffe mglichst genau denieren: Eine Datenmenge ist eine Menge von einzelnen Datenstzen. Jeder Datensatz besteht aus mindesten einem Feld. Die Herkunft dieser Datenmenge ist nicht festgelegt. Eine Tabelle ist als Datenbankbestandteil eine spezielle Ausfhrung einer Datenmenge. Die Tabelle speichert als physisches vorhandenes Element die Daten. Eine Abfrage ist eine virtuelle Datenmenge, die den Inhalt von tatschlich vorhandenen Tabellen in einer frei whlbaren Anordnung abbildet, manchmal auch Projektion genannt. Eine Datenbank ist eine Zusammenstellung von logisch zusammengehrigen Tabellen. Ein Datenbankserver verwaltet verschiedene Datenbanken und stellt auch das Management, die Sicherung und andere Verwaltungsdienste zur Verfgung. Wichtige Informationen bei der Entwicklung einer Datenbankanwendung sind das Verhalten der Datenbank bzw. des Datenbankservers selbst. Was ist eine Datenbank Eine Datenbank ist eine geordnete Sammlung von Daten, die auf irgendeine Weise miteinander in Beziehung stehen. Die ersten Generationen von Datenbanken waren sogenannte File-Systeme. Zuerst auf Band, dann auch auf Festplatten. In diesem Datei-Systemen wurden die Daten nacheinander abgespeichert. Um auf einen bestimmten Datensatz zu zugreifen, muss man an den Anfang der Datei (oder Bandes) gehen und anschlieend alle Datenstze durchlaufen, bis man den richtigen gefunden hat. Somit ist auch klar, das ein einfaches sortieren oder einfgen von Daten in eine

28

3 Grundlagen Datenbank sortierte Datenmenge enormen Aufwand und Kapazitt erfordert hat. Um diesen Beschrnkungen zu entiehen, (und durch neue, schnellere und grere Festplatten ermglicht) haben sich aus diesen System die heutigen relationalen oder objektorientierten Datenbanken entwickelt. Die derzeit am meisten verwendeten Datenbanken sind die relationalen und im weiteren werde ich nur noch diese behandeln. Desktop und Client-Server Datenbankarten Gerade der Begriff Netzwerkdatenbank ist sehr verwirrend. Wird damit eine Access-Datenbank, die mehrere Benutzer ber das Netzwerk verwenden so bezeichnet ? Oder eine Serverbasierende Datenbank? Die folgenden Erklrungen sollten die Begriffe klarer werden lassen. Stand-Alone Datenbank Eine Stand-Alone Datenbank ist eine Desktop-Datenbank, es benden sich daher die Daten auf dem Arbeitsplatzrechner. Auf die Daten kann immer nur ein Anwender, mit immer nur einem Programm zugreifen. Es ist zwar prinzipiell mglich ber ein Netzwerk auf die Datenbankdatei zuzugreifen, aber es kann der eine nur in der Datenbank arbeiten, wenn der andere sein Programm geschlossen hat. Probleme die durch den gleichzeitigen Zugriff entstehen knnen daher gar nicht auftreten. Bei jeder etwas umfangreicheren Datenbank wird dieses Verhalten zu einem Engpass. Man stelle sich nur vor, der eine Benutzer ffnet die Datenbankdatei und vergisst auf das schlieen des Programms. Kein anderer Benutzer kann die Daten in der Zwischenzeit benutzen! File-Share Datenbank Moderne Netzwerke bieten die Mglichkeit, dass mehrer Anwender auf ein und dieselbe Datei zugreifen. Auf diese Weise ist es auch mglich das mehrer Programme auf ein und dieselbe Datenbankdatei zugreifen. Diese Version der Desktop-Datenbank nennt man File-Share Datenbank und damit ist bereits ein echter Mehrbenutzer Betrieb mglich. Das ganze hat jedoch (unter anderem) einen entscheidenden Nachteil: Die Datenverarbeitung erfolgt auf den Arbeitsplatzrechnern. Fr Abfragen muss der jeweilige ganze Datenbestand zu den Arbeitsplatzrechnern gebracht werden, dementsprechend hoch ist die Belastung fr das Netzwerk. Weiter knnen auch Strungen am Netzwerk leicht zu Datenverlust bzw. zu inkonsistenz der Datenbestnden fhren. Client-Server Datenbank Bei Client-Server Datenbanken hat nur der Datenbankserver selbst direkten Zugriff auf die Dateien des Datenbestandes. Anfragen werden somit direkt an den Datenbankserver gestellt, von diesem bearbeitet und die Ergebnisse an den Arbeitsplatzrechner zurckgeliefert. Die Verwaltung beim gleichzeitigen Zugriff durch mehrer Arbeitsplatzrechner obliegt dem Datenbankserver. Falls eine Verbindung durch eine Strung abbricht, so wird dieses erkannt und die noch nicht kompletten Anfragen verworfen und somit die Konsistenz der Daten erhalten. Gerade zur File-Share Datenbank knnen Netzbelastungen drastisch gesenkt werden. Man stelle sich nur vor, das man den grten Wert aus einer unsortierten Tabelle mit 1 Millionen Datenstze habe will. Bei der File-Share Datenbank mssen alle Datenstze geholt und bearbeitet werden, bei der Client Server Datenbank nur das Ergebnis. Weitere Bereiche sind die Mglichkeit Backups zu erstellen whrend die Datenbank weiter in Verwendung ist.

29

3 Grundlagen Datenbank Relationale Datenbanken Der Begriff relationale Datenbank geht auf einen Artikel von E. F. Codd zurck, der 1970 verffentlich wurde. Codd bezeichnet Datenbanken als "minimal relational", wenn sie folgende Bedingungen erfllen. [list] [*]Die Informationen werden einheitlich in Form von Tabellen reprsentiert. [*]Der Anwender sieht keine Verweisstrukturen zwischen den Tabellen. [*]Es gibt mindestens die Operation der Selektion, der Projektion und des JOIN deniert. [/list] 1985 verffentlichte Codd zwlf Regeln, die relationalen Datenbanken im strengeren Sinn denieren, Ende 1990 verffentlichte er ein Buch ber relationale Datenbanken, in dem er die einstigen zwlf Regeln des relationalen Modells auf 333 Regeln differenziert. Dadurch wird die Relationalitt einer Datenbank bis ins letzte Detail festgeschrieben Soweit die Theorie, normalerweise sprechen Hersteller von relationalen Datenbanken, wenn die Mehrheit der 12 Regeln eingehalten werden. Begriffe in relationalen Datenbanken Man kann nicht ber relationale Datenbanken sprechen, ohne zuvor einige Begriffe zu klren. Relationen Eine Relation ist gleich einer Tabelle. Die Daten werden daher in Relationen gespeichert. Attribut und Tuples Die Attribute sind die Spalten einer Relation (Tabelle), die Tuples sind die Datenstze. Degree und Kardinalitt Die Zahl der Attribute einer Relation nennt man Degree, das ist der Ausdehnungsgrad. Die Zahl der Tuples ist die Kardinalitt. Eine Relation mit Degree Null macht keinen Sinn, eine Kardinalitt von NULL Tuples hingegen ist eine leere Relation. Domain Eine Domain ist ein Wertebereich. Man kann z.B. eine Domain Nachnamen vom Type Zeichen mit Lnge 20 erstellen. Diese wird immer dann verwendet wenn man Datenspalten mit dem Type Nachname erstellen muss. Warum dieser Umweg? Wenn man spter Tabellen miteinander verknpft (in Relation bringt), so mssen die Spalten (Attribute) der gleichen Domain unterliegen. Habe ich vorher eine Domain deniert, so gibt es keine Probleme. Weiter ist es kein Problem wenn man draufkommt das die Nachnamen lnger sind, so kann die Denition der Domain gendert werden und alle Spalten haben die richtige Lnge. Wrde ich beim hndischen Editieren eine Spalte vergessen so wrde die Datenbank nicht mehr korrekt arbeiten. NULL Ein Nichtwert der anfangs immer fr Verwirrung sorgt ist NULL. NULL ist nicht gleich Null! Ein besserer Ausdruck wre UNBEKANNT. NULL macht brigens aus einer zweiwertigen Logik (Ja/Nein) eine dreiwertige (Ja/Nein/Unbekannt). Vorstellen kann man es sich am besten mit einem Beispiel. Jedem Konferenzraum kann ein Beamer mit seiner Nummer zugeteilt werden. Die Rume welche keinen Beamer besitzen (zuwenige Beamer vorhanden) bekommen als Wert NULL zugeteilt, da ja ein nicht vorhandener Beamer auch keine Nummer besitzt, folglich also unbekannt ist.

30

3 Grundlagen Datenbank Schlssel Im Zuge der Normalisierung (welche spter erklrt wird) werden die Daten auf viele Tabellen vereilt. Um dieses Tabellen wieder richtig in Relation zu bringen werden verschiedene Schlssel, auch Keys genannt, verwendet. Primrschlssel (Primary Key) Jede Relation (Tabelle) besitzt einen Primrschlssel um einen Datensatz eindeutig zu identizieren. Ausnahmen von dieser Regel gibt es nur bei M:N Verknpfungen fr die Zwischentabellen verwendet werden (die meisten Datenbanksysteme knnen diese Verknpfungen nicht direkt abbilden). Ein Primrschlssel ist immer eindeutig und ohne Duplikate. Meistens wird dafr eine fortlaufende Nummer verwendet, ist aber nicht zwingend. Vorsicht bei bestimmten Fllen, denn selbst Sozialversicherungsnummern mssen nicht eindeutig sein ! Sekundrschlssel (Secundary Keys) Werden dafr verwendet um bei bestimmten Datenbankoperationen die Efzienz zu steigern, da die Datenstze intern nicht ungeordnet sondern in sortierter Reihenfolge verwaltet werden. Beim verwenden sollte aber immer auf die zugrunde liegende Datenbank Rcksicht genommen werden, da die Vor- und Nachteile stark datenbankabhngig sind. Fremdschlssel (Foreign Key) Ist der Verweis in der Tabelle auf einen Primrschlssel in einer anderen Tabelle. Gerade in relationalen Datenbanken gibt es sehr viele Verknpfungen die auf Primr- und Fremdschlsselpaaren aufbauen. Wichtig ist, das Primr- und Fremdschlssel der gleichen Domain unterliegen. Referentielle Integritt Die referentielle Integritt stellt sicher das die Daten zueinander (ber Primr- und Fremdschlssel) glaubhaft bleiben. Ein einfgen, ndern oder lschen ist zu verweigern wenn dadurch die Datenintegritt verletzt wrde. Man kann zum Beispiel keine Datenstze aus der Personentabelle lschen, solange in der Tabelle der Bestelllungen auf diese Personen verwiesen wird. Normalisierung Unter der Normalisierung einer Datenbank, wird die Technik des logischen Datenbankdesigns bezeichnet. Es erfolgt meistens durch das Schrittweise optimieren der Datenbank zur Designzeit. Theoretiker haben insgesamt 5 Stufen der Normalisierung herausgearbeitet, wobei in der Praxis meist nur die ersten 3 Stufen verwendet werden. Warum wird meistens nur bis zur 3. Normalform normalisiert? Bei der Anwendungsentwicklung besteht meistens nicht das Ziel, mglichst den exakten theoretische Grundlagen zu entsprechen, sondern eine mglichst efziente Komplettlsung fr das Problem zu erhalten. Dazu gehrt natrlich auch, die Rcksicht auf das verwendete Datenbanksystem und die damit zu erzielenden Performance. Es leuchtet jedem ein, das die Aufteilung der Informationen auf viele Tabellen bei einer Auswertung zu schlechteren Ergebnissen fhrt. Somit kann es sein, das in Teilbereichen sogar eine Denormalisierung aus Performancegrnden ntig ist, oder der gewonnene Platz bzw. das Geschftsmodell keine Normalisierung sinnvoll erscheinen lassen.

31

3 Grundlagen Datenbank Ausgangslage 1. Normalform Alle Informationen in einer Tabelle Jede Spalte einer Tabelle enthlt unteilbare Informationen. Die Datenstze verwenden keine sich wiederholenden Informationen, die nicht auch zu einer separaten Gruppe zusammengefasst werden knnten Es wird die 1. Normalform eingehalten und alle Informationen in nicht Schlsselfeldern hngen nur vom kompletten Primrschlssel ab Es wird die 2 Normalform eingehalten und alle Informationen in den nicht Schlsselfeldern sind untereinander nicht abhngig. Es wird die 3. Normalform eingehalten und in gleichen Tabellen sind keine unabhngigen Objekte vorhanden, zwischen denen eine m:n Beziehung bestehen knnte Die normalisierte Datenbank kann nicht weiter in Tabellen mit weniger Attributen konvertiert werden. Es muss sich jederzeit der unnormalisierte Ursprungszustand ohne Informationsverlust herstellen lassen Tabelle 3.1: Datenbank Normalisierungstufen bersicht Grunddaten Mit Grunddaten werden die Informationen bezeichnet, die Voraussetzung fr die tgliche Arbeit sind und whrend des tglichen Betriebs anfallen. Sie stellen die Basis des Datenbanksystems dar. Die Grunddaten werden in zwei Kategorien, Stammdaten und Bewegungsdaten, eingeteilt. Stammdaten Stammdaten sind diejenigen Grunddaten, die ber einen lngeren Zeitraum bentigt werden. Sie bilden den Grundbestand an Daten fr das Datenbanksystem und werden auch als Bestandsdaten bezeichnet. Stammdaten weisen eine geringe nderungshugkeit auf. blicherweise ist bei der Neuanlage von Stammdaten noch nicht bekannt, wann nderungen zu erwarten und wie lange die Daten insgesamt gltig sind. Da auf Stammdaten hug zugegriffen wird, ist ihre aktuelle Pege notwendig, so dass nderungen unmittelbar im Datenbestand nachgezogen werden sollten. Somit ist auch die normale Zugriffsart festgelegt, auf Stammdaten wir meistens in Verbindung mit Abfragen lesend zugegriffen, nur die Wartung erfolgt schreibend. Bewegungsdaten Im Gegensatz zu Stammdaten haben Bewegungsdaten eine begrenzte Lebensdauer, die durch einen vorgegebenen Lebenszyklus beschrieben ist. Bewegungsdaten haben einen konkreten Zeitbezug, der fr die Bedeutung und Interpretation der Information wichtig ist. Des weiteren beziehen sich Bewegungsdaten auf Stammdaten, weshalb sie auch als abgeleitete Daten bezeichnet werden. Da Bewegungsdaten gegenber Stammdaten in der Menge mchtiger sind, ist gerade hier auf ein gutes Design zu achten. Betrachten wir es am Beispiel eines Zhlers einer Station: Die Zhler werden im 10 Minutenrhythmus in die Bewegungsdaten eingefgt, das sind 144 Datenstze pro Tag, whrenddessen der Stammdatenteil gleich bleibt, nmlich 1

2 Normalform

3 Normalform 4 Normalform

5 Normalform

32

3 Grundlagen Datenbank Datensatz. Version: $LastChangedRevision: 55 $

Autor: Andreas Frie Lizenz: GFDL

33

3 Grundlagen Datenbank

3.1.2 DDL Datendenitionssprache


Die Datendenitionssprache (Data Denition Language = DDL2 ) umfasst die Sprachteile von Datenbanksprache, mit deren Hilfe man Datenstrukturen wie Tabellen und andere hnliche Elemente erzeugt. Es sind das die Befehle die mit CREATE beginnen, zum Beispiel CREATE TABLE und CREATE INDEX.

3.1.3 DML Datenvernderungssprache


Die Datenvernderungssprache (Data Manipulation Language = DML3 ) umfasst die Sprachteile von Datenbanksprache, die sich mit dem Lesen, ndern und Lschen von Daten beschftigen. Es sind das die Befehle SELECT, INSERT, UPDATE und DELETE. Im folgend sehen wir uns die wichtigsten Befehle an, wobei ein Befehl besonders mchtig istSELECT. SELECT SELECT ist einer der Vielseitigsten und am meisten eingesetzten Befehle berhaupt. Er dient zum Abfragen von Datenmengen aus der Datenbank. Er ermglicht die Abfrage von Daten aus den Tabellen (die Projektion) Einfachste Darstellung wrter zu tun. Bei der einfachsten Abfrage haben wir es mit wenigen Schlssel-

SELECT [DISTINCT] Auswahlliste FROM Quelle WHERE Where-Klausel [GROUP BY (Group-by-Attribut)+ [HAVING Having-Klausel]] [ORDER BY (Sortierungsattribut [ASC|DESC])+]; Mit SELECT wird die Abfrage eingeleitet, anschliessend kommt die Auswahlliste der gewnschten Tabellenspalten. Dann das FROM , das angibt welche Tabellen die Daten bereitstellen und das WHERE, das angibt nach welchen Kriterien die Daten vorselektiert werden. SELECT Auswahlliste Hier gibt man die einzelnen Tabellenspalten an, die sich spter in der rckgelieferten Datenmenge nden. Sind die Name nicht eindeutig genug, besonders wenn mehrere Tabellen betroffen sind, so mu man den Tabellennamen und eventuell auch die Datenbank angeben, sprich die Eindeutigkeit qualizieren. Somit kann ein SELECT so aussehen: SELECT MyDB.STPerson.Vorname, meistens wird die verkrzte Schreibweise verwendet wie SELECT Vorname. In komplexeren Abfragen kann auch statt dem Tabellnamen alleine, eine Funktion stehen. Damit kann man in Datenmengen mathematische und statistische Funktionen verwenden. Auch
2 3

siehe auch http://de.wikipedia.org/wiki/Data_Denition_Language siehe auch http://de.wikipedia.org/wiki/Data_Manipulation_Language

34

3 Grundlagen Datenbank Verzweigungen und Berechnungen sind mglich. Zu diesen Punkten kommen dann an spterer Stelle die entsprechden Erklrungen. DISTINCT erzwingt die Vermeidung von doppelten Datenstzen. Es berspringt in der Ausgabe die mehrfach vorkommenden Datenstze. Die Folge ist ein hherer Aufwand am Server, da das urspngliche Ergebnis (ohne DISTINCT) meist noch entsprechend nachbearbeitet werden mu. Bevor man DISTINCT zur Korrektur unerklrlicher doppelter Datenstze verwendet (Verschleiern von Problemen), sollte man sich zuerst seine JOINS und WHERE Klauseln ganz genau ansehen, denn dort liegt meistens das Problem. Eine gerne verwendete Abkrzung stellt das beliebte SELECT * dar. Hier darf dann das Programm zur Laufzeit erraten, welche Spalten es gibt und von welchen Typ sie sind. Es einfach zu verwenden, birgt aber in fertigen Programmen einiges an versteckten Fehlerquellen. Wird die dem SELECT zugrunde liegende Tabelle gendert oder auch nur Spalten getauscht, so kann es sein, da Fehler nicht beim ausfhren des Statements auffallen (Spalte xx nicht gefunden) und erst andere Programmteile dann unklare Fehlermeldung produzieren. Ich empfehle deshalb, die Spaltennamen wirklich anzugeben. Es gibt Programme die gerade diese Eigenschaft ausnutzen, dort wird es aber bewusst gemacht und entsprechend abgesichert. FROM Quelle FROM gibt die Quelle der Daten an. Es ist einfach der Tabellenname, eine Verbindung von Tabellen (JOIN) oder auch eine untergelagerte SELECT Anweisung. WHERE Where-Klausel Die WHERE - Klausel schrnkt die Ergebnisdatenmenge ein. Bei einfachen Beispielen wird sie gerne, oft zu Unrecht, weggelassen. Wir mssen aber immer Datenmengen betrachten, das Ergebnis kann eine Zeile oder eine million Zeilen sein. Wenn wir in einer Adressdatenbank eine Personen suchen, so wird es trotzdem sinnvoll sein, von Haus aus die Suche einzuschrnken. Denn alles was nicht an Daten sinnlos bertragen werden mu, spart Bandbreite, Speicher und erhht die Geschwindigkeit. GROUP BY (Group-by-Attribut Die Daten werden nach dem Group-by-Attributen zusammengefasst (gruppiert). Dazu mssen auch in der Auswahlliste, fr alle nicht durch GROUP BY erfassten Spalten, entsprechende Operationen verwendet werden (SUM, AVG, MIN, ...). HAVING Having-Klausel Ist als ein WHERE zu betrachten, das allerdings erst nach dem Gruppieren wirksam ist und deshalb nur auf die Gruppierungsfunktionen wirksam ist. ORDER BY (Sortierungsattribut [ASC|DESC]) Die ausgegeben Daten werden entsprechend sortiert. Das Sortierungsattribut sind die entsprechden Spaltennamen in der reihenfolge wie sortiert werden soll. Beispiele zu SELECT SELECT * FROM st_person; Ohne Einschrnkung oder Sortierung.

35

3 Grundlagen Datenbank "STPerson","cVName","cFName","cMName","cRName" 378,"Hope","Giordano","HoGi","Hope0Giordano" 379,"Rose","Bruno","RoBr","Rose4Bruno" 380,"Lauren","Morgan","LaMo","Lauren4Morgan" 381,"Megan","Coleman","MeCo","Megan9Coleman" SELECT * FROM st_person where STPerson = 875; Die Person deren ID 875 ist. "STPerson","cVName","cFName","cMName","cRName" 875,"Hannah","Collins","HaCo","Hannah3Collins" SELECT * FROM st_person where cVName like H%; Alle Personen deren Vorname mit H beginnt. Das Prozentzeichen % ist eine Wildcard. So wie bei manchen Betriebssystemen der Stern *. "STPerson","cVName","cFName","cMName","cRName" 875,"Hannah","Collins","HaCo","Hannah3Collins" 406,"Hannah","Cook","HaCo","Hannah9Cook" 845,"Hannah","Doyle","HaDo","Hannah9Doyle" 1363,"Hannah","Foster","HaFo","Hannah6Foster" SELECT * FROM st_person order by cFName; Alle Personen, aber nach Familienname aufsteigend sortiert. "STPerson","cVName","cFName","cMName","cRName" 1258,"Caitlin","Adams","CaAd","Caitlin4Adams" 687,"Taylor","Alexander","TaAl","Taylor5Alexander" 644,"Renee","Alexander","ReAl","Renee8Alexander" 885,"Taylor","Alexander","TaAl","Taylor3Alexander" 1131,"Sarah","Alexander","SaAl","Sarah5Alexander" 603,"Megan","Allen","MeAl","Megan0Allen" 1172,"Isabella","Allen","IsAl","Isabella0Allen" 472,"Isabelle","Allen","IsAl","Isabelle6Allen" SELECT * FROM st_person order by cFName desc; Alle Personen, aber nach Familienname absteigend sortiert. "STPerson","cVName","cFName","cMName","cRName" 842,"Isabella","Young","IsYo","Isabella6Young" 1232,"Taylor","Young","TaYo","Taylor3Young" 427,"Ashley","Young","AsYo","Ashley3Young" 420,"Kyla","Young","KyYo","Kyla2Young" 668,"Alexandra","Wright","AlWr","Alexandra6Wright" 1070,"Madison","Wright","MaWr","Madison5Wright" SELECT * FROM st_person where cVName like H% order by cFName; Alle Personen deren Vorname mit H beginnt und nach Familienname aufsteigend sortiert.

36

3 Grundlagen Datenbank "STPerson","cVName","cFName","cMName","cRName" 932,"Hope","Bell","HoBe","Hope3Bell" 1194,"Harmony","Campbell","HaCa","Harmony7Campbell" 515,"Harmony","Clark","HaCl","Harmony4Clark" 1279,"Holly","Collins","HoCo","Holly7Collins" 875,"Hannah","Collins","HaCo","Hannah3Collins" 406,"Hannah","Cook","HaCo","Hannah9Cook" 1296,"Harmony","Diaz","HaDi","Harmony1Diaz" SELECT cVName, cFName FROM st_person where cVName like H% order by cFName; Anzeige nur der Spalten cVName und cFName und alle Personen deren Vorname mit H beginnt und nach Familienname aufsteigend sortiert. "cVName","cFName" "Hope","Bell" "Harmony","Campbell" "Harmony","Clark" "Holly","Collins" "Hannah","Collins" "Hannah","Cook" "Harmony","Diaz" SELECT cVName, cFName FROM st_person where (cVName like H%) or (cVName like A%) order by cFName; Anzeige nur der Spalten cVName und cFName und alle Personen deren Vorname mit H oder A beginnt und nach Familienname aufsteigend sortiert. "Alyssa","Butler" "Abby","Butler" "Ashley","Butler" "Ashley","Byrne" "Harmony","Campbell" "Harmony","Clark" "Anna","Clark" "Abby","Coleman" "Hannah","Collins" "Amelia","Collins" "Anna","Collins" SELECT count(cVName), cVName FROM st_person group by cVName order by count(cVName) desc; Anzahl der Vorkommen der Vornamen absteigend sortiert. "count(cVName)","cVName" 19,"Amelia" 19,"Angel" 17,"Laura"

37

3 Grundlagen Datenbank 16,"Elizabeth" 16,"Paris" 16,"Ruby" 15,"Caitlin" 14,"Sophie" 14,"Abby" 14,"Mikayla" SELECT count(cVName) as Anzahl, cVName as Vorname FROM st_person group by cVName order by count(cVName) desc; Anzahl der Vorkommen der Vornamen absteigend sortiert. Dazu noch die Spaltennamen gendert. "Anzahl","Vorname" 19,"Amelia" 19,"Angel" 17,"Laura" 16,"Elizabeth" 16,"Paris" 16,"Ruby" 15,"Caitlin" 14,"Sophie" 14,"Abby" 14,"Mikayla" SELECT count(cVName) as Anzahl, cVName as Vorname FROM st_person group by cVName desc having Anzahl = 16; Anzahl der Vorkommen der Vornamen, Dazu noch die Spaltennamen gendert und die Anzahl mu sechzehn sein "Anzahl","Vorname" 16,"Elizabeth" 16,"Paris" 16,"Ruby" INSERT INSERT wird fr das Einfgen von Datenstzen in eine Tabelle verwendet. Einfache Darstellung zu tun. Beim einfachen Einfgen haben wir es mit wenigen Schlsselwrter

INSERT Ziel (Spaltenliste) VALUES (Werteliste) Bei dem Ziel handelt es sich um die Tabelle in die die Daten eingefgt werden sollen. Die Spaltenliste kann auch weggelassen werden, wenn die Werteliste in der exakt gleichen Reihenfolge ist, wie die Denition in der Tabelle.

38

3 Grundlagen Datenbank Wenn die Spaltenliste vorhanden ist, so mssen die Werte in der Werteliste in der gleichen Reihenfolge stehen. Es mu dann aber nicht die Reihenfolge und Anzahl der Spalten mit der Tabellen Denition bereinstimmen. Das wird normalerweise verwendet, da an Spalten mit automatischen Zhlern (meist Primrschlssel) keine Werte bergeben werden drfen! Beispiele zu INSERT INSERT st_person (cVName,cFName,cMName, cRName) VALUES ("Hope","Giordano","HoGi", "Hope0Giordano"); Bei INSERT und anderen Befehlen zur Erstellung von Daten, gibt es kein Ergebnismenge. SELECT * FROM st_person; "STPerson","cVName","cFName","cMName","cRName" 1,"Hope","Giordano","HoGi","Hope0Giordano" 2,"Harmony","Campbell","HaCa","Harmony7Campbell" 3,"Harmony","Clark","HaCl","Harmony4Clark" 4,"Holly","Collins","HoCo","Holly7Collins" Die Spalte STPerson, ist zwar beim INSERT nicht angegeben, wird vom System automatisch vergeben. Ein weiteres Beispiel bendet unter Projekt MySQLTestData UPDATE Mit UPDATE knnen die Daten in den Tabellen gendert werden. Einfache Darstellung zu tun. Beim einfachen ndern haben wir es mit wenigen Schlsselwrter

UPDATE Ziel SET Spalte1 = Wert1 , Spalte2 = Wert2 WHERE Where-Klausel Bei dem Ziel handelt es sich um die Tabelle in der die Daten gendert werden sollen. Nach dem Schlsselwort SET erfolgt die Auistung der Spalten mit den neuen Wert. Wichtig ist hier die WHERE-Klausel! Fehlt sie so werden alle Datenstze der Tabelle gendert! Soll nur ein einziges Datensatz von der nderung gendert werden, so mu die Einschrnkung richtig deniert sein. Normalerweise wird hier der Primrschlssel (auch zusammengesetzt) verwendet, denn so ist die Eindeutigkeit sichergestellt. Bezglich der Mglichkeiten der WHERE-Klausel bitte beim Befehl SELECT nachzulesen. Beispiele zu UPDATE UPDATE st_person set cRName = "HoGi"WHERE STPerson = 1; Bei UPDATE und anderen Befehlen zur Erstellung von Daten, gibt es kein Ergebnismenge.

39

3 Grundlagen Datenbank SELECT * FROM st_person; "STPerson","cVName","cFName","cMName","cRName" 1,"Hope","Giordano","HoGi","HoGi" 2,"Harmony","Campbell","HaCa","Harmony7Campbell" 3,"Harmony","Clark","HaCl","Harmony4Clark" 4,"Holly","Collins","HoCo","Holly7Collins" UPDATE st_person set cVName = "Hopper", cRName = "HoGi1"WHERE STPerson = 1; Hier werden zwei Spalten gleichzeitig gendert SELECT * FROM st_person; "STPerson","cVName","cFName","cMName","cRName" 1,"Hopper","Giordano","HoGi","HoGi1" 2,"Harmony","Campbell","HaCa","Harmony7Campbell" 3,"Harmony","Clark","HaCl","Harmony4Clark" 4,"Holly","Collins","HoCo","Holly7Collins" UPDATE st_person set cVName = "HaHa"WHERE cVName like Ha; Hier werden mehrere Datenstze gleichzeitig gendert SELECT * FROM st_person; "STPerson","cVName","cFName","cMName","cRName" 1,"Hopper","Giordano","HoGi","HoGi1" 2,"HaHa","Campbell","HaCa","Harmony7Campbell" 3,"HaHa","Clark","HaCl","Harmony4Clark" 4,"Holly","Collins","HoCo","Holly7Collins" DELETE Mittels dem Befehl DELETEwerden Datenstze in der Datenbank gelscht. Einfache Darstellung Beim einfachsten DELETE haben wir es mit wenigen Schlsselwrter zu tun. DELETE Ziel WHERE Where-Klausel Aber Vorsicht, ohne entsprechende WHERE-Klausel werden alle betroffenen Datenstze gelscht. Daher gilt, fehlt die WHERE-Klausel, so werden alle Datenstze unwiderruich gelscht!

40

3 Grundlagen Datenbank Beispiele zu DELETE DELETE FROM st_person WHERE STPerson = 1; Bei DELETE und anderen Befehlen zur Erstellung von Daten, gibt es kein Ergebnismenge. Hier wird der Datensatz mit dem Wert 1 in der Spalte STPerson gelscht. SELECT * FROM st_person; "STPerson","cVName","cFName","cMName","cRName" 1,"Hope","Giordano","HoGi","HoGi" 2,"Harmony","Campbell","HaCa","Harmony7Campbell" 3,"Harmony","Clark","HaCl","Harmony4Clark" 4,"Holly","Collins","HoCo","Holly7Collins" DELETE FROM st_person WHERE STPerson = 1; SELECT * FROM st_person; "STPerson","cVName","cFName","cMName","cRName" 2,"Harmony","Campbell","HaCa","Harmony7Campbell" 3,"Harmony","Clark","HaCl","Harmony4Clark" 4,"Holly","Collins","HoCo","Holly7Collins" DELETE st_person WHERE STPerson = 1; Bei DELETE und anderen Befehlen zur Erstellung von Daten, gibt es kein Ergebnismenge. Hier werden alle Datenstze in der Tabelle st_person gelscht! SELECT * FROM st_person; "STPerson","cVName","cFName","cMName","cRName" 1,"Hope","Giordano","HoGi","HoGi" 2,"Harmony","Campbell","HaCa","Harmony7Campbell" 3,"Harmony","Clark","HaCl","Harmony4Clark" 4,"Holly","Collins","HoCo","Holly7Collins" DELETE FROM st_person; SELECT * FROM st_person; "STPerson","cVName","cFName","cMName","cRName"

3.1.4 DCL Datenkontrollsprache


Die Datenkontrollsprache (Data Control Language = DCL4 ) umfasst die Sprachteile von Datenbanksprache, mit deren Hilfe man die Rechte vergibt, Wartungen durchfhrt. Es sind das Befehle wie GRANT und REVOKE.
4

siehe auch http://de.wikipedia.org/wiki/Data_Control_Language

41

3 Grundlagen Datenbank Version: $LastChangedRevision: 52 $


5

Autor: Andreas Frie Lizenz: GFDL

42

4 Installation
4.1 Linux openSUSE Erweiterte Lazarusinstallation
Installation von FPC, Erstellung der Lazarus-IDE aus dem SVN Das Tutorial wurde auf der Grundlage einer frischen Installation von OpenSUSE mit XFCE verfasst und getestet. Sollte es auf ein bestehendes System angewendet werden, knnen natrlich kleine Unterschiede mglich sein. Beispielsweise knnten die bentigten Packete schon installiert sein, so dass die entsprechenden Passagen bersprungen werden knnen. Auerdem sollte bei bereits bestehenden Installationen sichergestellt werden, das es nicht zu Konikten zwischen den Versionen kommt. So sollte eine vorhandene Version des Freepascalcompilers wenn man sicher gehen mchte und keine hndischen nderungen vornehmen will (die hier nicht beschrieben sind) vor der Installtion von FPC 2.2.0 deinstalliert werden. Inhalt: 1. Installation von Freepascal 2.2.0 2. Systemvorbereitungen fr Lazarus und Installation von Lazarus aus dem SVN 3. Crosscompiling 4. Wine und GTK2 Anmerkung: Die Tutorialserie baut auf einem System mit 32 Bit auf. Fr die 64-Bit-Version von FPC/Lazarus knnen abweichungen auftreten.

4.1.1 Installation von Freepascal 2.2.0


Da fr die Installation von Freepascal bei RPM-Basierten Sytsemen lediglich zwei RPMs - eins fr den eigentlichen FPC und eins fr die Sourcen - installiert werden muss, gestaltet sich die Installation von Freepascal extrem einfach. Zunchst mssen die entsprechenden beiden RPMs von der Sourceforge-Seite heruntergeladen werden (alternativ gehen natrlich auch andere FPC-Mirrors): Bentigt werden folgende zwei Pakete, welche am besten im Homeverzeichnis gespeichert werden (unter der Annahme eines 32Bit-Systems, auf welcher die gesamte Tutorialserie basiert): fpc-2.2.0-0.i386.rpm fpc-2.2.0-0.src.rpm Momentan scheint dieses packet nicht zu funktionieren, es wird gem der Vollstndigkeit jedoch trotzdem aufgefhrt; Die bentigten Quelltexte werden allerdings spter separat installiert

43

4 Installation Downloadseite fr Freepascal bei Sourceforge1

Nach dem Download ffnet man das Homeverzeichnis, in welchem nun die beiden RPMs zu nden sein sollten

Nun ffnet man in diesem Verzeichnis ein Terminal (meist ber das Kontextmen und Terminal hier ffen o..). ber folgende Eingaben im Terminal installieren wir nun den Freepascalcompiler auf dem System: Code: (Plaintext) ~ su # rpm -ivh fpc-2.2.0-* # exit Die Ausgabe zur Installation sollte in etwa so aussehen:

Zur vollen Sicherheit, ob der FPC korrekt installiert wurde, gebe man nun noch folgendes ein: ~ fpc ~ exit wobei nach fpc ungefhr folgende Ausgabe erscheinen sollte:

4.1.2 Systemvorbereitung fr Lazarus


Lazarus bentigt einige Abhngigkeiten, damit es auf dem System fehlerfrei erstellt und benutzt werden kann. Auerdem bentigt man zum Auschecken der Lazarussourcen aus dem SVN natrlich einen entsprechenden SVN-Clienten auf dem lokalen Rechner. Bei den Paketquellen wird davon ausgegangen, das dass Hauptrepository OSS als Onlinequelle eingebudnen ist. Ob die bentigten Pakete auf der DVD-Version zur Verfgung stehen, kann ich nicht mit sicherheit sagen. Zumindest bietet jedoch die 1-CD-Installaiton von openSUSE die bentigten Pakete nicht auf der CD an. Die bentigte Paketquelle lsst sich aber nachtrglich auch bequem ber Yast einbinden, sollte man bei der Installation nicht bereits das Hkchen fr
1

http://sourceforge.net/project/showles.php?group_id=2174

44

4 Installation Online-Repositories hinzufgen gesetzt und die Quellen ausgewhlt haben. (Alternativ kann das Repo mit einem Klick ber Yast Community Repositories aktiviert werden) Subversion ber SVN ist es mglich, stets die aktuellen Sourcen von Lazarus zu installieren. Den ntigen Klienten kann man bequem aus dem Opensuse-Repository installieren. Dafr ffne man Yast und anschlieend Software installieren und lschen. Dort kann man bequem nach Subversion suchen und das entsprechende Paket zur Installation vormerken und anschlieend installieren.

Abhngigkeiten von Lazarus Alles in allem lassen sich die fr Lazarus bentigten Pakete unter openSUSE 10.3 einfach Installieren. Im Gegensatz zur vorhergehenden Version von OpenSuse ist es auch nicht mehr ntig, dritt-Paketquellen einzubinden, um die bentigten Pakete zur Verfgung zu haben. So knnen bequem und ohne Drittpakete nutzen zu mssen, die bentigten Abhngigkeiten installiert werden. Dafr whle man in Yast lediglich das Paket gdk-pixbuf-devel zur Installation aus und akzeptiere alle automatischen nderungen. So werden durch die Abhngigkeiten der gdk-pixbuf-devel auch andere bentigte Pakete wie gtk-devel und glib-devel automatisch mit installiert und man kann anschlieend, nachdem die entsprechenden nderungen bernohmen wurden, mit der Installation der Lazarus-IDE fortfahren.

45

4 Installation

FPC-Quellen Da das FPC-Sourcepaket leider nicht alle bentigten Sourcen installiert, mssen diese manuell hinzugefgt werden. Dabei sind zwei Wege denkbar. Man ld das Paket fpc-2.2.0.source.tar.gz von obiger Sourceforge-Seite herunter und kopiert den gesamten Inhalt in einen Ordner im Homeverzeichnis oder beispielsweise nach /usr/share/fpcscr dieses Verzeichnis muss spter in Lazarus unter Umgebungseinstellungen als Quellverzeichnis der FPC-Sourcen angegeben werden. Der Zweite Weg [nach Meinung des Autors der zu bevorzugende] besteht darin, einen entsprechenden Ordner (im Home) anzulegen und die Quellen direkt aus dem entsprechenden SVNArchiv zu holen mittels: ~ svn co http://svn.freepascal.org/svn/fpc/tags/release_2_2_0 ./

4.1.3 Installation von Lazarus aus dem SVN


Ein entscheidender Vorteil neben der Aktualitt einer Installation aus dem SVN besteht darin, das Lazarus in ein frei whlbares verzeichnis installiert werden kann. Somit empehlt es sich, Lazarus ins eigene Homeverzeichnis zu installieren. Der Vorteil dabei liegt klar darin, das spter Lazarus schnell und ohne erst als root angemeldet zu sein gendert und neu erstellt werden kann. Fr besonders Vorsichtige, welche nicht mit der aktuellen SVN-Version arbeiten wohlen ist es ja auch mglich, die Relaeseversionen aus dem Lazarus-SVN zu nutzen, anstatt den Bereich trunk auszuchecken. Die weitere Beschreibung bezieht sich allerdings auf die aktuellste Version von Lazarus aus dem trunk, da in dieser oftmals Probleme behoben sind, die die Releaseversionen noch aufweisen.

46

4 Installation Man sollte sich nun also ein entsprechendes Verzeichnis in seinem Home erstellen, bspw. lazarus_trunk oder auch nur lazarus je nach Geschmack und der berlegung, ob man vielleicht noch eine zweite Version (bspw. das letzte Relaese) installieren mchte. Anschlieend ffnet man wieder in diesem neuen, noch leeren Verzeichnis ein Terminal in welchem man nun den entsprechenden Befehl eingibt, um das SVN aus dem lokalen Verzeichnis zu holen: ~ svn co http://freepascal.org/svn/lazarus/trunk ./ nun wartet man...bis schlielich alle Dateien im Ordner zu nden sind und eine Meldung wie diese erscheint:

Danach kann man gleich im selben Terminal den entscheidenden Befehl eingeben, um Lazarus zu erstellen: ~ make Dies kann etwas dauern...man knnte sich also beispielsweise den Kaffee holen... Nachdem dies dann hoffentlich ohne Fehlermeldungen abgeschlossen ist, kann man Lazarus ber das Terminal ffnen mit ./lazarus Nun wird man noch darauf hingewiesen werden, das das Quelltextverzeichnis falsch gesetzt ist. Um dies zu korrigieren geht man inder IDE auf Einstellungen Umgebungseinstellungen... und gibt bei FPC-Quelltextverzeichnis das oben angelegte Verzeichnis mit den FPC-Sourcen an.

4.1.4 Erstellen der Crosscompiling-Umgebung


Hierbei gibt es einen gravierenden Unterschied zu lteren Versionen vom FPC. Musste man bei alten Versionen fr die Erstellung von Windowsanwendungen unter Linux ein extra Paket FPCCross... installieren, so bringt der FPC 2.2.0 schon alle bentigten Elemente mit, um mit wenigen Befehlen und ein bisschen Anpassung der fpc.cfg aus den Freepascalsourcen einen lauffhigen

47

4 Installation Crosscompiler von Linux auf Windows zu erstellen. Zunchst bentigt man dazu jedoch das komplette Packet der FPC-Sourcen. Da wir bereits ein entsprechendes Verzeichnis mit allen FPC-Sourcen angelegt haben (siehe Teil 2), knnen wir dies nun gleich nutzen. In diesem ffnet man nun ein Teminal und gibt folgendes ein: ~ # # # ~ su make all OS_TARGET=win32 CPU_TARGET=i386 make crossinstall OS_TARGET=win32 CPU_TARGET=i386 exit exit

danach sollte in usr/local/lib/ ein Ordner namens fpc vorhanden sein, in welchem unter 2.2.0/units/i386win32 die neu erstellten Untis fr das crosscompiling zu Windows zu nden sind. Anpassung der fpc.cfg Nun muss allerdings noch eine Anpassung an der in /etc zu ndenden fpc.cfg vorgenohmen werden, damit der FPC auch Klarheit darber hat, wo er die entsprechenden Units fr Windows nden kann. Ohne diese nderung greift er automatisch auf die Linuxunits zu, wodurch natrlich keine Kompilierung fr Windows mglich ist. Da normale Nutzer unter /etc kein Schreibrecht haben ist es ntig, die Datei mit Adminrechten zu ffnen, wie das geht, sei den einzelnen Plattformen/Desktops berlassen. (Unter XFCE im Terminal su und anschlieend thunar, dann kann man mit Adminrechten durch Dateisystem ziehen und in /etc die fpc.cfg editieren. Ebeso kann man in KDE Konquero aus dem Terminal heraus mit Rootrechten starten) Folgende nderung muss in der fpc.cfg eingefgt werden: Relativ weit unten nden sich in der standardmig installierten fpc.cfg folgende Zeilen: # searchpath for units and other system dependent things -Fu/usr/lib/fpc/$fpcversion/units/$fpctarget -Fu/usr/lib/fpc/$fpcversion/units/$fpctarget/* -Fu/usr/lib/fpc/$fpcversion/units/$fpctarget/rtl #-Fu~/fpc/packages/base/*/units/;~/fpc/fcl/units/;~/fpc/rtl/units/ Diese Eintragungen sollten wie folgt erweitert werden: # searchpath for units and other system dependent things #IFDEF win32 -Fu/usr/local/lib/fpc/2.2.0/units/i386-win32/ -Fu/usr/local/lib/fpc/2.2.0/units/i386-win32/* -Fu/usr/local/lib/fpc/2.2.0/units/i386-win32/rtl -XPi686-mingw32-

48

4 Installation -FD/usr/local/lib/fpc/2.2.0 #ELSE linux -Fu/usr/lib/fpc/$fpcversion/units/$fpctarget -Fu/usr/lib/fpc/$fpcversion/units/$fpctarget/* -Fu/usr/lib/fpc/$fpcversion/units/$fpctarget/rtl #-Fu~/fpc/packages/base/*/units/;~/fpc/fcl/units/;~/fpc/rtl/units/ #ENDIF Somit wird der FPC angewiesen, fr das normale Erstellen von Linuxanwendungen auf die schon vorher eingestellten Units in /usr/lib... zuzugreifen, whrend dessen er fr das erstellen von Windowsprogrammen im Verzeichnis /usr/local/lib/fpc... fndig wird. Anschlieend sollte man in der Lazaruside unter den Ungebungseinstellungen den FPC-Quelltextverzeichnispfad auf das oben ausgecheckte Quellverzeichnis des FPC legen. Nachdem der FPC in der Lage ist, Windowsanwendungen zu compilieren, muss noch Lazarus entsprechend angepasst werden. Dazu geht man in Lazarus auf Werkzeug Lazarus erstellen einrichten... und whlt im erscheinenden Dialog den Reiter Erweiterte Build-Optionen

49

4 Installation Innerhalb dieses Dialogs mssen folgende Einstellungen gesetzt werden (wie auch im Bild zu sehen): LCL, SynEdit, CodeTools, Package-Registrierung IDE-Schnittstellen mssen auf Clean and Build gesetzt werden JIT-Form, IDE, Starter und Beispiele mssen hingegen auf none gesetzt sein Bei LCL-Schnittstelle whlt man win32/win64 aus Zielbetriebssystem wird ebenfalls win32 angegeben Anschlieend werden die entsprechenden Elemente durch Klick auf erstellen neu erstellt. Da Laz die erstellten Units automatisch fr jede LCL-Schnittstelle (Widgetset) in eigene Unterordner packt, ist es nicht jedesmal ntig, die entpsrechenden Komponenten neu zu erstellen, wenn das Projekt anstatt fr Windows wieder fr Linux erstellt werden soll. Allerdings sollte man bei nderungen an den Lazarus-Sourcen, beispielsweise durch ein update aus dem SVN, alle verwendeten Schnittstellen neu erstellen, da es sonst zu Fehlern aufgrund der Unterschiedlichen Dateiversionen kommen kann. Mchte man nun ein Projekt fr Windows unter Linux erstellen, mssen zwei Umstellungen an den Compilereinstellungen vorgenohmen werden. Dazu ruft man ber Projekt Compilereinstellungen... den entsprechenden Kongurationsdialog auf. In diesem mssen nun zwei Eintragungen gendert werden, um ein unter Windows lauffhiges Programm zu erstellen: im Reiter Pfade muss die Einstellung LCL-Schnittstelle auf win32/win64 gesetzt werden auf dem Reiter Quelltext muss das Zielbetriebssystem auf Win32 eingestellt werden Anschlieend kann man das Projekt ber Start Erstellen neu bauen, woraufhin sich im Ausgabeordner eine unter Windows lauffhige exe bendet. Logischer Weise ist dieses Programm unter Linux nicht ohne Hilfsmittel ausfhrbar, weshalb es auch zu einem Fehler kommt, wenn man statt nur auf Erstellen zu gehen, das Projekt ber F9 bzw. Start gleich ausfhren mchte.

4.1.5 Wine
Wie bereits im vorhergehenden Teil angesprochen, ist es zwar nach entsprechender Konguration ber Start > Erstellen mglich, ein unter Windows lauffhiges Executabel zu erzeugen, allerdings kann dieses nicht ohne weiteres ber Start auch ausgefhrt werden. Dieser Umsatnd erschwert das effektive erstellen von crosscompilierten Programmen jedoch sehr stark. Da es doch kleine Unterschiede zwischen den Widgetsets gibt und man das Programm zumindest mal kurz beriegen sollte, ob alles, wie angedacht funktioniert, eh man es weitergibt. Eine Abhilfe dabei schafft wine. Wine bietet die Mglichkeit, Windowsprogramme unter Linux auszufhren indem es wichtige Windowsschnittstellen unter Linux zur Verfgung stellt und entsprechende Aufrufe auf Linuxeigene umleitet.

50

4 Installation Installation von WINE Wine sollte wohl bei den meisten Linuxdistributionen in den Repositories vorhanden sein. Somit ist es in der Regel bequem ber den Paketmanager (ob nun yast, yum, rpm, apt-get usw.) zu nden und es kann relativ Problemlos installiert werden. Bezogen auf openSuse 10.3 empehlt es sich, unter Yast noch folgende Einstellung vor der Wineinstallation vorzunehmen: Software Community Repositories aufrufen dort das Wine-CVS-Repositorie aktivieren und Beenden

Anschlieend werden die Paketdaten dieses Pepositories heruntergeladen und dem Softwarekatalog hinzugefgt. Damit kann man bei der Installation von wine die neuere Version auswhlen, anstatt die ltere aus dem Hauptrepository zu nutzen. Nun kann man wie gewohnt ber Yast Software Installieren oder lschen nach WINE suchen und dieses installieren. Alernativ funktioniert das folgende natrlich auch mit der (lteren) Version des Hauptrepositories bzw. bei anderen halbwegs aktuellen Distributionen mit der zur Verfgung stehenden Version von WINE. Programme in WINE ausfhren Nachdem WINE erfolgreich installiert wurde, muss nun Lazarus noch so konguriert werden, dass crosscompilierte Windowsprogramme automatisch in WINE gestartet werden.

51

4 Installation Dazu ffnet man zunchst ber Start > Startparameter den Dialog in welchem die entsprechenden Kongurationen zum Ausfhren der Anwednungen eingestellt werden knnen.

In diesem Dialog mssen zwei Einstellungen gesetzt werden: Startprogram verwenden muss aktiviert werden in der darunterliegenden Zeile muss folgender Startbefehl eingestellt sein: /usr/bin/wine $(TargetCmdLine) Nun kann das Projekt auch ber Start ausgefhrt werden und das erstellte Windowsexecutabel kann unter Linux begutachtet werden. Mchte man das Programm wieder fr Linux erstellen, mssen folgende nderungen wieder rckgngig gemacht werden: Start > Startparameter...: Startprogramm verwenden muss deaktiviert werden Projekt > Compilereinstellungen...: Reiter Pfade: LCL-Schnittstelle zurcksetzen Projekt > Compilereinstellungen ...: Reiter Quelltext: Zielbetriebssystem auf Linux zurcksetzen

4.1.6 Eyecandy - GTK2


Unter Linux stehen dem Programmierer verschiedene LCL-Schnittstellen (Widgetsets) zur Verfgung. Whrenddessen man unter Windows sich keinerlei Gedanken machen muss, welche Schnittstelle man verwenden will, da es nur eine Standardschnittstelle gibt, bietet Linux von Haus aus je nach Desktopoberche und System verschiedene Mglichkeiten an. So basiert die Desktopumgebung KDE auf dem qt-Widgetset, whrenddessen andere, wie Gnome und XFCE auf dem Gimp-Tool-Kit (GTK/GTK2) basieren. Standardmig wird Lazarus mit GTK erstellt und alle erstellten Programme besitzen unter Linux ebenfalls eine GTK-Oberche. Allerdings sieht GTK unter den aktuellen Desktopoberchen wohl fr die meisten Benutzer doch recht altertmlich aus. Hinzu kommt, das moderne Linuxdistributionen teilweise das GTKWidgetset standardmig nicht mehr installieren, stattdessen wird nur GTK2 von Haus aus installiert. Daher sollte man sich berlegen, ob man sein Programm nicht gleich der besseren Optik wegen mit GTK2 kompilieren will, anstatt GTK zu benutzen. Um Programme fr GTK2 zu erstellen muss zunchst ber yast (oder eine andere Packetverwaltung) das Package gtk2-devel installiert werden. Danach mssen die entsprechenden Teile von Lazarus neu erstellt werden. Dabei kann man fast genauso vorgehen, wie bei der Vorbereitung zur Erstellung von Crosscompilierten Programmen:

52

4 Installation Man geht in Lazarus auf Werkzeug Lazarus erstellen einrichten... und whlt im erscheinenden Dialog den Reiter Erweiterte Build-Optionen in welchem man folgende Einstellungen vornimmt: LCL, SynEdit, CodeTools, Package-Registrierung und IDE-Schnittstellen mssen auf Clean and Build gesetzt werden JIT-Form, IDE, Starter und Beispiele mssen hingegen auf none gesetzt sein Bei LCL-Schnittstelle whlt man gtk2 aus Anschlieend kann man Lazarus, oder besser gesagt, die LCL und relevante Schnittstellen, neu erstellen. Um nun nach diesen Vorbereitungen das eigene Programm fr GTK2 zu erstellen, muss dies in den Projekteinstellungen angepasst werden: Dazu ruft man ber Projekt Compilereinstellungen... den entsprechenden Kongurationsdialog auf. im Reiter Pfade muss die Einstellung LCL-Schnittstelle auf GTK2 gesetzt werden Anschlieend sollte man beim nchsten Start des Projektes anstatt des GTK ein GTK2-Design der eigenen Anwendnung sehen. Der Vollstndigkeit wegen muss noch folgendes gesagt werden. GTK ist das am besten entwickelte Widgetset von Lazarus unter Linux, folglich ist dies auch in den meisten Fllen das fehlerfreiste. Dennoch sollten viele Anwendungen auch Problemlos auf GTK2 laufen. So ist es auch mglich, die Lazarus-IDE mit GTK2 neu zu kompilieren, wie das folgende Bild zeigt.

53

4 Installation

Auch eine Neukompilierung fr QT ist mglich, jedoch ist QT teilweise noch recht fehleranfllig, wobei sich gerade da in letzter zeit sehr viel getan hat. So ist es natrlich jedem freigestellt, QT zu verwenden, bzw. zu testen. Fr die ntigen Grundlagen sei dabei auf das Wiki von Lazarus verwiesen. Um die IDE fr GTK2 zu erstellen, setzt men einfach im Lazarus neu erstellen-Dialog alles auf Build und whlt als LCL-Schnittstelle GTK2. Anschlieend sollte sich Lazarus nach erfolgreicher Kompilierung automatisch mit der optisch ansprechenderen GTK2-Oberche starten. Allerdings sei nochmal darauf hingewiesen, das in dieser teilweise Ungereimtheiten auftreten knnen, welche in GTK nicht vorhanden sind. Sollte man wieder auf GTK wechseln wollen, kann man die IDE ebenso wieder fr GTK neu erstellen. Version: $$ 2

Autor: Johannes Mller Lizenz: GFDL

54

4 Installation

4.2 Linux Debian Etch Snapshotinstallation


Als Basis fr die Installationsbeschreibung wird ein frisch aufgesetztes Debian Etch System genommen. Diese Installationsbeschreibungen werden auf der Basis des Desktopsystem im Tasksel der Installation von Debian installiert. Es ist somit ein Grasches System auf Basis Gnome vorhanden. Ausserdem wird hier die Installation fr i386 Prozessoren beschrieben, solange nichts anderes angegeben wird. Die Snapshots werden tglich automatisch aus dem SVN von Lazarus erstellt und auf der Snapshot Downloadseite vom Lazarusprojekt[LazEn]3 zum Herunterladen angeboten. HINWEIS: Das sind automatisch erzeuge Pakete aus dem Stand vom SVN. Es kann Projekte zerstren, den Computer beschdigen, die Festplatte zerstren !! VIEL GLCK !! Es ist komplett ungetestete Software - es kann funktionieren, mu aber nicht.

4.2.1 Vorbereitung
Als vorbereitung mssen folgende Pakete (mit ihren Abhngigkeiten) vorinstalliert sein. Alien, libglib1.2-dev,

libgdk-pixpuf-dev

und libgtk2.0-dev.

Letzteres auch dann, wenn keine GTK2 kompiliert werden soll. Es ist mittlerweile zwingend notwendig. Es ist egal ob die Pakete mit Aptitude, apt-get, Synaptic oder ... installiert werden. Die restlichen Pakete werden durch die Abhngigkeit zu den genannten Paketen automatisch mitinstalliert.
3

http://www.hu.freepascal.org/lazarus/

55

4 Installation

4.2.2 Download
Von der Downloadseite die Pakete fr den FPC (fpcversion-datum.i386.rpm), die FPC Quelldateien ((fpcsrc-version-datum.i386.rpm) und Lazarus (lazarus-versiondatum.i386.rpm) herunterladen. Dabei steht das Wort version fr die gewnschte Version und datum fr das gewnschte Datum. Es wird nicht empfohlen beim FPC verschiedene Versionen und Datum zu mischen.

4.2.3 Umwandeln RPM -> DEB


Die Pakete liegen jetzt im RPM Format vor, der Standardinstaller von Debian erwartet aber Pakete die im Format DEB vorliegen. Die Umwandlung dafr nimmt das Debian Tool Alien vor. Dazu mu man ein sich entweder ein Rootterminal ffnen oder die folgenden Befehle als Root ausfhren oder mit sudo arbeiten. Im Terminal gibt man alien --to-deb -c paketname fr jedes der heruntergeladenen Pakete an, wo bei fr paketname der volle Name des Paketes inklusive der Extension (rpm) steht. Die Option to-deb weist Alien an, das Paket in das Debianformat zu konvertieren und die Option -c sagt, das zustzlich auch die Scripts umgewandelt werden sollen. Die Umwandlung nimmt einiges an Zeit und Platz in Anspruch und liefert als Ergebnis die Pakete mit der Endung deb. Die Originalpakete knnten jetzt gelscht werden.

4.2.4 Installation
Die durch Alien erzeugen Pakete kann man jetzt ganz einfach installieren. Man fngt mit dem FPC an, anschliessend die FPC-Sourcen und zuletzt dann Lazarus. Am einfachsten ist, das man die Pakete in Gnome mittels GDebi Paket Installer einfach einzeln installiert. Anschliessend an die Installation mu der Lazarusstarter mit Rootrechten aufgerufen werden und Lazarusinklusive der Widgetsets neu kompilert werden. Die root Berechtigung ist notwendig, da ansonsten zu wenig Rechte vorhanden sind um Lazarus beziehungsweise die Bibliotheken ordnungsgem zu kompilieren und an die richtige Stelle zu bringen. Auf der Konsole ist dazu folgendes einzugeben sudo startlazarus oder nur startlazarus auf der Rootkonsole.

56

4 Installation Innerhalb von Lazarus wechselt man dann mit dem Men Werkzeug -> Lazarus erstellen in den Erstellungs Dialog. Innnerhalb von diesen kann man sich dann das entsprechende Widgetset einstellen. Fr das erste recompileren sind bevorzugt die Einstellungen wie am Bild vorzunehmen. Beim Widgetset hat die Wahl zwischen dem stabilen gtk und dem neueren (noch nicht voll ausgereiften) gtk2. Im Beispiel wird Lazarus mit dem gtk2 Widgetset erzeugt. Wichtig ist, das die LCL neu erstellt wird. Wenn das Kompileren erfolgreich war, so kann man Lazarus und die Konsolen schliessen.

4.2.5 Ausfhrung
Aufgerufen wird Lazarus ber das Men Anwendungen -> Entwicklung -> Lazarus. Damit luft Lazarus im Kontext des aktuellen Benutzers. Dieses ist fr die normale Programmierung ausreichend. Die Projekte sind am besten im Heimatverzeichnis (home) des Benutzers aufgehoben. Diese Projektordner sind nicht vorhanden, sondern mssen selbst erstellt werden. Die Dialoge zum Speichern enthalten immer den Button Neues Verzeichnis, mit dessen Hilfe die Verzeichnisse angelegt werden knnen. Anders ist die Sache wenn man Lazarus selbst neu kompilieren mu. Dort ist das Vorgehen wie im letzten Absatz der Installation beschrieben anzuwenden. Version: $$ 4

Autor: Andreas Frie Lizenz: GFDL

57

5 Lazarus IDE
5.1 Entwicklungsumgebung
5.1.1 Tastenkombinationen
Die aktuelle Quelle fr die Tastenkombinationen 1 ist die Lazarus-Homepage[10]. Datei Tastenkrzel Strg+O Strg+S Umsch+Strg+S Strg+P

Erklrung Datei ffnen Datei speichern alle Dateien speichern Drucken Tabelle 5.1: IDE - Tastenkombinationen Datei

Bearbeiten Tastenkrzel Strg+Z Umsch+Strg+Z Strg+X Strg+C Strg+V Strg+I Strg+U Strg+A Umsch+Strg+D Umsch+Strg+C

Erklrung Rckgngig Wiederholen Auswahl ausschneiden Auswahl kopieren Auswahl einfgen Auswahl einrcken Auswahl ausrcken Alles auswhlen $IFDEF einfgen Kodevervollstndigung (Class Completion) Tabelle 5.2: IDE - Tastenkombinationen Bearbeiten

Version: $LastChangedRevision: 65 $

1 2

/Lazarus_IDE_Tools/de#.C3.9Cbersichtstabelle_der_IDE_Tastenkombinationen Autor: Andreas Frie Lizenz: GFDL

58

5 Lazarus IDE

Suchen Tastenkrzel F3 Umsch+F3 Strg+R Strg+E Strg+G Strg+H Umsch+Strg+H Strg+F8 Umsch+Strg+F8 Alt+Up Strg+Enter Umsch+Strg+G

Erklrung nchstes suchen vorheriges suchen Ersetzen Inkremtielle Suche Zu Zeile springen Zurckspringen Vorwrtsspringen Zum nchsten Fehler springen Zum vorherigen Fehler springen Deklaration unter Cursor suchen Datei unter Cursor ffnen Prozedur Liste Tabelle 5.3: IDE - Tastenkombinationen Suchen

Ansicht Tastenkrzel F11 Strg+F12 Umsch+F12 F12 Strg+Alt+F Strg+Alt+B Strg+Alt+W Strg+Alt+L Strg+Alt+S

Erklrung Objektinspektor anzeigen Unitliste anzeigen Formularliste anzeigen Formulare/Unit Anzeige umschalten Suchergebnisse anzeigen berwachte Ausdrcke Haltepunkte Lokale Variablen Aufruf Stack Tabelle 5.4: IDE - TastenkombinationenAnsicht

Projekt Tastenkrzel Strg+F11 Umsch+Strg+F11 Umsch+F11

Erklrung Projekt ffnen Projekt Einstelllungen Datei ins Projekt bernehmen Tabelle 5.5: IDE - Tastenkombinationen Projekt

59

5 Lazarus IDE Start Tastenkrzel Strg+F9 F9 F7 F4 Strg+F2 Strg+F7 Strg+F5

Erklrung Erstellen Start Ein Schritt Start bis Cursor Halt Prfen/ndern berwachung hinzufgen Tabelle 5.6: IDE - Tastenkombinationen Start

Divers Tastenkrzel Strg+Click Strg+Shift+Upe Strg+J Strg+Space Strg+W Strg+Shift+Space

Erklrung springt zur Deklaration eines Typen oder Variablen schaltet zwischen Denition und Rumpf um Code-Schablonen Bezeichnervervollstndigung Word Completion Parameter Hinweise Tabelle 5.7: IDE - Tastenkombinationen

5.1.2 Fehlersuche
Im besten Fall luft ein Programm fehlerfrei. Da dies aber meistens bei der Entwicklung nicht so ist, gibt es viele Mglichkeiten Fehler zu suchen. Allerdings mu man sich auch ber die verschiedenen Arten von Fehlern und Unzulnglichkeiten im klaren sein. Syntax Fehler Sind Fehler in der Syntax selbst, tauchen aber oft auch als Kompilerfehler auf. Bezeichner Namen von Objekte und Variablen mehrfach vergeben Schlsselwrter Schlsselwrter als Namen von Objekten oder Variablen verwendet Blcke falsch Den Anfang oder das Ende von Prozedure, Funktionen oder Schleifen nicht richtig gesetzt. Parameter falsch Typ oder Anzahl von Parametern falsch gewhlt Kompiler Fehler Sind Fehler, die beim Kompilieren auftreten, weil der Kompiler oder Prprozessor nicht in der Lage ist, den oder die Befehle zu bersetzen. oder dem Vergessen von Deklarationen. Syntax Fehler siehe oben. Schreibfehler Diese Fehler entstehen durch vergessene Zeileabschlsse, fehlende Zeichen oder Buchstabendreher.

60

5 Lazarus IDE Logische Fehler Hier ist zwar die Syntax prinzipiell in Ordnung, nur in der Programmlogik hat man Fehler. Variablen vergessen zu initialisieren, Einhaltung von Ablufen nicht erzwungen, falsche Programmlogik fr das Problem genommen, vergessen Objekte frei zu geben, ... Initialierung Fehlende oder unzureichende Initialisierung von Objekten und Variablen Endloschleifen Schleifen werden nicht beendet Rekursionen Ungewollte Rekursionen entstehen Logik Ganz einfach die falsche Lsung fr das richtige Problem genommen, Klammern falsch oder nicht gesetzt bei komplexen Ausdrcken Falsche Anzahl von Durchlufen Vergessen, das 0..n nicht gleich n-Durchlufen ist. Laufzeit Fehler Bei dieser Art, sind (Rand-) Bedingungen zur Laufzeit nicht erfllt und der Programmierer hat keine entsprechenden Gegenmanahmen im Programm getroffen. Divisionsfehler Division durch Null nicht abgefangen Umwandlungen Inhalt von Zeichenketten enthalten keinen numerischen Wert. Eingabe und Ausgabefehler Dateien oder Gerte die erwartet werden sind nicht oder nicht mehr verfgbar Anhand der Liste sieht man, das es sehr viele Mglichkeiten gibt, Fehler zu machen. Ebenso gibt es viele Wege, wie man Fehler beseitigen kann. Eine der besten Mglichkeiten ist, gar keine Fehler zu machen. Klingt banal, es ist damit gemeint, das sich oft Logik und Laufzeit Fehler durch Planung stark vermindern lassen. Dazu gehrt auch, das man Teilproblemstellungen im Vorfeld testet, ob der Lsungsansatz fr das Problem wirklich der Richtige ist. DebugLn Ausgabe von Informationen an die Debugkonsole. HeapTrace Ist ein Werkzeug bei der Entdeckung von Speicherlcher und Leichen. Zu nden ist das im Men unter Projekt -> Compilereinstellungen -> Linker Punkt heaptrc unit verwenden. Version: $ $ 3

Autor: Andreas Frie Lizenz: GFDL

61

5 Lazarus IDE

5.1.3 Projektschablonen
Beschreibung Projektschablonen sind Vorlagen fr fters verwendete Projekte. Das Komponente projekttemplates hilft bei der Verwendung von Schablonen4 . Als Vorbereitung mu man die Komponente installieren. Nach der Erstellung ist das Men Werkzeuge um den Eintrag Optionen fr Projektschablonen erweitert. Mit Hilfe dieses Menpunktes kann man das Basis Verzeichnis fr die Schablonen einstellen. Die Schablonen selbst benden sich dann in den Unterverzeichnissen. Weiters wird auch das Men Datei um den Eintrag Neues Projekt aus Schablone erweitert. Zustzlich ist auch der Datei Neu .. Dialog entsprechend erweitert. Jede Schablone liegt in einem eigenen Unterverzeichnis und kann selbst weitere Unterverzeichnisse enthalten. Diese Struktur wird beim Erstellen eines neuen Projektes mittels Schablonen bertragen5 . Die Steuerung der Vorlagen erfolgt durch die Datei project.ini. Diese Datei ist im ini Format aufgebaut und es benden sich derzeit zwei Sektionen darinnen. In der ersten Sektion mit dem Namen [Variables] benden sich die Variablen6 . Als Voreinstellung selbst gibt es zwei vordenierte Variablen die die Ersetzungsroutine selbst kennt und die nicht deniert werden mssen. ProjDir Das Verzeichnis, in welches das neue Projekt erzeugt wird ProjName Der Name des neuen Projektes Weitere Variablen, mssen in der Sektion [Variables] in der folgenden Form deniert werden. Zuerst kommt der Variablenname, dann das Gleichheitszeichen und zum Schlu eine Beschreibung, welcher in der Eingabemaske auf scheinen wird. Whrend des kopierens knnen Ersetzungen durchgefhrt werden. Das Kennzeichen fr diese Ersetzung ist __VARNAME__7 . Diese Zeichnenfolge wird durch den Inhalt der Variablen ersetzt. Die Bezeichnung VARNAME ist durch den Namen der Variable zu ersetzen. Die Ersetzung wird beim Kopieren in das neue Projekt sowohl in den Dateinamen gemacht, als auch innerhalb der Dateien.
auch Vorlagen genannt Es mir in der derzeitigen Version Lazarus 0.9.25 svn 13811 nicht geglckt das die Unterverzeichnisse kopiert werden 6 Platzhalter, vernderbare Teile 7 Wurde gegenber der Beschreibung im README.txt offenbar gendert - war $(VARNAME)
5 4

62

5 Lazarus IDE Die zweite Sektion beschftigt sich mit dem beschreiben des Projektes selbst. Die Sektion [Project] beinhaltet folgende Informationen zum Projekt, wobei der Namen, Author und die Beschreibung in Datei-Neu Dialog von Lazarus angezeigt wird. Name Namen der Vorlage Author Author der Vorlage Description Kurze Beschreibung der Vorlage, maximal einzeilig Recurse Ob in Unterverzeichnis hineinrekusiert8 werden soll (0=Nein, 1=Ja) Exclude Durch Komma getrennte Liste, welche Dateien nicht fr die Ersetzung verwendet werden sollen Ist in dem Verzeichnis eine Datei mit dem Namen description.txt, so wird der Inhalt der Datei als Beschreibung verwendet. Beispiel Als Beispiel habe ich ein vorhandenes einfaches Projekt im Vorlagen Verzeichnis abgespeichert. Weiter kommt in diese Verzeichnis eine project.ini Datei mit folgen Inhalt hinein [Variables] VarName1= Dateiname fuer das Hauptformular [Project] Name=SecondTry Author= Nobody Description= Test template 1 Recurse= 0 Exclude= In der ersten Eingabezeile wird der Dateiname des Projektes eingegeben, er ist in der nicht sichtbaren Variablen ProjName dann vorhanden. In der zweiten Zeile gibt man den Pfad, wohin die Dateien aus den Vorlagen kopiert werden sollen an. Das kann entweder durch Direkteingabe erfolgen oder ber den Dateidialog, den man rechts neben der Eingabezeile aufrufen kann. Darunter bendet sich dann die Eigabemaske fr die frei (in der project.ini) denierbaren Variablen. Der ausgefllte Inhalt der Variablen ersetzt dann beim kopieren die Platzhalter. Heisst also eine Datei im Templateverzeichnis zum Beispiel __VarName1__.pas und bei der Variablen wird myform festgelegt, so wird die Datei als myform.pas in das Zielverzeichnis kopiert. Ebenso verhlt es sich mit Variablen (nicht verwechseln mit Variablen innerhalb von Lazarus), die beim kopieren ebenso durch die Werte ersetzt werden.
8

funktioniert ?!

63

5 Lazarus IDE Wird der Dialog jetzt besttigt, so wird die Kopieraktion durchgefhrt und Lazarus ffnet das neue Projekt. Version: $ $ 9

Autor: Andreas Frie Lizenz: GFDL

64

6 Codebeispiele & FAQ


6.1 FAQ
6.1.1 Oberche
Schrift auf einen Label ndert sich nicht Aus dem Thread http://www.lazarusforum.de/viewtopic.php?p=16109#16109 Q: ndere ich den Wert der Eigenschaft font.sizendert sich die Eigenschaft font.heightm Gegenzug und scheint meine nderung ausgleichen zu wollen. Die Schriftgre ndert sich aber nicht. Autosize auf false setzen alleine hilft auch nicht. A: Dein Problem tritt auf, wenn du noch keine Schriftart ausgewhlt hast. Um das zu tun gehst du wie folgt vor: Klicke auf das Label deiner Wahl. Im Objektinspektor erscheint eine Eigenschaft Fontmit nem + davor. Wenn du auf die Eigenschaft Font (nicht aufs +) klickst, erscheint ein Feld, dahinter ... Nun auf klicken und ne Schriftart mit beliebiger Schriftgre festlegen. Wenn die Schrift... art nun mehr als nur eine Schriftgre erlaubt, kannst du nun auch ber Font.Size die Gre der Labelschrift festlegen. Version: $LastChangedRevision: 59 $
1

Autor: Andreas Frie Lizenz: GFDL

65

7 Bibliotheken
7.1 SQLdb
7.1.1 Beschreibung
Einleitung SQLdb wird speziell fr Serverbasierende Datenbanken verwendet und besteht im Wesentlichen aus Komponenten fr die Verbindung (TxxxConnection), fr das Verwalten von Transaktionen (TSQLTransaction) und dem Verwalten von Datenmengen (TSQLQuery). Fr Clientdatenbanken (Dbase, FoxPro,...) sind die Komponenten unter Client Access1 vorgesehen. Besonders die TSQLQuery ist eine mchtige Komponente, die einige automatismen eingebaut hat, die zwar das Leben erleichtern sollen, aber oft das Gegenteil bewirken knnen. In diesem Kapitel wollen wir uns die Komponenten einmal genauer ansehen. Das Bild aus der Wiki aus dem englischen Lazarusforum[LazEn]2 erklrt schn, wie die Komponenten zusammenhngen und in welchen Units sie sich benden. Debbuging von SQLdb SQLdb ist ein Teil der FCL und nicht direkt von Lazarus. Die FCL wird standardmssig nicht mit den fr den Debugger notwendigen Informationen kompiliert, da der Kode so kompakter und kleiner ist. Wenn man fr die Fehlersuche es anders bentigt, so mu man die fcl-db neu kompileren. Dazu mu man die kompletten FCL Sourcen haben, dann kann man in das Verzeichnis fpc/packages/fcl-db gehen und mit make clean all OPT=-gl das Paket neu kompiliren, anschliessen die neuen PPUs ber die alten kopieren. Die Fehlersuche wird aber nur Personen empfohlen, die entsprechendes Wissen ber die SQLdb Komponenten haben. Active, Open oder ExecSQL ... das ist hier die Frage ? Um diese Frage zu beantworten, mu man sich vor Augen halten, was man von der Komponente will. Mittels dem Befehl Open fordert man eine Datenmenge, die
1 2

Siehe Kapitel 7.2.1 auf Seite 84 http://wiki.lazarus.freepascal.org/SQLdb_Programming_Reference

66

7 Bibliotheken Kardinalitt3 einer Datenmenge4 kann auch Null sein, an. Mit ExecSQL wird nur eine Aktion angefordert ohne das eine Datenmenge zurck erwartet wird. Somit ist klar, das bei allen Daten liefernden Statements das Open zu verwenden ist. Welche Statements in SQL liefern berhaupt Datenmengen zurck ? Eigentlich gilt das nur fr das SELECT Statement, alle anderen (INSERT, UPDATE, DELETE, ...) fhren etwas aus, liefern aber keine Daten zurck. Ob man jetzt Open verwendet oder Active:=true; macht ist letztlich egal, Open fhrt genau dieses Statement aus. Eine Besonderheit ist die Behandlung von Stored Procedure und Functions auf SQL-Servern. Diese knnen eine Kombination im Verhalten darstellen. Dort ist dann ein ExecSQL angebracht und es knnen Datenmengen zurckgeliefert werden. Zusammenfassung: Open, Active: Bei der Verwendung von SELECT ExecSQL: Fr alle anderen Statements Wie kommen die genderten Daten in die Datenbank Eine nderung der Datenmenge alleine ist nicht ausreichend, um diese nderung auch in der Datenbank sichtbar zu machen. Prinzipiell mu man jetzt zwei Wege unterscheiden. Einerseits kann man nderungen im Zuge einer Transaktion in der Datenbank festschreiben durch das Abschliessen der Transaktion oder auch durch das dezitierte schreiben durch ApplyUpdates. Ich bin der Meinung, das man sich fr einen der Wege entscheiden sollte, wenn man eine Datenmenge ffnet beziehungsweise anfordert. Arbeitet man mit Transdaktionen, dann soltte man ohne zwingenden Grund nicht mit ApplyUpdates das Transaktionsmanagment stren. Anderseits wenn man ohne explzite Transaktionen arbeitet, also Datenmengen ffnet ohne vorher Transaktionen geffnet zu haben, dann darf man nicht vergessen die nderungen entweder mittels ApplyUpdates zu bernehmen oder mittels CancelUpdates zu verwerfen. Vergisst man auf ApplyUpdates so ist dieses schlimmer als auf CancelUpdates zu vergessen. Denn ohne dem ApplyUpdates sind die Daten bei den meisten Datenbanken ganz einfach nicht in die Datenbank eingearbeitet und somit verloren. Filtern, aber wo ? Die Standardantwort ist im Stile von Radio Eriwan: Dort wo es sinnvoll ist. Dazu mu man sich vor Augen halten, wo man eine Datenmenge berhaupt ltern kann. Dazu mu man unterscheiden in Desktop Datenbanken und Server Datenbanken. Bei Desktop Datenbanken kann die Frage schon obsolet sein, weil die Datenmenge sowieso nur lokal geltert werden kann. Bei Datenbankenservern schaut die Sachlage ganz anders aus. Denn die knnen Datenmengen sehr wohl, efzient vor verarbeiten und nur die wenigen Ergebnisse zurck transportieren. Damit wird am lokalen Rechner Netzwerkleistung, Speicher und Resourcen geschont. Somit kann

3 4

siehe Kapitel 3.1.1 auf Seite 30 siehe Kapitel 3.1.1 auf Seite 28

67

7 Bibliotheken man hier dem ltern am Server den Vorzug geben. Werden aber Daten erst am lokalen Rechner verknpft, so kann man oft nur lokal ltern. Somit ist klar, das es stark auf das Design der Applikation an kommt, was sinnvoll ist. Anzahl der Datenstze abfragen Hier kann man generell zwei verschiedene Flle unterscheiden. Einmal den Fall, das man wissen will, ob berhaupt Datenstze vorhanden sind und dem Fall, das man die Anzahl wissen will. Generell ist es nur dann sinnvoll die Anzahl der Datenstze zu bestimmen, wenn eine Abfrage aktiv ist. Ob Datenstze berhaupt vorhanden sind, kann man ber die Abfrage von EOF5 und BOF6 machen. Sind beide vorhanden (true) so mu die Datenmenge leer sein. Genau diese macht die Methode IsEmpty. Somit kann man diese genau fr diesen Fall verwenden. Die Anzahl selbst der Datenstze, kann man theoretisch mittels der Eigenschaft RecordCount abfragen. Alledings mu dazu auch der Datenbanktreiber7 das untersttzen. Bis jetzt ist die Untersttzung auch nicht wirklich vorhanden. Weiters handelt es sich hier eher um eine Eigenschaft von Desktopdatenbanken, denn dort kann die Anzahl der Datenstze nicht anders festgestellt werden. Die andere Variante die sich daher anbietet ist die SQL Abfrage selbst. So kann man mittels dem SQL-Statement select count(row1) as Anzahl from table1 where ... die Anzahl ermitteln. Navigieren durch eine Datenmenge Fr das Navigieren durch die Datenmenge stehen ein paar Befehle zur Verfgung. Mit rst kommt man zum ersten, mit last zum letzten, mit next springt man auf den nchsten und mit mit prior zum vorhergehenden Datensatz. Grere Bewegungen kann man mit MoveBy machen. Das funktioniert vorwrts mit positiven Zahlen, rckwrts mit negativen Zahlen. Allerdings mu man bedenken, das ein MoveBy nicht zwingend die volle Distanz verfahren kann, wenn die Grenzen der Datenmenge erreicht werden. Wenn also ein EOF oder BOF nach dem MoveBy ansteht, so wird nicht die volle Distanz erreicht worden sein, man wei aber nicht um wie viel verfahren wurde. Was ist BOF und EOF BOF bedeutet das man in der Datenmenge am Anfang, bei EOF am Ende der Datenmenge steht. Wenn zum gleichen Zeitpunkt beide vorhanden sind, so ist das ein Zeichen, das die Datenmenge null ist.

5 6

End of File - Anfang der Daten Beginn of File - Ende der Daten 7 Ist genaugenommen die Verbindungskomponente

68

7 Bibliotheken Zugriff auf Felder Auf die Felder8 kann ber die Eigenschaft Fields zugegriffen werden. Zustzlich kann ber die Methode FieldByName mittels des Feldnamens oder FieldByNumber einfach auf die einzelnen Felder zugegriffen werden. Die Werte werden ber die Values Eigenschaft als variant zugewiesen oder ber die entsprechenden AsInteger, AsString und As...... Zugriff auf Parameter

Auf die Felder der Parameter kann ber die Eigenschaft Params zugegriffen werden.Zustzlich kann ber die Methode ParamsByName mittels des Feldnamens einfach auf die einzelnen Felder zugegriffen werden. Die Werte werden ber die Values Eigenschaft als variant zugewiesen oder ber die entsprechenden AsInteger, AsString und As...... Im SQL-Statement werden die Parameter durch einen Doppelpunkt am Anfang des Names kenntlich gemacht. Zum Beispiel: insert tablex (row1, row2) values (:param1, :param2) Hier ist :param1 einer der Parameter. Die Zuweisung im Programm erfolgt ber TQ1.Params.ParamByName( Schlsselfelder Als Schlsselfelder werden die Felder9 bezeichnet in dem der primre Schlssel der Tabelle gespeichert ist. Dieser sollte bei jeder nderbaren Datenmenge deniert sein, damit die Komponenente richtig die Datenstze ndern oder lschen kann. Schlssel erzwingen eine Eindeutigkeit.

7.1.2 TxxxConnection
Genau genommen handelt es sich hier nicht nur um eine einfache Deklaration der Verbindung sondern um den lokalen Verwaltungsteil der Datenbank. Hier werden die gemeinsamen Methoden und EIgenschaften behandelt, im Folgenden die verschiedenen Connection mit den abweichenden Details behandelt. Close procedure Close; Setzt ganz einfach die Egenschaft active auf false. Methode von TxxxConnection>TSQLConnection>TDatabase>TCustomConnection EndTransaction procedure EndTransaction; override; Ruft die entsprechede Methode der Komponente Transaction auf. Methode von TxxxConnection>TSQLConnection
8 9

auch Attribute genannt Schlssel knnen ber mehrere Felder gehen um eindeutig zu sein, oder weil sie zusammengesetzt sind

69

7 Bibliotheken ExecuteDirect procedure ExecuteDirect(SQL : String); overload; virtual; procedure ExecuteDirect(SQL : String; ATransaction : TSQLTransaction); overload; virtual; Fhrt das SQL-Statement entweder im Kontext der default Transaktion oder mittels der Angegeben Transaktion aus. Methode von TxxxConnection>TSQLConnection Parameter SQL: string Das auszufhrende SQL-Statement ATransaction : TSQLTransaction Die Transaktion in deren Kontext das SQLStatement durchgefhrt wird. GetFieldNames procedure GetFieldNames(const TableName : string; List : TStrings); virtual; Ermittelt die Namen der Felder der Tabelle. Methode von TxxxConnection>TSQLConnection Parameter TableName : string; Name der Tabelle deren Felder ermittelt werden sollen List : TStrings; Die Liste der Felder GetProcedureNames procedure GetProcedureNames(List : TStrings); virtual; Ermittelt die Namen der gespeicherten Prozeduren. Methode von TxxxConnection>TSQLConnection Parameter List : TStrings; Die Liste der Prozeduren GetTableNames procedure GetTableNames(List : TStrings; SystemTables : Boolean = false); virtual; Ermittelt die Tabellennamen oder die Systemtabellennamen (abhngig von SystemTables) Methode von TxxxConnection>TSQLConnection Parameter List : TStrings; Die Liste der Tabellennamen

70

7 Bibliotheken SystemTables : Boolean Ob Systentabellen (true) oder Usertabellen (false) ermittelt werden sollen. Open procedure Open; Setzt ganz einfach die Egenschaft active auf true. Methode von TxxxConnection>TSQLConnection>TDatabase>TCustomConnection StartTransaction procedure StartTransaction; override; Ruft die entsprechede Methode der Komponente Transaction auf. Methode von TxxxConnection>TSQLConnection CharSet property CharSet : string read FCharSet write FCharSet; Eigenschaft von TxxxConnection>TSQLConnection Zugriff: Lesend und schreibend Connected property Connected: Boolean read FConnected write SetConnected; Gibt an ob die Verbindung besteht oder nicht. True aktiviert die Verbindung. Eigenschaft von TxxxConnection>TSQLConnection>TDatabase Zugriff: Lesend und schreibend DatabaseName property DatabaseName: string read FDatabaseName write FDatabaseName; Gibt den Namen der Datenbank an. Ist fr die verschiedenen Datenbanken unterschiedlich. Siehe bei den entsprechenden Verbindungen. Eigenschaft von TxxxConnection>TSQLConnection>TDatabase Zugriff: Lesend und schreibend HostName property HostName : string Read FHostName Write FHostName; Gibt den Namen des Hosts (Server) an auf welchen sich die Datenbank bendet. Bei lokalen Server ist das localhost oder auch 127.0.0.1.

71

7 Bibliotheken Eigenschaft von TxxxConnection>TSQLConnection Zugriff: Lesend und schreibend KeepConnection property KeepConnection; ToDo Eigenschaft von TxxxConnection>TSQLConnection>TDatabase Zugriff: Lesend und schreibend LoginPrompt property LoginPrompt: Boolean read FLoginPrompt write FLoginPrompt; Gibt an ob ein Login Prompt beim verbinden automatisch erzeugt werden soll. Eigenschaft von TxxxConnection>TSQLConnection>TDatabase>TCustomConnect Zugriff: Lesend und schreibend Params property Params : TStrings read FParams Write FParams; Enthlt spezielle Parameter fr die Verbindung. Eigenschaft von TxxxConnection>TSQLConnection>TDatabase Zugriff: Lesend und schreibend Password Enthlt das Passwort fr die Verbindung. Nicht bentigt, wenn LoginPrompt true ist. Eigenschaft von TxxxConnection>TSQLConnection>TDatabase Zugriff: Lesend und schreibend Role Property Role : String read FRole write FRole; ToDo Eigenschaft von TxxxConnection>TSQLConnection Zugriff: Lesend und schreibend

72

7 Bibliotheken StreamedConnected property Streamedconnected: Boolean read FStreamedConnected write FStreamedConnected; ToDo Eigenschaft von TxxxConnection>TSQLConnection>TDatabase>TCustomConnection Zugriff: Lesend und schreibend Transaction

property Transaction : TSQLTransaction read FTransaction write SetTransaction Gibt die Transaktions Komponente an. Eigenschaft von TxxxConnection>TSQLConnection Zugriff: Lesend und schreibend UserName property UserName : string read FUserName write FUserName; Enthlt den Benutzernamen fr die Verbindung beziehungsweise fr den Zugriff auf die Datenbank. Eigenschaft von TxxxConnection>TSQLConnection Zugriff: Lesend und schreibend Jede Datenbank hat ihre spezielle Verbindung (Connection).

7.1.3 TMySQL50Connection
Jede Datenbank hat ihre spezielle Verbindung (Connection). Dies hier ist die Verbindung zu MySQL 5.0

7.1.4 TMySQL41Connection
Jede Datenbank hat ihre spezielle Verbindung (Connection). Dies hier ist die Verbindung zu MySQL 4.1

7.1.5 TMySQL40Connection
Jede Datenbank hat ihre spezielle Verbindung (Connection). Dies hier ist die Verbindung zu MySQL 4.0

7.1.6 TOracleConnection
Jede Datenbank hat ihre spezielle Verbindung (Connection). Dies hier ist die Verbindung zu Oracle.

73

7 Bibliotheken

7.1.7 TPQConnection
Jede Datenbank hat ihre spezielle Verbindung (Connection). Dies hier ist die Verbindung zu PostGreSQL Datenbanken.

7.1.8 TODBCConnection
Jede Datenbank hat ihre spezielle Verbindung (Connection). Dies hier ist die Verbindung zu den ODBC Treibern.

7.1.9 TSQLTransaction
Als Transaktion wird eine feste Folge von Operationen, die eine Einheit bilden, bezeichnet. Transaktionen mssen die ACID-EIgenschaft garantieren. A) Atomitt, das heit untrennbar. Es wird entweder alles oder nichts durchgefhrt. C) Konsistenz, Nach der Transaktion mssen die Daten konsistent sein. Daher auch an allen genderten Stellen den gleichen Inhalt haben. I) Isolation, mehrere gelichzeitig laufende Transaktionen drfen sich nicht gegenseitig beeinussen. D) Dauerhaft, die Auswirkungen der Transaktion mssen im Datenbestand dauerhaft sein. Auch bei widrigen Umstnden drfen die Transaktionen nicht verloren gehen oder vergessen werden, zB. bei Rcksicherungen nach Absturz. Der Ablauf einer Transaktion ist relativ einfach. Die Transaktion wird erffnet, dann die Handlungen an der Datenbank gesetzt und die Transaktion entweder mit Rollback wenn sie zurckgenommen werden soll oder mit Commit wenn die nderderungen dauerhaft bernommen werden sollten, abgeschlossen. Man mu sich nur vor Augen halten, das das Datenbanksystem um die ACID Eigenschaften garantieren zu knnen, Aktionen wie Sperren, Duplizieren oder auch Warten durchfhren mu. Deshalb soll eine Transaktion nur solange aufrecht erhalten werden wie es unbedingt ntig ist. Das heisst, auch, whrend einer Benutzereingabe oder sonstiger Wartezeit sollte keine Transaktion stattnden. Besonders bei Mehrbenutzersystemen kann das bis zum Stillstand der Datenbank fhren, wenn wegen vergessener Eingabe bei Arbeitscschlu eine Transaktion aktiv bleibt und deshalb eine Sperre auf einer Datenbank liegt. Commit procedure Commit; virtual; Schliesst die Transaktion ab Methode von TSQLTransaction CommitRetaining procedure CommitRetaining; virtual; Fhrt ein Commit durch, lsst aber die Datenmenge offen. Wenn es die Datenbank nicht untersttzt, so wird es von der SQLdb Komponete simmuliert. Methode von TSQLTransaction

74

7 Bibliotheken EndTransaction procedure EndTransaction; override; Beendet die Transaktion, fhrt ein normalerweise ein Rollback durch. Methode von TSQLTransaction Rollback procedure Rollback; virtual; Rollt die Transaktion zurck, macht daher die nderungen nicht aktiv. Methode von TSQLTransaction RollbackRetaining procedure RollbackRetaining; virtual; Fhrt ein Rollback durch, lsst aber die Datenmenge offen. Wenn es die Datenbank nicht untersttzt, so wird es von der SQLdb Komponete simmuliert. Methode von TSQLTransaction StartTransaction procedure StartTransaction; override; Startet die Transaktion Methode von TSQLTransaction Action property Action : TCommitRollbackAction read FAction write FAction; ToDo Eigenschaft von TSQLTransaction Zugriff: Lesend und schreibend Database Property DataBase : TDatabase Read FDatabase Write SetDatabase; Gibt den Namen der Verbindung (=Datenbank) an. Eigenschaft von TSQLTransaction>TDBTransaction Zugriff: Lesend und schreibend

75

7 Bibliotheken Params property Params : TStrings read FParams Write FParams; Enthlt spezielle Parameter fr die Verbindung. Eigenschaft von TxxxConnection>TSQLConnection>TDatabase Zugriff: Lesend und schreibend

7.1.10 TSQLQuery
Allgemeines Der Name beschreibt nur unzureichend die Komponente. Es ist nicht nur ein Behlter fr Abfragen (Query) sondern die Kapselung fr die Datenmenge. Das heisst, ber die Komponente luft eigenlich alles bezglich Daten und Datenmenge. Sie wird sowohl fr DDL10 , DML11 und DCL12 verwendet Methoden von TSQLQuery Im folgenden sind hier die wichtigsten Methoden beschrieben. Standardmethoden wie Create oder Free werden hier nicht beschrieben. ApplyUpdates procedure ApplyUpdates; virtual; overload; procedure ApplyUpdates(MaxErrors: Integer); virtual; overload; bertrgt die nderungen von der Datenmenge in die Datenbank. ApplyUpdates entspricht ApplyUpdates(0). Methode von TSQLQuery>TBufDataset CancelUpdates procedure CancelUpdates; virtual; Die nderungen an der Datenmenge werden verworfen. Methode von TSQLQuery>TBufDataset Close procedure Close; Setzt die Eigenschaft Active auf false. Somit wird die Datenmenge geschlossen. Methode von TSQLQuery
10 11

Datendenitionssprache siehe Kapitel 3.1.2 auf Seite 41 Datenvernderungssprache siehe Kapitel 3.1.3 auf Seite 41 12 Datenkontrollsprache siehe Kapitel 3.1.4 auf Seite 41

76

7 Bibliotheken ExecSQL procedure ExecSQL; Fhrt die in der Eigenschaft SQL denierten SQL-Befehle aus, liefert aber keine Datenmenge zurck. Sonderfall Stored Procedure kann unter umstnden Datenmengen zurck liefern. Methode von TSQLQuery IsEmpty function IsEmpty: Boolean; berprft ob die Datenmenge leer ist. Gibt true zurck, wenn die Datenmenge leer ist. Zu beachten ist, das das Ergebnis immer false ist, wenn die Datenmenge im Zustand dsinsert ist, sprich ein Datensatz eingefgt wird. Ausserdem ist die Prfung nur dann sinnvoll wenn eine Abfrage aktiv ist. Methode von TSQLQuery>TBufDataset>TDBDataset>TDataSet Locate function Locate(const keyfields: string; const keyvalues: Variant; options: TLocateOptions) : boolean; override; Achtung, es ist derzeit nur mglich in einem Feld zu suchen, nicht in mehreren. Beim Suchen selbst sind keine Wildcards erlaubt (*, %,...) Methode von TSQLQuery>TBufDataset Parameter keyelds: string Angabe des Suchfeldes keyvalues: Variant Inhalt nach dem gesucht wird options: TLocateOptions Scheibweise egal loCaseInsensitive, nur eine Teilmenge loPartialKey Open procedure Open; Fhrt die in der Eigenschaft SQL denierten SQL-Befehle aus und liefert die Datenmenge zurck. Intern wird die Eigenschaft Active auf true gesetzt. Methode von TSQLQuery Prepare procedure Prepare; Mittels Prepare wird die Komponente darauf vorbereitet, das es den Ablauf optimieren kann. Die Komponente geht davon aus, das das SQL-Statement endgltig ist, nur mehr

77

7 Bibliotheken die Parameter knnen sich ndern. Somit knnen die Statement verarbeitet werden und die Verbindungen vorbereitet. Die Komponente kann die Staements an die Server leiten und diese knnen die Befehle jetzt vorkompilieren und optimieren. Methode von TSQLQuery SetSchemaInfo procedure SetSchemaInfo( SchemaType : TSchemaType; SchemaObjectName, SchemaPattern : string); Setzt das Schema, die aktuellen SQL Statements gehen dabei verloren und werden durch die neuen Informationen ersetzt. Zustzlich wird der Datenbankzugriff auf nur lesen gesetzt. Methode von TSQLQuery Parameter SchemaType : TSchemaType Kann folgende Werte annehmen: stNoSchema, stTables, stSysTables, stProcedures, stColumns, stProcedureParams, stIndexes, stPackages. SchemaObjectName : string SchemaPattern : string Unprepare procedure Unprepare; Setzt die durch Prepare ausgelsten Vorverarbeitungen zurck. Sollte immer vor nderungen an der Komponente aufgerufen werden, wenn man Prepare verwendet hat. Methode von TSQLQuery UpdateStatus function UpdateStatus: TUpdateStatus; override; Gibt den Status des Zwischenspeicher fr genderte Daten an. Kann folgende zustnde annehmen : Keine nderungen ist usUnmodied, bei nderungen usModied, Einfgungen usInserted und bei Lschungen usDeleted. Methode von TSQLQuery>TBufDataset Eigenschaften von TSQLQuery Hier beginnt die Beschreibung der wichtigsten Eigenschaften und Ereignisse. Wie schon bei den Methoden, werden hier nur die wichtigsten erlutert.

78

7 Bibliotheken Active property Active: Boolean read GetActive write SetActive default False; Sagt aus ob die Komponente derzeit aktiv ist und eine Datenmenge zurckliefert. Ein setzen auf true entspricht der Methode Open und ein setzen auf false entspricht der Methode Close. Eigenschaft von TSQLQuery Zugriff: Lesend und schreibend Defaultwert: false Database property Database; Gibt die zustndige Databasekomponente (TxxxConnection) an. Eigenschaft von TSQLQuery Zugriff: Lesend und schreibend DataSource Property DataSource : TDatasource; WIrd in einer Master-Detail Beziehung vom der Client-Query zur Synchronisierung mit der Master-Query verwendet verwendet. Eigenschaft von TSQLQuery Zugriff: Lesend und schreibend Defaultwert: false Filter property Filter: string read FFilterText write SetFilterText; Enthlt den Filter fr die Datenmenge, wenn deniert. Entspricht einer WHERE-Klausel bei einem SQL Statement - siehe auch Serverltered. Normalerweise ist eine Filterung am Server vorzuziehen, da die transportierte Datenmenge geringer ist. Wird erst aktiv durch aktivieren der Eigenschaft Filtered. Eigenschaft von TSQLQuery Zugriff: Lesend und schreibend

79

7 Bibliotheken Filtered property Filtered: Boolean read FFiltered write SetFiltered default False; Gibt an ob die Datenmenge geltert ist. Ein setzen der Eigenschaft bewirkt, das der Filter aktiv wird und die Datenmenge entsprechend eingeschrnkt wird. Eigenschaft von TSQLQuery Zugriff: Lesend und schreibend FilterOptions property FilterOptions: TFilterOptions read FFilterOptions write SetFilterOptions; Mglich sind foCaseInsensitive ignoriert Gro-, Kleinschreibung und foNoPartialCompare schaltet die Erkennung von Teilen beim Filtern aus. Wirkt nur auf die lokale Filterung und nicht auf die Serverlter. Eigenschaft von TSQLQuery>TBufDataset>TDBDataset>TDataSet Zugriff: Lesend und schreibend Params property Params : TParams; Enthlt die Parameter fr die SQLStatements Eigenschaft von TSQLQuery Zugriff: Lesend und schreibend ParseSQL property ParseSQL : Boolean; Mit dieser Eigenschaft wird angezeigt ob die Komponente den SQL-Text auswerten soll. Soll sie den SQL-Text auswerten, so kann der Text fr die Optimierung der Indexe etwas umgestellt werden. Weiters wird dann auch UsePrimaryKeyAsKey ausgewertet und zustzlich, wenn nicht schon vorhanden, die Vorbereitungen fr die UpdateSQl, DeleteSQL und InsertSQL durchgefhrt. Es kann sein, das die Query in machen fllen schlecht ausgewertet wird, was sich durch dubiose SQLFehler zeigt. Dann kan man versuchen das ParseSQL und UsePrimaryKeyAsKey auszuschalten und alle Queries von Hand richtig zu setzen. Eigenschaft von TSQLQuery Zugriff: Lesend und schreibend

80

7 Bibliotheken Prepared property Prepared : boolean read IsPrepared; Gibt den Status an, ob die Komponente Vorverarbeitung aktiviert hat. Eigenschaft von TSQLQuery Zugriff: Nur lesend ReadOnly property ReadOnly : Boolean; Zeigt an ob auf die Datenmenge nur lesend zugegriffen werden kann. Eigenschaft von TSQLQuery Zugriff: Nur lesend RecordCount property RecordCount: Longint read GetRecordCount; Ob die Eigenschaft verfgbar ist, hngt von der Connectionkomponente ab. Wenn nichts implementiert wird, so kommt bei einer Abfrage der Wert -1 zurck. Ansonsten die Anzahl der Datenstze der Abfrage. Sinnvoller weise sollte eine Abfrage aktiv sein, ansonsten kann es zu Laufzeitfehlern kommen. Eigenschaft von TSQLQuery>TBufDataset>TDBDataset>TDataSet Zugriff: Nur lesend ServerFilter property ServerFilter: string read FServerFilterText write SetServerFilterText; Enthlt den Filter fr die Datenmenge, wenn deniert. Intern wird der Filter in eine WHERE-Klausel umgesetzt. Somit erfolgt die Filterung bereits am Server. Wird erst aktiv durch aktivieren der Eigenschaft ServerFiltered. Eigenschaft von TSQLQuery Zugriff: Nur Lesend ServerFiltered property ServerFiltered: Boolean read FServerFiltered write SetServerFiltered default False; Gibt an ob die Datenmenge am Server geltert ist. Ein setzen der Eigenschaft bewirkt, das der Filter am Server aktiv wird und die Datenmenge dort entsprechend eingeschrnkt wird. Eigenschaft von TSQLQuery

81

7 Bibliotheken Zugriff: Lesend und schreibend SQL, UpdateSQL, InsertSQL, DeleteSQL property SQL : TStringlist; property UpdateSQL : TStringlist; property InsertSQL : TStringlist; property DeleteSQL : TStringlist; In SQL bendet sich das SQL Statement was ausgefhrt werden soll. Ist es ein einfacheres Select-Statement so kann TSQLQuery auch automatisch die Statements fr nderungen (UpdateSQL), Einfgen (InsertSQL) und Lschen (DeleteSQL) ausfllen. Ist das SQL Statement komplexer so geht diese automatik manchmal ins Leere, kann die Statements nicht richtig auswerten und verursacht unerklrliche Probleme. UpdateSQL: Hier stehen die SQL Statements um nderungen in der Datenmenge durchzufhren. InsertSQL: Die Statements um Datenstze einzufgen. DeleteSQL: Statements um Datenstze zu lschen. Die SQL Statements interaktieren mit der Eigenschaft ReadOnly, UsePrimaryKeyAsKey, ParseSQL, IndexDefs und Params (Vielleicht auch einigen mehr). Wenn die Komponente nicht so reagiert wie erwartet, dann sollte man sich das SQL und die vorher genannten Eigenschaften nher ansehen. Eigenschaft von TSQLQuery Zugriff: Lesend und schreibend Transaction property Transaction; Gibt die zustndige Transaktionskomponente an. Eigenschaft von TSQLQuery Zugriff: Lesend und schreibend StatementType property StatementType : TStatementType read GetStatementType; Mglich sind stNone, stSelect, stInsert, stUpdate, stDelete, stDDL, stGetSegment, stPutSegment, stExecProcedure, stStartTrans, stCommit, stRollback und stSelectForUpd. Es wird hier der Komponente mitgeteilt, wie sie den Text in der Eingeschaft SQL interpretieren soll. Eigenschaft von TSQLQuery Zugriff: Lesend und schreibend

82

7 Bibliotheken UpdateMode property UpdateMode : TUpdateMode read FUpdateMode write SetUpdateMode; Setzt den Modus nach welcher die Datenstze gendert werden sollen. Mglich sind alle Datenstze upWhereAll, nur die genderten Datenstze upWhereChanged oder nur welche wo der Schlssel bekannt ist upWhereKeyOnly. Eigenschaft von TSQLQuery Zugriff: Lesend und schreibend UsePrimaryKeyAsKey property UsePrimaryKeyAsKey : boolean; Wenn aktiv, so benutzt ParseSQL den Primrschlssel immer als Schlssel zu verwenden. Kann bei komplexeren Abfragen manchmal zu Problemen fhren, da der Parser den SQLText nicht richtig auswerten kann. Siehe auch bei der Eigenschaft ParseSQL. Eigenschaft von TSQLQuery Zugriff: Lesend und schreibend Version: $$
13

13

Autor: Andreas Frie Lizenz: GFDL

83

7 Bibliotheken

7.2 DataAccess
7.2.1 Beschreibung
Einleitung Die Komponenten auf der Seite Client Access sind fr die lokale Verwaltung von Datenbanken, auch lokale Datenbanken genannt, zustndig. Fr die Erstellung, Verwaltung und Zugriff auf Dbase und Foxpro Datenbanken ist die Komponenete TDBF zustndig. Fr Datenbanken direkt im Speicher ist die Komponenete MEM, fr Datenbanken mit eine festen Format (CSV) die Komponente FIXED und Textbasierende Datenstze mittels der Komponente SDF. Fr Serverdatenbanken sind die Komponenten auf der Seite SQLdb14 zu verwenden. Die Komponente TDatasource dient unter andern als Verbindung zu den graschen Komponenten.

7.2.2 TDatasource 7.2.3 SDF 7.2.4 FIXED 7.2.5 TDBF 7.2.6 MEM 7.2.7 SQLite
Diese Komponente ist standardmssig nicht vorhanden. Dazu mu erst das Paket sqlite3laz 0.3oder besser installiert werden. Nach dem neu erstellen der IDE, bendet sich die Komponente hier. ExecSQL procedure ExecSQL(const ASql:String); Fhrt den in ASql denierten String aus, liefert aber keine Datenmenge zurck. procedure ExecSQL; Fhrt die in der Eigenschaft SQL denierten SQL-Befehle aus, liefert aber keine Datenmenge zurck. Methode von TSqlite3Dataset

14

Siehe Kapitel 7.1.1 auf Seite 66

84

7 Bibliotheken ApplyUpdates function ApplyUpdates: Boolean; bertrgt die nderungen von der Datenmenge in die Datenbank. Methode von TSqlite3Dataset>TCustomSqliteDataset ExecSQL procedure ExecSQL(const ASql:String); Fhrt den in ASql denierten String aus, liefert aber keine Datenmenge zurck. procedure ExecSQL; Fhrt die in der Eigenschaft SQL denierten SQL-Befehle aus, liefert aber keine Datenmenge zurck. Methode von TSqlite3Dataset Active property Active: Boolean read GetActive write SetActive default False; Sagt aus ob die Komponente derzeit aktiv ist und eine Datenmenge zurckliefert. Ein setzen auf true entspricht der Methode Open und ein setzen auf false entspricht der Methode Close. Eigenschaft von TSqlite3Dataset>TCustomSqliteDataset>TDataSet Zugriff: Lesend und schreibend Defaultwert: false SaveOnClose property SaveOnClose: Boolean read FSaveOnClose write FSaveOnClose; Wenn true, dann wird beim Schliessen der Datenmenge automatisch ein ApplyUpdates durchgefhrt. Eigenschaft von TSqlite3Dataset>TCustomSqliteDataset Zugriff: Lesend und schreibend SaveOnRefetch property SaveOnRefetch: Boolean read FSaveOnRefetch write FSaveOnRefetch; Wenn true, dann wird vor dem Holen neuer Datenmengen automatisch ein ApplyUpdates durchgefhrt. Eigenschaft von TSqlite3Dataset>TCustomSqliteDataset Zugriff: Lesend und schreibend

85

7 Bibliotheken SQL property SQL: String read FSql write FSql; In SQL bendet sich das SQL Statement was ausgefhrt werden soll. Eigenschaft von TSqlite3Dataset>TCustomSqliteDataset Zugriff: Lesend und schreibend Version: $$
15

15

Autor: Andreas Frie Lizenz: GFDL

86

7 Bibliotheken

7.3 lNet
7.3.1 Beschreibung
Einleitung Leightweight NETworking Library enthlt Klassen und Komponenten zur Kommunikation ber UDP- und TCP-Protokolle im Internet. Die Homepage bendet sich unter http://lnet.wordpress.com/ die Programmierer sind Ales Katona (Main programmer aka Almindor) und Micha Nelissen (HTTP server and client programmer aka neli).

7.3.2 Installation
Version: $$
16

16

Autor: Andreas Frie Lizenz: GFDL

87

7 Bibliotheken

7.4 utils.pas
7.4.1 Beschreibung
Einleitung Diese Unit wurde rsprnglich von Christian Ulrich[11] geschrieben, weil diese Routinen in dieser oder hnlicher Form auch nicht in der JCL17 [12] oder hnlichen Sammlungen vorkommen. Abhngigkeiten Es bestehen Abhngikeiten zu Classes, SysUtils, Graphics, Forms, Process, Dialogs, Clipbrd, FileUtil, Translations zustzlich bei Windows noch zu Registry und Windows

7.4.2 Code
ClearDir function ClearDir (Path: string): boolean; Lscht ein Verzeichnis komplett. Die Funktion arbeitet rekursiv, daher lscht sie auch enthalten Verzeichnisse. Vorsicht ist geboten, da es keine weiteren Sicherheitsabfragen gibt, da ein Aufruf auf das Wurzelverzeichnis alles lscht. Parameter Path: string Der Pfad der zu lschen ist. Ein Abschliessender / ist ntig. Result Rckgabe: boolean true wenn erfolgreich, false wenn ein Problem war. DateTimeToHourString function DateTimeToHourString(DateTime : TDateTime) : string; Wandelt ein Datum in einen Stunden/Minuten String um wie zum Beispiel 05:30. Parameter DateTime : TDateTime Das Datum das in ein Uhrzeit im Textformat gewandelt wird. Result Rckgabe: string Die in einen Uhrzeit String gewandelte Datum. DateTimeToIndustrialTime function DateTimeToIndustrialTime(dateTime : TDateTime) : string; Wandelt ein Datum in einen industriellen Stunden/Minuten String um wie zum Beispiel 0530. Parameter
17

JCL

88

7 Bibliotheken DateTime : TDateTime Das Datum das in ein Uhrzeit im Textformat gewandelt wird. Result Rckgabe: string Die in einen Uhrzeit String gewandelte Datum. DrawText procedure DrawText(Canvas : TCanvas; Rect : TRect; Str : string; CenterV : Boolean = False; CenterH : Boolean = False); Zeichnet den Text auf den Canvas. Parameter Canvas : TCanvas Der Canvas auf den gezeichnet wird Rect : TRect Ein rechteckiger Bereich in den gezeichnet wird Str : string Der String der gezeichnet werden soll CenterV : Boolean Ob Vertikal zentriert wird. Standard ist nein CenterH : Boolean Ob Horizontal zentriert wird. Standard ist nein ExecProcessEx function ExecProcessEx(CommandLine : string; CurDir : string = ) : string; Fhrt ein externes Programm aus. Parameter CommandLine : string Die Kommandozeile, die an das externe Programm bergeben wird. CurDir : string Das Verzeichnis das aktuellsein soll. Standard ist das aktuelle. Result Rckgabe: string Ist der von dem Programm auf de Kommandozeile ausgegeben Text, wenn Erfolgreich, ansonsten eine Fehlermeldung. IsNumeric FUNCTION IsNumeric(s: STRING): boolean; berprft ob ein String in eine Zahl gewandelt werden kann. Parameter s: STRING Der String gewandelt werden soll. Result Rckgabe: boolean True wenn der Sting in eine Zahl gewandelt werden kann, false wenn er nicht gewandelt werden kann.

89

7 Bibliotheken InstallExt function InstallExt(Extension, ExtDescription, FileDescription, OpenWith, ParamString: string; IconIndex: Integer = 0): Boolean; Ordnet einer Dateierweiterung ein Programm zu. Vergleich dem, das beim anklicken einer Textdatei immer ein Editor geffnet wird. Parameter Extension: STRING Die Dateierweiterung die Zugeordnet werden soll ExtDescription: STRING Ein kurze Beschreibung der Dateierweiterung FileDescription: STRING Dateibeschreibung OpenWith: STRING Wit welchen Programm geffnet werden soll ParamString: STRING Welche Parameter (Kommandozeile) bergeben werden IconIndex: Integer Welches Icon (mit der Iconnummer, siehe GetMainIconHandle auf Seite 92) verwendet werden soll Result Rckgabe: boolean . HTTPEncode function HTTPEncode(const str : String) : string; Beschreibung fehlt Parameter const str : String . Result Rckgabe: string . ValidateFileName function ValidateFileName(old : string) : string; Beschreibung fehlt Parameter old : string . Result Rckgabe: string . ValidateFileDir function ValidateFileDir(old : string) : string; Beschreibung fehlt

90

7 Bibliotheken Parameter old : string . Result Rckgabe: string . ValidateDate function ValidateDate(D : string) : string; Beschreibung fehlt Parameter D : string . Result Rckgabe: string . GetTempPath function GetTempPath : string; Beschreibung fehlt Result Rckgabe: string . GetCongDir function GetConfigDir(app : string) : string; Beschreibung fehlt Parameter app : string . Result Rckgabe: string . GetGlobalCongDir function GetGlobalConfigDir(app : string) : string; Beschreibung fehlt Parameter app : string . Result Rckgabe: string .

91

7 Bibliotheken SizeToText function SizeToText(size : Longint) : string; Beschreibung fehlt Parameter size : Longint . Result Rckgabe: string . GetMainIconHandle function GetMainIconHandle : Cardinal; Gibt das Handle auf das Haupt Icon der Anwendung zurck. Das ist das Icon, das in der Taskleiste beziehungsweise am linken oberen Fensterrand bendet. Result Rckgabe: Cardinal Das Handle auf das Haupt Icon der Anwendung. CanWriteToProgramDir function CanWriteToProgramDir : Boolean; Beschreibung fehlt Result Rckgabe: boolean . OpenBrowser function OpenBrowser(Site : string) : Boolean; Beschreibung fehlt Parameter Site : string . Result Rckgabe: boolean . HexToBin function HexToBin(h: STRING): dword; Beschreibung fehlt Parameter h: STRING . Result Rckgabe: dword .

92

7 Bibliotheken LoadLanguage procedure LoadLanguage(lang : string); Beschreibung fehlt Parameter lang : string . RoundTo function RoundTo(const AValue : extended ; const ADigit : TRoundToRange) : extended ; Beschreibung fehlt Parameter AValue : extended . ADigit : TRoundToRange . Result Rckgabe: extended . TimeTotext function TimeTotext(Seconds : Integer) : string;

Beschreibung fehlt Parameter Seconds : Integer . Result Rckgabe: string . ExecProcess procedure ExecProcess(CommandLine : string;CurDir : string = ;Waitfor : Boolean = True); Beschreibung fehlt Parameter CommandLine : string . CurDir : string . Waitfor : Boolean .

93

7 Bibliotheken ExecVisualProcess procedure ExecVisualProcess(CommandLine : string;CurDir : string = ;Waitfor : Boolean = True); Beschreibung fehlt Parameter CommandLine : string . CurDir : string . Waitfor : Boolean . GetProcessforExtension function GetProcessforExtension(InfoTyp : TProcessinfoTyp;Extension : string) : string; Beschreibung fehlt Parameter InfoTyp : TProcessinfoTyp . Extension : string . Result Rckgabe: string . GetMimeTypeforExtension function GetMimeTypeforExtension(Extension : string) : string; Beschreibung fehlt Parameter Extension : string . Result Rckgabe: string . GetSystemLang function GetSystemLang : string; Beschreibung fehlt Result Rckgabe: string .

94

7 Bibliotheken RPos function RPos(const Substr: string; const S: string): Integer; Beschreibung fehlt Parameter Substr: string . S: string . Result Rckgabe: Integer . StripHTML function StripHTML(S: string): string; Beschreibung fehlt Parameter S: string . Result Rckgabe: string . StrTimeToValue FUNCTION StrTimeToValue(val : string) : LongInt; Beschreibung fehlt Parameter val : string . Result Rckgabe: LongInt . SystemUserName function SystemUserName : string; Beschreibung fehlt Result Rckgabe: string . Version: $LastChangedRevision: $
18

18

Autor: Andreas Frie Lizenz: GFDL

95

7 Bibliotheken

7.5 uFileMisc.pas
7.5.1 Beschreibung
Einleitung Diese Unit wurde von Erhard Kieling[14] geschrieben und dient zur Untersttzung bei Suchvorgngen. Beispiele zur Verwendung benden sich im LazSnippets Code Paket auf Sourceforge. Abhngigkeiten Es bestehen Abhngikeiten zu Classes, SysUtils, StdCtrls.

7.5.2 Typendenitionen
TSampleSearchResults = procedure (ADir, AFileName: string) of object; Denition der Callbackfunktion Parameter ADir: string Das Verzeichnis in dem in dem die Datei gefunden wurde. AFileName: string Der Dateiname der gefunden wurde.

7.5.3 Code
SearchFile Variante 1

function SearchFile(AInitDir, AFileName : string; ShowContent: TSampleSearchR string; overload; Sucht in einem Verzeichnis nach einer Datei. Parameter AInitDir: string Das Verzeichnis in dem gesucht werden soll. AFileName: string Der Dateiname der gesucht wird, Wildcards sind erlaubt. ShowContent: TSampleSearchResults Callbackfunktion die fr jedes Ergebnis aufgerufen wird. Sie mu nicht zwingend angegeben werden. Wird sie nicht verwendet so ist nil anzugeben. Result Rckgabe: string Dateiname mit Pfadangaben. SearchFile Variante 2 function SearchFile(AInitDir, ASubDir, AFileName : string; ShowContent: TSampleSearchResults): string; overload; Parameter AInitDir: string Das Verzeichnis in dem gesucht werden soll.

96

7 Bibliotheken ASubDir: string Das Unterverzeichnis in dem auch gesucht werden soll. AFileName: string Der Dateiname der gesucht wird, Wildcards sind erlaubt. ShowContent: TSampleSearchResults Callbackfunktion die fr jedes Ergebnis aufgerufen wird. Sie mu nicht zwingend angegeben werden. Wird sie nicht verwendet so ist nil anzugeben. Result Rckgabe: string .

7.5.4 Beispiel
procedure TForm1.SpeedButton1Click(Sender: TObject); begin if SelectDirectoryDialog1.Execute then begin edStartDir.Text:= SelectDirectoryDialog1.FileName; end; // of if SelectDirectoryDialog1.Execute then begin end; procedure TForm1.FormCreate(Sender: TObject); begin edStartDir.Text:= PathDelim; end; procedure TForm1.SampleResults(ADirName, AFileName: string); begin if (ADirName <> ) then begin lbDirBox.Items.Add(ADirName); Self.Update; end; if (AFileName <> ) then begin lbFileBox.Items.Add(AFileName); Self.Update; end; end; // of TForm1.SampleResults procedure TForm1.Button2Click(Sender: TObject); var s: string; begin lbDirBox.Clear; lbFileBox.Clear; s:= SearchFile(edStartDir.Text, , edFileName.Text,

97

7 Bibliotheken @SampleResults); if (s <> ) then edFileName.Text:= s; end; Version: $LastChangedRevision: $


19

19

Autor: Andreas Frie Lizenz: GFDL

98

8 Beispiele
8.1 DatenbankenMySQL5x
8.1.1 Demodatenbank MySQL
Installieren von MySQL 5.x Am einfachsten ist es im Internet auf die MySQL-Seite1 zu gehen und dort unter Community2 den Punkt Downloads und MySQL Community Server auszusuchen. Dort kann man sich dann den entsprechenden Server fr sein Betriebssystem aussuchen und herunterladen. Die Dateigre kann schon einen Breitband Internetzugang verlangen, denn je nach Version sind bis zu knappen 100 MB Download-Volumen gefragt. Weiters ist es zu empfehlen, das man sich unter Downloads, GUI Tools auch noch die Programme MySQL Administrator und MySQL Query Browser herunterldt. Mit Hilfe der beiden Tools kann man spter dann den Server komfortabel administrieren und auch die Datenbanken verwalten und Scripts laufen lassen. Die Tools sind nicht zwingend erforderlich, erleichtern aber gerade am Anfang das Leben. Eine Alternative dazu ist sicherlich auch das arbeiten mit PHPMySQLAdmin. Das Tool ist sehr ausgereift und auch entsprechend bekannt. Ein Nachteil dabei ist, das es einen Webserver mit PHP voraussetzt. Zur Installation geht man entsprechend den Erfordernissen seines Betriebssystems vor. Es wrde den Rahmen dieser Beschreibung sprengen, fr jedes Betriebssystem mit seinen Eigenheiten eine entsprechende Anleitung zu erstellen. Wichtig ist nur, das man bei der Installation und Konguration nicht vergisst, ein gutes Passwort fr den root (Administrationsuser) zu whlen. Denn spter vergisst man gerne den laufenden MySQL-Server und wenn der Rechner dann doch im Internet auftaucht, so hat man ein ganz schnes Sicherheitsleck, das einem gar nicht bewusst ist. Dasselbe gilt natrlich in abgemilderter Form auch fr normale Benutzer, die etwas mehr Rechte als lesen in der Datenbank haben. Eine gute Mglichkeit ist, ein launiges Sprichwort zu nehmen und die Anfangsbuchstaben aneinander zu reihen. Beispiel: Wir sind ja nicht bld Mann und haben 99 Luftballone gekauft. Daraus kann sich ein Pawort wie folgt ergeben WsjnbMuh99Lg. Das lsst sich noch so halbwegs merken und besteht aus Gro und Kleinbuchstaben, beinhaltet Zahlen und ist auerdem noch zwlf Zeichen lang. Aber genug dem Ausug in die Installation und Pawortauswahl, beginnen wir nun mit der Erstellung unserer Datenbank, die sich dann spter durch alle Beispiele ziehen wird.

1 2

http://www.mysql.de/ http://dev.mysql.com/

99

8 Beispiele Erstellung der DEMO Datenbank Das Erste, das wir am neuen oder geleerten MySQL Datenbankserver erstellen, ist eine neue Datenbank fr unsere Zwecke. Dazu ffnen wir den MySQL Query Browser. Es ffnet sich als ersters das Verbindungsfenster. Ich werde jetzt die Felder von oben nach unten besprechen, denn es knnte ja sein, das sie eine andere Sprachversion verwenden. Unter Gesp. Verbindungen wird ein beliebiger Namen eingetragen, unter der spter die Einstellungen wieder abgerufen werden knnen. Bei Server Host und Port geben wir, bei einer lokalen Installation, localhost und 3306 ein. Wobei die Portnummer 3306 der Standardport von MySQL ist. Als nchstes kommen jetzt der Nutzername und das Passwort dran, dort geben wir in diesem Fall den Benutzer root mit dem bei der Installation vergebenen Pawort ein. Spter sollte man sich nur in zwingend notwendigen Fllen mit dem Administratorpawort verbinden. Das Feld Standardschema lassen wir bei diesem ersten Einstieg einmal leer. Anschliessend gehen wir mit Ok im Dialog weiter, das nun folgende Hinweisfenster zum Thema fehlendes Standardschema bergehen wir mit dem Button Ignorieren. Ist bis jetzt alles gut verlaufen und der MySQL Datenbakserver aktiv, so ffnet sich jetzt endgltig der MySQL Query Browser. Als ersters erzeugen wir mittels CREATE USER lazarus@localhost IDENTIFIED BY WsjnbMuh99Lg; einen neuen Benutzer, der noch dazu ein halbwegs sicheres Pawort hat. Zustzlich geben wir diesen Benutzer alle Recht an dieser Datenbank mit folgenden Befehl GRANT all ON *.* TO lazarus@localhost;. Somit hat der Benutzer alle Rechte auer dem Recht, selbst Rechte zu vergeben. Im Menpunkt Datei whlen wir die Funktion Verbindung umschalten an und wechseln die Verbindung auf den User lazarus@localhost. Alternativ kann man den MySQL Query Browser schliessen und als Benutzer lazarus neu anmelden. Damit wir nicht immer die Informationen neu eingeben mssen, kann man den Button rechts neben den Gesp. Verbindungen benutzen und sich dort ein entsprechndes Prol anlegen. Somit braucht man spter nur sein Prol in der Top-Down Box anwhlen, das Pawort eingeben und schon ist man drinnen. Anschlieend erzeugen wir jetzt als Benutzer lazarus@localhost mittels dem Kommando CREATE DATABASE laztest DEFAULT CHARACTER SET latin1; eine neue Datenbank, mit dem Namen laztest. Diese Zeile geben wir oben im MySQL Query Browser ein und drcken dann auf den grnen Button daneben. Anschlieend knnen wir mit der Maus auf Schemata klicken und mit der Taste F5 ein neuerliches einlesen der bersicht der Datenbanken (= Schemata) erreichen. Jetzt sollte dort unsere neue Datenbank vorhanden sein. Somit haben wir die Datenbank erstellt und auch einen Beutzer mit hohen Rechten darin erzeugt. Fr den produktiven Betrieb wrde sich jetzt noch anbieten, einen Benutzer zu erzeugen,

100

8 Beispiele der entsprechend den Erfordernissen weniger Rechte hat. Aber nachdem das hier ja ein Tutorium ist, belassen wir es einmal dabei. Windows FAQ Einleitung Es hat sich auch bei mir gezeigt, das es manchmal nicht so einfach ist, MySQL unter Lazarus zu verbinden. Hier ein paar Hilfen. Cannot load MySQL library libmysql.dll Dieser Fehler kann mehrer Ursachen haben. Die einfachste ist, dass auf dem Rechner ganz einfach die Treiber fr MySQL nicht installiert sind. Die Abhilfe ist die Datei in ein Verzeichnis, dass sich im Suchpfad bendet zu kopieren. Genauso ist es mglich, die Bibliothek ins selbe Verzeichnis wie die ausfhrbare Datei zu kopieren, der Weg bietet sich an, wenn es an den Rechten am Systemverzeichnis fehlt. Wenn das ganze, wie am Bild, innerhalb von Lazarus passiert, so kann es einmal am Lazarus liegen. Besonders wenn man eine Version aus dem SVN selbst kompiliert, kann es vorkommen, das es hier Probleme gibt. Die Abhilfe ist nur, eine bessere oder stabile Version von Lazarus zu verwenden. Genauso kann es sein, dass wie oben bereits besprochen, die Biblothek fehlt. Die Abhilfe ist wieder die Biblothek in ein Verzeichnis, dass im Suchpfad liegt zu kopieren. Geht das nicht, so mu die Datei einmal in des Verzeichnis kopiert werden, wo sich die Lazarus.exe bendet und einmal in das Verzeichnis, wo die ausfhrbare Datei des Projektes liegt. Denn innerhalb der IDE bentigt Lazarus die Datei in seinem Pfad, wird die Datei aber ausgefhrt, so bentigt sie das aktuelle, kompilerte und gestartete Programm. Version: $LastChangedRevision: 38 $ 3

8.1.2 Projekt MySQLSimple


Einleitung In diesem Projekt wird nur eine einfache Verbindung zur Datenbank aufgebaut und die grundlegenden Elemente die dafr notwendig sind erklrt. Es werden hierbei nur Elemente verwendet die bei einer Standardinstallation von Lazarus dabei sind. Datenbank In der Datenbank mu fr dieses Beispiel folgende Anweisung ausgefhrt werden oder das ganze mittels des MySQL Query Browserrstellt werden. CREATE TABLE laztest.ST_Person ( STPerson INTEGER UNSIGNED NOT NULL AUTO_INCREMENT \ COMMENT Primaerschluessel, cVName VARCHAR(45) NOT NULL DEFAULT COMMENT Vorname, cFName VARCHAR(45) NOT NULL DEFAULT COMMENT Familienname,
3

Autor: Andreas Frie Lizenz: GFDL

101

8 Beispiele cMName VARCHAR(15) NOT NULL DEFAULT COMMENT Namensergaenzung, cRName VARCHAR(45) NOT NULL DEFAULT COMMENT Rufname, PRIMARY KEY (STPerson), UNIQUE INDEX Namen_idx(cVName, cFName, cRName) ) ENGINE = InnoDB CHARACTER SET latin1 COLLATE latin1_german1_ci COMMENT = Personendaten; Wir erstellen hier einmal die fr das Beispiel notwendige Tabelle fr Personendaten. Warum habe ich den Namen ST_Person gewhlt. Ganz einfach, ich rechne Tabellen mit diesem Inhalt zu den so genannten Stammdatentabellen. Das stimmt, auer wir haben hier eine reine Personenverwaltung. Nachdem das Beispiel aber erwitert werden soll, werden auch noch andere Tabellen folgen. Wir verwenden hier einmal die Spalte STPerson fr den nicht Null beinhaltenden (NOT NULL), automatisch hochzhlenden (AUTO_INCREMENT), eindeutigen Primrschlssel (PRIMARY KEY (STPerson)). In der Spalten cVName und cFName kommen der Vorname und der Familienname (=Nachname) hinein, zustzlich gibt es noch das Feld fr einen eventuelle Namensergnzung. Weiters beinhaltet die Spalte cRName noch den Rufnamen der Person. Fast ganz unten in der denition der Tabelle bendet sich ein Hinweis auf einen weiteren Index. Dieser eindeutige Index (UNIQUE INDEX) soll verhindern, das gleiche Personen mehrmals in der Tabelle angelegt werden knnen. Warum wird dann aber nicht nur die Felder des Vornamens und des Familienanmens herangezogen ? Na, ja, was ist wenn wir mehrere Max Mustermann haben ! Im richtigen Leben hat man dann ja selbst noch hilfen, das zu unterscheiden. Dazu dient der Rufname (= Spitzname). Denn dann kannman den Max aus D und den Max aus A auch noch eintragen und die EIntrge sind jetzt trotz der Namensgleichheit wirklich auseinander zu halten. Benutzerschnittstelle Die Komponeneten kommen von der Palettenseite SQLdb, DataAccess und DataControls. Fangen wir einmal mit der SQLdb an. Um auf eine Datenbank zugreifen zu knnen, bentigen wir einmal eine Verbindungskomponente, das ist in unseren Fall eine der zur Datenbank passende Connection (= Verbindung). Da wir einen MySQL Server 5.x am laufen haben, so nehmen wir die passende MySQL50Connection Komponente und bringen sie auf das Projekt.

102

8 Beispiele Weiters fgen wir noch eine TSQLTransaction Komponente unserer Form hinzu. Jetzt der Reihe nach, angefangen bei der TMySQL50Connection Komponente, mssen wir Einstellungen im Objektinspektor treffen. Bei der TMySQL50Connection Komponente sind es folgene Einstellungen. Der DatabaseName wird auf den Namen unserer Datenbank laztest gesetzt. Der HostName ist bei einer kokalen installation immer localhost. Fr das Pawort nehmen wir das des Benutzers, der sich mit der Datenbank verbindet. Bei Transaction mssen wir nur in das im Objektinspektor klicken und eine Auswahl erscheint. Wir nehmen hier unsere SQLTransaction1. Als letztes geben wir den UserNamen ein, das ist ganz einfach der Benutzer den wir in der Datenbank erstellt haben, also lazarus@localhost. Die nchste Komponenete ist die TSQLTransaction. Dort mssen wir aktuell nichts einstellen, da sich die Eigenschaft Database im Objektinspektor bereits selbst auf MySQL50Connection1 gendert hat. Den ersten Test kann man jetzt bereits durchfhren. Durch anklicken der Eigenschaft Connected von MySQL50Connection1 wechselt diese von False auf True. Wenn alles gut gelaufen ist, so luft die Verbindung ohne Probleme ab. Wenn nicht, so mu man die Einstellungen nochmals berprfen. Anschliessen stellen wir die Eigenschaft wieder auf False zurck. Nachdem die Verbindung zur Datenbank mglich ist, so mssen wir jetzt die Komponeneten fr die Abfrage der Datenbank und die Anzeige der Daten noch hinzufgen. Es handelt sich hier um die Komponeneten TSQLQuery von Tab sqldb, TDataSource vom Tab Data Access und TDBGrid vom Tab Data Controls. Fangen wir mit der Komponente SQLQuery1 an. Sie ist zustndig fr die richtige Abfrage am Datenbankserver. Wir stellen die Eigenschaft DataBase auf unsere MySQL50Connection1 ein. Weiters mssen wir in die Eigenschaft SQL folgendes einfgen SELECT STPerson, cVName, cFName, cMName, cRName FROM st_person; und den Eigenschaftseditor wieder schlieen. Die Eigenschaft hat sich Transaction im Objektinspektor bereits selbst auf SQLTransaction1 gendert. In der Komponenete Datasource1 mssen wir nur DataSet per Mausklick auf SQLQuery1 einstellen. Als letztes kongurieren wir das TDBGrid. Wir ndern mit der Maus die Eigenschaft Align auf alClient und die Eigenschaft DataSource auf Datasource1. Damit erfasst das Grid das komplette Formular. Prinzipiell ist unser Programm jetzt einmal optisch fertig. Wenn wir es jetzt kompilieren und laufen lassen, sehen wir das Formular, aber keine Daten und ndern knnen wir auch nichts. Es ist klar, wir haben die Komponenten konguriert, aber etwas Code wird auch bentigt um den Komponenten zu sagen, was wir wirklich wollen. Dazu verwenden wir eine TActionList und ein TMainmenu aus dem Tab Standard. In der ActionList1 erzeugen wir ganz einfach die Ereignisse actCloseDB, actOpenDB und actDataSetRefresh. Ausserdem Erzeugen wir die Ereignisproceduren fr das Form erzeugen un Form schliessen. Im MainMenu Komponente erzeugen dann ein kleines Men.

103

8 Beispiele procedure TfMain.actOpenDBExecute(Sender: TObject); begin if not MySQL50Connection1.Connected then begin MySQL50Connection1.Connected := true; end; if not SQLQuery1.Active then SQLQuery1.Active := true; end; Beim Eintreffen des Ereignisses fr das ffnen der Datenbank, wird als erstes Abgefragt ob die Verbindung bereits besteht. Ist die Verbindung vorhanden, so wird die Abfrage selbst geffnet, falls sie noch nicht offen war. procedure TfMain.actCloseDBExecute(Sender: TObject); begin if MySQL50Connection1.Connected then begin if SQLQuery1.Active then begin SQLQuery1.ApplyUpdates; SQLQuery1.Active := false; end; MySQL50Connection1.Connected := false; end; end; Wenn die Datenbank wieder geschlossen werden soll, so sind zuerst die noch nicht gespeicherten Daten zurckzuschreiben, dies geschieht mit dem Kommando ApplyUpdates. Ohne diese Kommando bleiben die nderungen nur lokal und werden mit der nchsten Abfrage wieder berschrieben. Anschliessend wird die Abfrage deaktiviert, dannach die Verbindung. procedure TfMain.actDataSetRefreshExecute(Sender: TObject); begin if not SQLQuery1.Active then exit; SQLQuery1.ApplyUpdates; SQLQuery1.Refresh; end; Bei einer einfachen Auffrischung der Daten, arbeiten wir hier vorsichtshalber die nderungen ein, bevor wir die eigentliche Auffrischung durchfhren. Falls die Abfrage nicht aktiv war, brauchen wir klarerweise gar nichts zu machen. procedure TfMain.FormDestroy(Sender: TObject); begin actCloseDBExecute(Sender); end;

104

8 Beispiele Wichtig ist, das beim Schlieen des Formular, die Datenbankkomponenten wieder ordnungsgem von der Datenbank getrennt werden, ansonsten hat man Fehlermeldungen und auch blockierte Datenverbindungen. Generell sollte danch getrachtet werden, die Verbindungen, egal was geschieht, in konsistenten Zustand zu hinterlassen. SVN Den Quelltext des Beispiel kann man sich auch mit folgenden Kommando aus dem SVN ind das aktuelle Verzeichnis holen. svn co https://lazsnippets.svn.sourceforge.net/svnroot/lazsnippets/\ trunk/datenbank/MySQL/MySQLSimple . Die Zeile ist in einem zu schreiben und wurde nur aus Formatierungsgrnden hier beim Rckstrich (Backslash) umgebrochen. Der Punkt am Ende der Zeile ist notwendig, da es das Kennzeichen fr das aktuelle Verzeichnis ist. Weiter ist auf die Schreibweise zu achten, das hier die Server zwischen Grobuchstaben und Kleinbuchstaben unterscheiden. Die Datenbank mu man aber trotzdem selbst am MySQL Server erstellen. Die dazu bentigten Informationen benden sich im Text von Datenbank weiter oben. Version Derzeit ist das Beispiel mit der Version 0.9.23 beta von Lazarus entwickelt. Betriebssystem Linux Suse WinXP getestet nein ja

Abbildung 8.1: Versionsbersicht Version: $LastChangedRevision: 38 $ 4

Autor: Andreas Frie Lizenz: GFDL

105

8 Beispiele

8.1.3 Projekt MySQLTestData


Einleitung Es soll zeigen, wie man relativ einfach Testdaten in grerer Zahl in die Tabelle ST_Person unserer Datenbank einfgt. Zugleich kann man es als Basis fr Versuche mit SELECT Statements verwenden. In der Tabelle werden Lsch-, Einfge- und Auswahloperationen durchgefhrt. Datenbank Es wird die Datenbank und Tabelle vom Beispiel MySQLSimple verwendet. Weitere Informationen knnen dort gefunden werden. Benutzerschnittstelle Auf der Oberche benden sich links drei Buttons. Abbildung 8.2: Projekt TestData GUI Mit dem obersten Button wird die Tabelle komplett geleert, diese wird durch eine Delete Anweisung im Quelltext durchgefhrt. Der mittlere Button und das Eingabefeld darber gehren zusammen und fgen neue Datenstze in der Tabelle ein. Die Anzahl der Datenstze wird durch den Wert im Eingabefeld vorgegeben. Der unterste Button und das Tab-Sheet rechts daneben diesen zum Abfragen der Daten. Auf der ersten Seite des Tab-Sheets kann man das Abfrage Statement eingebn, die Anzeige erfolgt auf der zweiten Seite des Tab-Sheet. Und jetzt die Funktionen mit den dahinterliegenden Code im Detail. Oberer Button Zuerst wird geprft ob die Verbindung (Connection) zur Datenbank besteht, wenn nicht so wird die Verbindung hergestellt. Die Verbindungseinstelllungen wurden ber den Objektinspektor schon beim Design getroffen, da es sich hier um Beispiele handelt. if not MySQL50Connection1.Connected then MySQL50Connection1.Connected := true; aSqlQuery := TSQLQuery.Create(self); try aSqlQuery.SQL.Clear; aSqlQuery.DataBase := MySQL50Connection1; aSQLQuery.Transaction := SQLTransaction1; aSqlQuery.SQL.Add(DELETE FROM st_person;); aSqlQuery.ExecSQL; finally aSqlQuery.free; end; Anschliessend wird zur Laufzeit die TSQLQuery Komponente erzeugt. Wichtig ist, da das Objekt erzeugt wird (aSqlQuery := TSQLQuery.Create(self);). Durch self wird das Objekt dem Formular zugeordnet, so das das Formular beim Beenden auch das Objekt zerstren kann, falls es bis dahin noch nicht zerstrt wurde.

106

8 Beispiele Im nchsten Schritt wird ein eventuell vorhandenes gespeichertes SQL-Statement sicherheitshalber gelscht. Weiters die Verbindung und die Transaktion zugewiesen. Dies geschieht genauso als wrde man es ber den Objektinspektor machen. Dann wird das neue SQL-Statement hinzugefgt. Da es ohne WHERE EInschrnkung verwendet wird, lscht es somit alle Daten aus der Tabelle. Zum Abschlu wird das verwendete SQL-Query Objekt wieder sauber entfernt. Damit dies auch geschieht wenn es einen Fehler gegeben hat, sind die Teile ab der Erstellung des Objektes durch ein try..nally Statement geklammert. Damit wird erreicht, das das Objekt auch nach einem Fehler richtig gelscht wird. Mittlerer Button Beim bettigen des Buttons wird als erstes die Eingabe des Editfeldes berprft und nur wenn der Wert in eine Zahl umgewndelt werden kann, wird fortgefahren. try iAnzahl := StrToInt(edAnzahl.Text); except showmessage(Nur Zahlen erlaubt); exit; end; Mittels des Behfels randomize wird der Zufallszahlengenerator initialisiert, dann die Verbindung zur Datenbank ntigenfalls hergestellt. Anschliessend eine TSQLQuery zur Laufzeit erzeugt und mit den ntigen Informationen versorgt. randomize(); if not MySQL50Connection1.Connected then MySQL50Connection1.Connected := true; aSqlQuery := TSQLQuery.Create(self); try aSqlQuery.SQL.Clear; aSqlQuery.DataBase := MySQL50Connection1; aSQLQuery.Transaction := SQLTransaction1; Weil wir spter in einer Schleife Daten in die Datenbank einfgen, so erzeugen wir hier jetzt die ntigen Parameter. HINWEIS: Das Arbeiten mit Parametern ist wesentlich besser, als das Statement mittels Stringverwaltung zusammen zu setzen. Man vermeidet damit Probleme mit speziellen Zeichen, wie Hochkomma und der SQL-Server hat die Mglichkeit das Statement vor zu kompilieren und zu optimieren. Anschliessend wird das SQL-Statement in die Query eingefgt. Mit den Doppelpunkt zeigt man, das es sich hier um einen Parameter handelt. aSqlQuery.Params.CreateParam(ftInteger,vname,ptInput); aSqlQuery.Params.CreateParam(ftInteger,fname,ptInput);

107

8 Beispiele aSqlQuery.Params.CreateParam(ftInteger,mname,ptInput); aSqlQuery.Params.CreateParam(ftInteger,rname,ptInput); aSqlQuery.SQL.Add(INSERT st_person (cVName,cFName,cMName, cRName)); aSqlQuery.SQL.Add( VALUES (:vname,:fname,:mname, :rname);); Hier beginnt die Schleife. ALs erstes werden dir Stringvariablen erzeugt, anschliessend die Strings den Parameteren bergeben. for i := 1 to iANzahl do begin iZufall := Random(MaxVorNamen-MinVorNamen) + MinVorNamen; cVName := VorNamen[iZufall]; if cVName = then continue; iZufall := Random(MaxFamilienNamen-MinFamilienNamen) + MinFamilienNamen; cFName := FamilienNamen[iZufall]; if cFName = then continue; cMName := leftStr(cVName,2) +LeftStr(cFName,2); cRName := cVName + IntToStr(Random(10)) + cFName; aSqlQuery.Params.ParamByName(vname).AsString aSqlQuery.Params.ParamByName(fname).AsString aSqlQuery.Params.ParamByName(mname).AsString aSqlQuery.Params.ParamByName(rname).AsString := := := := cVName; cFName; cMName; cRName;

Jetzt wird die Query mit den aktuellen Parametern durchgefhrt. Der Befehl lautet ExecSQL, dieser erwartet keine Ergebnismenge zurck. Das ist auch der Grund warum hier kein Open oder Active=true verwendet wurde, denn dieses erwarted das eine Ergebnismenge zurck geliefert wird. Anschliessend wird solange in der Schleife verblieben, bis alles abgearbeitet wurde. Wenn beim Ausfhren ein Fehler auftritt, so wird in der Statuszeile eine Fehlermeldung angezeigt und mit dem nchsten durchlauf weitergemacht. try aSqlQuery.ExecSQL; except Statusbar1.SimpleText := Fehler in: + IntToStr(i); sleep(100); end; end; finally aSqlQuery.free; end;

108

8 Beispiele Unterer Button Zum Unterschied vorher, ist diese Query zur Designzeit auf dem Formular hinterlegt worden. Damit entfllt das erzeugen zur Laufzeit. Das soll auch den Unterschied zwischen den beiden Methoden zeigen. Es wird zuerst die Query inaktiv gemacht, falls sie offen war. Dann ganz einfach der Inhalt der Strings aus dem Meno in die Query bertragen und die Query wieder aktiv gemacht. Deshalb aktiv gemacht, da wir ja eine Ergebnismenge erwarten. Das htten wir beim ausfhren von ExecSQL nicht. if SQLQuery1.Active then SQLQuery1.Active := false; SQLQuery1.SQL.Clear; SQLQuery1.SQL.Assign(Memo1.Lines); try SQLQuery1.Active := true; except showmessage(Anweisungen nicht gltig); end; Dann kann man im Datengitter die Ergebnisse betrachten. SVN Den Quelltext des Beispiel kann man sich auch mit folgenden Kommando aus dem SVN ind das aktuelle Verzeichnis holen. svn co https://lazsnippets.svn.sourceforge.net/svnroot/lazsnippets/\ trunk/datenbank/MySQL/MySQLTestData . Die Zeile ist in einem zu schreiben und wurde nur aus Formatierungsgrnden hier beim Rckstrich (Backslash) umgebrochen. Der Punkt am Ende der Zeile ist notwendig, da es das Kennzeichen fr das aktuelle Verzeichnis ist. Weiter ist auf die Schreibweise zu achten, das hier die Server zwischen Grobuchstaben und Kleinbuchstaben unterscheiden.

Betriebssystem Linux Suse WinXP

getestet nein ja

Abbildung 8.3: Versionsbersicht Version Version: $LastChangedRevision: 38 $

Autor: Andreas Frie Lizenz: GFDL

109

8 Beispiele

8.2 DatenbankenSQLite3x 8.3 DatenbankenTDBF

110

9 Programme
9.1 Ntzliche Werkzeuge
9.1.1 Versionskontrolle
Warum ein Versionsmanagment berhaupt verwenden? Es ist doch viel einfacher den Sourcecode und die bentigten Dateien einfach auf der Festplatte zu haben und von Zeit zu Zeit macht man davon ein Archiv. Diesem Archiv gebe ich ganz einfach einen guten Titel und die Sache hat sich. Das kann bei einem einzelnen Entwickler durchaus so noch funktionieren. Wenn man aber in einem Team arbeiten mu, so wird es schon hier zu Problemen kommen. Denn jeder Entwickler hat seine eigene Version und mu die nderungen in das Projekt ein pegen. Was ist aber wenn gerade 2 Entwickler an derselben Datei arbeiten. Der eine bringt die nderungen ein, der andere bekommt die nderung aber auch nicht mit und bringt seinerseits seine nderungen ein. Somit sind die nderungen des ersten Entwicklers unbemerkt verloren und das Projekt somit nicht konsistent. Weiters ist die Verfolgung der nderungen fast, bzw. nur schwer mglich. Um dieses Szenario zu vermeiden und die arbeit im Team zu vereinfachen haben sich im laufe der Jahre Versionsmanagmentsysteme entwickelt. Da wir hier nur SVN einsetzen werden, will ich mich hier auf die grundlegende Bedienung von SVN beschrnken. svn Kommandozeile SVN von der Kommandozeile aus zu bedienen ist eine der universellsten Mglichkeiten, das diese Art damit zu arbeiten auf allen Plattformen (Unix, Linux, Windows, MacOS, ...) vorhanden ist. Vor allen wenn man nur Projekte aus dem SVN holt und auffrischt ist die Syntax relativ einfach. Die dafr notwendigen Befehle sind hier kurz vorgestellt. SVN holen und Informationen anzeigen svn checkout URL [Pfad ] Mit diesem Kommando wird von der URL der gespeicherte Inhalt aus dem Repository geholt und an der Stelle gespeichert die durch den Pfad angegeben ist. Fehlt die Angabe des Pfades, so wird das aktuelle Verzeichnis genommen. svn co URL [Pfad ] ist die Kurzform von checkout, Erklrung siehe dort. svn help Gibt die Onlinehilfe zu SVN aus. svn list URL und svn list Pfad Zeigt zustzliche Informationen zur URL beziehungsweise zum Pfad an.

111

9 Programme svn log URL und svn log Pfad Zeigt die Loginformationen zur URL beziehungsweise zum Pfad an. svn update Aktualisiert die lokale Kopie und ld alle nderungen, welche in der Zwischenzeit von anderen entwicklern am Repository vorgenohmen wurden. svn revert Pfad Entfernt die nderungen sei der letzten Revision und stellt einen unvernderten Zustand wieder her. nderungen bertragen svn add Datei Fgt eine Datei in der Arbeitskopie zur Versionskontrolle hinzu. Die Datei wird jedoch nicht direkt in das Repository geladen, sondern lediglich markiert. svn commit [-m"Beschreibung..." ] Legt eine neue Revision an und bertrgt alle nderungen an Dateien, welche sich bereits unter Versionkontrolle benden bzw. vorher mit add markiert wurden. Der Parameter -m erlaubt es, direkt eine Beschreibung der nderungen anzugeben, welche spter ein Nachverfolgen der nderungen ermglicht. Version: $LastChangedRevision: 95 $
1

Autor: Andreas Frie Lizenz: GFDL

112

9 Programme

9.1.2 Tool Versionenselektierer


Was macht das Tool eigentlich? Alle Betriebssysteme stellen ja die jedem bekannte Mglichkeit zur Verfgung, Dateien mit den entsprechenden Anwednungen zu verknpfen. Somit ist es mglich mit (Doppel)Klick auf eine Datei automatisch ein entsprechendes Programm zur Bearbeitung bzw. Betrachtung zu ffnen. Und genau bei diesem ein Programm liegt der Grund, wieso ich dieses kleine Tool fr mich geschrieben habe. Lazarus erstellt bei der Installation wenn man es aktiviert hat, automatisch Verknpfungen fr die entsprechenden dazugehrigen Dateitypen, wie .pas, .pp, .lpr usw. Nun ist das ja gut und schn, aber wenn man mehrer Lazarusinstallationen auf dem System laufen hat, ffnet sich ja dennoch nur die verknpfte Version automatisch, whrenddessen die andere ignoriert wird. Mehrer Lazarusversionen auf einem System zu haben kann beispielsweise den Vorteil bringen, das man sowohl das letzte ofzielle Release sowie die aktuelle SVN-Version bzw. einen aktuelleren Snapshot installiert hat. Somit kann man beispielsweise die Kompatibilitt der eigenen Anwednung mit neuern lazarusversionen im Auge behalten bzw. aktuelle Bugentwicklungen verfolgen, whrend dessen man stehts noch ein altes Lazarus zum sicheren Arbeiten hat. Wie bereits gesagt, kann ja nur eine Lazarusversion in diesem Fall zum automatischen ffnen verknpft werden. Mchte man allerdings die andere Nutzen muss man erst umstndlich die IDE aufrufen und anschlieend kann man die gewnschte Datei ber Datei ffnen... in die IDE laden. Um dies zu vereinfachen und komfortabel eine Versionenauswahl zur Verfgung (siehe Screenshot) zu haben dient dieses kleine Tool. Statt mit Lazarus selbst werden die entsprechenden Dateien ber die ffnen mit - Eigenschaft mit diesem Tool verknpft. Das Programm bietet nun alle Eingetragenen Lazarusversionen zum ffnen an. Wird eine entsprechende Version ausgewhlt, so startet das Tool automatisch die entsprechende Version und ld die gewnschte Datei genau so, als wenn die Datei direkt mit Lazarus verknpft wre. Noch etwas in eigener Sache: das Programm wurde lediglich als kleines Hilfstool programmiert, ohne auf besondere Funktionen wert zu legen. Daher erfolgt beispielsweise die Konguration auch direkt in der Textdatei, wie im Folgenden erklrt wird. Jedem steht es natrlich frei, weitere Funktionalitt einzubauen, ein kleiner Patch/bzw. eine Mail mit aktuellem Code dazu wre natrlich nett. http://www.lazarusforum.de/viewtopic.php?p=11822

113

9 Programme Konguration Systemkonguration Das Programm selbst muss lediglich mit zusammen mit der cong.ini und optional (mchte man das Icon auf den Buttons haben) mit der lazarus.bmp in ein Verzeichnis kopiert werden. Auf die Systemkonguration soll hier nur kurz eingegangen werden. Es ist wichtig, das die entsprechenden Dateien anstatt mit Lazarus direkt mit dem Programm verknpft sind, so dass dieses bei ffnen der Datei gestartet wird. Programmkonguration Als Konguration dient eine einfache Ini mit folgendem Aufbau: [Pfade] Starter=c:\lazarus\Starter\ #Die einzelnen Schaltflchen: [Button1] Name=Lazarus Release Glyph=lazarus.bmp Pfad=c:\lazarus\Lazarus.exe [Button2] Name=Lazarus Entwicklungszweig Glyph=lazarus.bmp Pfad=c:\Lazarus_trunk\Lazarus.exe Allgemeine Einstellungen: Starter - diese Angabe enthlt den absoluten Pfad zum Programmverzeichnis Einstellungen fr die einzelnen Schaltchen: ButtonX - X wird fr jeden neuen Button ainfach um 1 hochgezhlt, ansonsten kann der gesamte Block kopiert werden und die folgenden Angaben werden angepasst: Name - Angabe, welche auf dem Button erscheint Glyph - Name des Bildes welches auf dem Button angezeigt werden soll, das Bild sollte im Programmpfad liegen Pfad - absoluter Pfad zur entsprechenden Lazarusversion, welche ber diesen Button gestartet werden soll Sind alle Kongurationen entsprechend angepasst, ist das Programm einsatzbereit. Wird es direkt gestartet, erlaubt es ebenfalls die Auswahl und das starten einer Lazarusversion, ohne das eine Datei bergeben wird.

114

10 Anhang
10.1 Tabellenverzeichnis

115

Tabellenverzeichnis
3.1 5.1 5.2 5.3 5.4 5.5 5.6 5.7 Datenbank Normalisierungstufen bersicht . . . . . . . . . . . . . . . . . . . IDE - Tastenkombinationen Datei . . . IDE - Tastenkombinationen Bearbeiten . IDE - Tastenkombinationen Suchen . . IDE - TastenkombinationenAnsicht . . . IDE - Tastenkombinationen Projekt . . IDE - Tastenkombinationen Start . . . . IDE - Tastenkombinationen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32 58 58 59 59 59 60 60

116

Literaturverzeichnis
[LazDe] Deutsches Lazarusforum http://www.lazarusforum.de Forum [LazEn] Englisches Lazarusforum http://www.lazarus.freepascal.org [FPCLangRef] Reference guide for Free Pascal, version 2.0.4,Document version 2.0 August 2006 ftp://ftp.freepascal.org/pub/fpc/docs-pdf/ref.pdf [10] Lazarus Wiki kombinationen http://www.lazarus.freepascal.org bersichtstabelle_der_IDE_Tasten-

[11] Homepage http://www.ullihome.de/ [12] Homepage http://homepages.codegear.com/jedi/jcl/ [14] Homepage http://www.????.???/

117

Literaturverzeichnis

10.2 GNU Free Documentation License


Version 1.2, November 2002 Copyright c 2000,2001,2002 Free Software Foundation, Inc. 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed.

Preamble
The purpose of this License is to make a manual, textbook, or other functional and useful document free in the sense of freedom: to assure everyone the effective freedom to copy and redistribute it, with or without modifying it, either commercially or noncommercially. Secondarily, this License preserves for the author and publisher a way to get credit for their work, while not being considered responsible for modications made by others. This License is a kind of copyleft, which means that derivative works of the document must themselves be free in the same sense. It complements the GNU General Public License, which is a copyleft license designed for free software. We have designed this License in order to use it for manuals for free software, because free software needs free documentation: a free program should come with manuals providing the same freedoms that the software does. But this License is not limited to software manuals; it can be used for any textual work, regardless of subject matter or whether it is published as a printed book. We recommend this License principally for works whose purpose is instruction or reference.

1. APPLICABILITY AND DEFINITIONS


This License applies to any manual or other work, in any medium, that contains a notice placed by the copyright holder saying it can be distributed under the terms of this License. Such a notice grants a world-wide, royalty-free license, unlimited in duration, to use that work under the conditions stated herein. The Document, below, refers to any such manual or work. Any member of the public is a licensee, and is addressed as you. You accept the license if you copy, modify or distribute the work in a way requiring permission under copyright law. A Modied Version of the Document means any work containing the Document or a portion of it, either copied verbatim, or with modications and/or translated into another language. A Secondary Section is a named appendix or a front-matter section of the Document that deals exclusively with the relationship of the publishers or authors of the Document to the Documents overall subject (or to related matters) and contains nothing that could fall directly within that overall subject. (Thus, if the Document is in part a textbook of mathematics, a Secondary Section may not explain any mathematics.) The relationship could be a matter of historical connection with the subject or with related matters, or of legal, commercial, philosophical, ethical or political position regarding them.

118

Literaturverzeichnis The Invariant Sections are certain Secondary Sections whose titles are designated, as being those of Invariant Sections, in the notice that says that the Document is released under this License. If a section does not t the above denition of Secondary then it is not allowed to be designated as Invariant. The Document may contain zero Invariant Sections. If the Document does not identify any Invariant Sections then there are none. The Cover Texts are certain short passages of text that are listed, as Front-Cover Texts or Back-Cover Texts, in the notice that says that the Document is released under this License. A Front-Cover Text may be at most 5 words, and a Back-Cover Text may be at most 25 words. A Transparent copy of the Document means a machine-readable copy, represented in a format whose specication is available to the general public, that is suitable for revising the document straightforwardly with generic text editors or (for images composed of pixels) generic paint programs or (for drawings) some widely available drawing editor, and that is suitable for input to text formatters or for automatic translation to a variety of formats suitable for input to text formatters. A copy made in an otherwise Transparent le format whose markup, or absence of markup, has been arranged to thwart or discourage subsequent modication by readers is not Transparent. An image format is not Transparent if used for any substantial amount of text. A copy that is not Transparent is called Opaque. Examples of suitable formats for Transparent copies include plain ASCII without markup, Texinfo input format, LaTeX input format, SGML or XML using a publicly available DTD, and standard-conforming simple HTML, PostScript or PDF designed for human modication. Examples of transparent image formats include PNG, XCF and JPG. Opaque formats include proprietary formats that can be read and edited only by proprietary word processors, SGML or XML for which the DTD and/or processing tools are not generally available, and the machinegenerated HTML, PostScript or PDF produced by some word processors for output purposes only. The Title Page means, for a printed book, the title page itself, plus such following pages as are needed to hold, legibly, the material this License requires to appear in the title page. For works in formats which do not have any title page as such, Title Page means the text near the most prominent appearance of the works title, preceding the beginning of the body of the text. A section Entitled XYZ means a named subunit of the Document whose title either is precisely XYZ or contains XYZ in parentheses following text that translates XYZ in another language. (Here XYZ stands for a specic section name mentioned below, such as Acknowledgements, Dedications, Endorsements, or History.) To Preserve the Title of such a section when you modify the Document means that it remains a section Entitled XYZ according to this denition. The Document may include Warranty Disclaimers next to the notice which states that this License applies to the Document. These Warranty Disclaimers are considered to be included by reference in this License, but only as regards disclaiming warranties: any other implication that these Warranty Disclaimers may have is void and has no effect on the meaning of this License.

2. VERBATIM COPYING
You may copy and distribute the Document in any medium, either commercially or noncommercially, provided that this License, the copyright notices, and the license notice saying this

119

Literaturverzeichnis License applies to the Document are reproduced in all copies, and that you add no other conditions whatsoever to those of this License. You may not use technical measures to obstruct or control the reading or further copying of the copies you make or distribute. However, you may accept compensation in exchange for copies. If you distribute a large enough number of copies you must also follow the conditions in section 3. You may also lend copies, under the same conditions stated above, and you may publicly display copies.

3. COPYING IN QUANTITY
If you publish printed copies (or copies in media that commonly have printed covers) of the Document, numbering more than 100, and the Documents license notice requires Cover Texts, you must enclose the copies in covers that carry, clearly and legibly, all these Cover Texts: FrontCover Texts on the front cover, and Back-Cover Texts on the back cover. Both covers must also clearly and legibly identify you as the publisher of these copies. The front cover must present the full title with all words of the title equally prominent and visible. You may add other material on the covers in addition. Copying with changes limited to the covers, as long as they preserve the title of the Document and satisfy these conditions, can be treated as verbatim copying in other respects. If the required texts for either cover are too voluminous to t legibly, you should put the rst ones listed (as many as t reasonably) on the actual cover, and continue the rest onto adjacent pages. If you publish or distribute Opaque copies of the Document numbering more than 100, you must either include a machine-readable Transparent copy along with each Opaque copy, or state in or with each Opaque copy a computer-network location from which the general network-using public has access to download using public-standard network protocols a complete Transparent copy of the Document, free of added material. If you use the latter option, you must take reasonably prudent steps, when you begin distribution of Opaque copies in quantity, to ensure that this Transparent copy will remain thus accessible at the stated location until at least one year after the last time you distribute an Opaque copy (directly or through your agents or retailers) of that edition to the public. It is requested, but not required, that you contact the authors of the Document well before redistributing any large number of copies, to give them a chance to provide you with an updated version of the Document.

4. MODIFICATIONS
You may copy and distribute a Modied Version of the Document under the conditions of sections 2 and 3 above, provided that you release the Modied Version under precisely this License, with the Modied Version lling the role of the Document, thus licensing distribution and modication of the Modied Version to whoever possesses a copy of it. In addition, you must do these things in the Modied Version: A. Use in the Title Page (and on the covers, if any) a title distinct from that of the Document, and from those of previous versions (which should, if there were any, be listed in the

120

Literaturverzeichnis History section of the Document). You may use the same title as a previous version if the original publisher of that version gives permission. B. List on the Title Page, as authors, one or more persons or entities responsible for authorship of the modications in the Modied Version, together with at least ve of the principal authors of the Document (all of its principal authors, if it has fewer than ve), unless they release you from this requirement. C. State on the Title page the name of the publisher of the Modied Version, as the publisher. D. Preserve all the copyright notices of the Document. E. Add an appropriate copyright notice for your modications adjacent to the other copyright notices. F. Include, immediately after the copyright notices, a license notice giving the public permission to use the Modied Version under the terms of this License, in the form shown in the Addendum below. G. Preserve in that license notice the full lists of Invariant Sections and required Cover Texts given in the Documents license notice. H. Include an unaltered copy of this License. I. Preserve the section Entitled History, Preserve its Title, and add to it an item stating at least the title, year, new authors, and publisher of the Modied Version as given on the Title Page. If there is no section Entitled History in the Document, create one stating the title, year, authors, and publisher of the Document as given on its Title Page, then add an item describing the Modied Version as stated in the previous sentence. J. Preserve the network location, if any, given in the Document for public access to a Transparent copy of the Document, and likewise the network locations given in the Document for previous versions it was based on. These may be placed in the History section. You may omit a network location for a work that was published at least four years before the Document itself, or if the original publisher of the version it refers to gives permission. K. For any section Entitled Acknowledgements or Dedications, Preserve the Title of the section, and preserve in the section all the substance and tone of each of the contributor acknowledgements and/or dedications given therein. L. Preserve all the Invariant Sections of the Document, unaltered in their text and in their titles. Section numbers or the equivalent are not considered part of the section titles. M. Delete any section Entitled Endorsements. Such a section may not be included in the Modied Version. N. Do not retitle any existing section to be Entitled Endorsements or to conict in title with any Invariant Section.

121

Literaturverzeichnis O. Preserve any Warranty Disclaimers. If the Modied Version includes new front-matter sections or appendices that qualify as Secondary Sections and contain no material copied from the Document, you may at your option designate some or all of these sections as invariant. To do this, add their titles to the list of Invariant Sections in the Modied Versions license notice. These titles must be distinct from any other section titles. You may add a section Entitled Endorsements, provided it contains nothing but endorsements of your Modied Version by various partiesfor example, statements of peer review or that the text has been approved by an organization as the authoritative denition of a standard. You may add a passage of up to ve words as a Front-Cover Text, and a passage of up to 25 words as a Back-Cover Text, to the end of the list of Cover Texts in the Modied Version. Only one passage of Front-Cover Text and one of Back-Cover Text may be added by (or through arrangements made by) any one entity. If the Document already includes a cover text for the same cover, previously added by you or by arrangement made by the same entity you are acting on behalf of, you may not add another; but you may replace the old one, on explicit permission from the previous publisher that added the old one. The author(s) and publisher(s) of the Document do not by this License give permission to use their names for publicity for or to assert or imply endorsement of any Modied Version.

5. COMBINING DOCUMENTS
You may combine the Document with other documents released under this License, under the terms dened in section 4 above for modied versions, provided that you include in the combination all of the Invariant Sections of all of the original documents, unmodied, and list them all as Invariant Sections of your combined work in its license notice, and that you preserve all their Warranty Disclaimers. The combined work need only contain one copy of this License, and multiple identical Invariant Sections may be replaced with a single copy. If there are multiple Invariant Sections with the same name but different contents, make the title of each such section unique by adding at the end of it, in parentheses, the name of the original author or publisher of that section if known, or else a unique number. Make the same adjustment to the section titles in the list of Invariant Sections in the license notice of the combined work. In the combination, you must combine any sections Entitled History in the various original documents, forming one section Entitled History; likewise combine any sections Entitled Acknowledgements, and any sections Entitled Dedications. You must delete all sections Entitled Endorsements.

6. COLLECTIONS OF DOCUMENTS
You may make a collection consisting of the Document and other documents released under this License, and replace the individual copies of this License in the various documents with a single copy that is included in the collection, provided that you follow the rules of this License for verbatim copying of each of the documents in all other respects.

122

Literaturverzeichnis You may extract a single document from such a collection, and distribute it individually under this License, provided you insert a copy of this License into the extracted document, and follow this License in all other respects regarding verbatim copying of that document.

7. AGGREGATION WITH INDEPENDENT WORKS


A compilation of the Document or its derivatives with other separate and independent documents or works, in or on a volume of a storage or distribution medium, is called an aggregate if the copyright resulting from the compilation is not used to limit the legal rights of the compilations users beyond what the individual works permit. When the Document is included in an aggregate, this License does not apply to the other works in the aggregate which are not themselves derivative works of the Document. If the Cover Text requirement of section 3 is applicable to these copies of the Document, then if the Document is less than one half of the entire aggregate, the Documents Cover Texts may be placed on covers that bracket the Document within the aggregate, or the electronic equivalent of covers if the Document is in electronic form. Otherwise they must appear on printed covers that bracket the whole aggregate.

8. TRANSLATION
Translation is considered a kind of modication, so you may distribute translations of the Document under the terms of section 4. Replacing Invariant Sections with translations requires special permission from their copyright holders, but you may include translations of some or all Invariant Sections in addition to the original versions of these Invariant Sections. You may include a translation of this License, and all the license notices in the Document, and any Warranty Disclaimers, provided that you also include the original English version of this License and the original versions of those notices and disclaimers. In case of a disagreement between the translation and the original version of this License or a notice or disclaimer, the original version will prevail. If a section in the Document is Entitled Acknowledgements, Dedications, or History, the requirement (section 4) to Preserve its Title (section 1) will typically require changing the actual title.

9. TERMINATION
You may not copy, modify, sublicense, or distribute the Document except as expressly provided for under this License. Any other attempt to copy, modify, sublicense or distribute the Document is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance.

10. FUTURE REVISIONS OF THIS LICENSE

123

Literaturverzeichnis The Free Software Foundation may publish new, revised versions of the GNU Free Documentation License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. See http://www.gnu.org/copyleft/. Each version of the License is given a distinguishing version number. If the Document species that a particular numbered version of this License or any later version applies to it, you have the option of following the terms and conditions either of that specied version or of any later version that has been published (not as a draft) by the Free Software Foundation. If the Document does not specify a version number of this License, you may choose any version ever published (not as a draft) by the Free Software Foundation.

ADDENDUM: How to use this License for your documents


To use this License in a document you have written, include a copy of the License in the document and put the following copyright and license notices just after the title page:

Copyright c YEAR YOUR NAME. Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.2 or any later version published by the Free Software Foundation; with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. A copy of the license is included in the section entitled GNU Free Documentation License.

If you have Invariant Sections, Front-Cover Texts and Back-Cover Texts, replace the with . . . Texts. line with this:

with the Invariant Sections being LIST THEIR TITLES, with the Front-Cover Texts being LIST, and with the Back-Cover Texts being LIST.

If you have Invariant Sections without Cover Texts, or some other combination of the three, merge those two alternatives to suit the situation. If your document contains nontrivial examples of program code, we recommend releasing these examples in parallel under your choice of free software license, such as the GNU General Public License, to permit their use in free software.

124

You might also like