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 gewährt, dieses Dokument zu kopieren, zu verteilen und/oder zu modifizieren, unter den Bestimmungen der GNU Free Documentation License, Version 1.2 oder jede spätere Version, veröffentlicht von der Free Software Foundation; mit keinen unveränderlichen 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”.

2

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 . . . . . . . . . . . . . . . . . . Parameterübergabe per Wert . . . . . . . . . . Parameterübergabe per Referenz . . . . . . . . Parameterübergabe 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 zerstören . . . . . . 2.3.3 Was sollte man unterlassen . . . . . . . . . . . Erzeugung von Speicherleichen (Memoryleaks) 3 Grundlagen Datenbank 3.1 Datenbanken . . . . . . . . . . . . . . . . 3.1.1 Einführung 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

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

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

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

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

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

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

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

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

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

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

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

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

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

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

3

. . .1. . . . . . . . . . . . . . . .4 Installation . . . . . . . . . . . . . . . . . . .1 Entwicklungsumgebung . . . . . . . . . . 4. . .1. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .2. . . . . . . . . . DCL Datenkontrollsprache . . . .2. . . . DDL Datendefinitionssprache . . . . . . .Inhaltsverzeichnis Desktop und Client-Server Datenbankarten Relationale Datenbanken . . . . . . . . . . . .4 4 Installation 4. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .4 Erstellen der Crosscompiling-Umgebung Anpassung der fpc. . . . . . . . .5 Wine . . . . . . . . . . DebugLn . . . . . . . . . . 4. . . . . . . . . . . . . . . . Abhängigkeiten von Lazarus . . .1. . . . . . . . . . . . . . . . . . .1. . . . . . . . . . . . . . . . . . . . . . . . .6 Eyecandy . 5. . . . . . . . . .1 Vorbereitung . . . . . . . . . . . . . . .2 3. . . . . . . . . . . . . Beispiele zu UPDATE . .2 Download . . . . .2. . . . . . . . . . Beispiel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . SELECT . . . . . . . . . . . .1. . . . . . . . . . . . . . . . . .1. . . . . . . FPC-Quellen . . . 4. . . . . . 4. . . . . . . . . 4. . . . . . . . . . . . . . . . . . . . 4. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .3 Installation von Lazarus aus dem SVN . . . . . . . . . . . . . . . . . . . . . . .1. 4 . . . . . . . . . . . . . . . . .2. 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.2 Linux Debian Etch Snapshotinstallation . .2. . . . . . Beispiele zu SELECT . . . . . . . . . . . . . . . . . Beispiele zu INSERT .1. . . .1. . . . . . . . . . . . 4. . . . . . . . . . . . . . . . .2 Fehlersuche . . . . . . . 4. . . . DML Datenveränderungssprache . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Beschreibung .GTK2 . . INSERT .1 Tastenkombinationen 5. . . . . . . . . . . . . . . . . . . . . . .3 Projektschablonen . . . . . . . . . . Heap Trace . . . . . . . . . . . . Grunddaten . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .2 Systemvorbereitung für Lazarus . . . . . . . . 5. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4. Programme in WINE ausführen . . . . . . . . . . . . . . Beispiele zu DELETE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .3 3. . . . . . . . . . . . . 4. . . . . . . . . . . . . . . . . . . . . . . . . . . .2. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Subversion . . . . . . . . . . . . .1. . . . . . . . . . . . . . . . . . . . . . . .1. .1 Installation von Freepascal 2. . . . . 4. . . 5 Lazarus IDE 5. . . . . .1. . . . . . . . .0 . . . . . . . . . . . . DELETE . . . . . . . . UPDATE . . . . . . . . . . . . . . .cfg . . . . .3 Umwandeln RPM -> DEB . . . . . . . . . . . . . . .1 Linux openSUSE Erweiterte Lazarusinstallation . 4. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .5 Ausführung . . . . . . . .

. .1. . . . . . . . . . . . . . . . . . . . . . . . . . . . Role . . . . . . . . . . . . . . . . . . . . . . . . . . HostName . . . . . . CharSet . . . . . . . . . . . . . . . . . .Inhaltsverzeichnis 6 Codebeispiele & FAQ 6. . . . . . . . . . . . . . . . . . . . . . . . . . Debbuging von SQLdb . . . . . . Schrift auf einen Label ändert sich nicht . . . . . . . . . . . . . . . . . . . . . . . . . Open oder ExecSQL . . . . . . . . . . . . . . 7. . . . . . . . . . . . . . . .4 TMySQL41Connection . . . . . . . . .1 FAQ . . KeepConnection . . . . . . . . . . . . Active. . . . . . . . . .6 TOracleConnection . . . . . . . . . . . Close . . . . . . . . StreamedConnected . . . . Params . .1. . DatabaseName . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .Serverdatenbank Komponenten . . . . . . . . . . . . . . . . .1 Beschreibung . . . . . . . . . GetFieldNames . . . . . . . . . . . . . . . . . . . . . .1. . . . . . . . . . . . . . . . . . . . . . . . . . Zugriff auf Parameter . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .3 TMySQL50Connection . Password . . . . . . . . . Open . . . . . . . . . . . . . . . . . . . . . . . . . . . . 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 . .1. . . . . . . . . . . . . . . . . . . . . . 7 Bibliotheken 7. . . . . . . . . . Was ist BOF und EOF . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7. . . . . . . . .5 TMySQL40Connection . . . . . . .2 TxxxConnection . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 . . . . . . Einleitung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .1. . . . . .1 SQLdb . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7. . . . . . . . . . . . . . .1. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . aber wo ? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . GetProcedureNames . . . . . . . . . . . . . . . . . . . . . . . Transaction . . . . UserName . . . . . . . . . . . . . . . 7. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7. . . . . . . . . . .1 Oberfläche . . . . . . . . . . . . . . .1. . . . . StartTransaction . . . . . . . . . . . . . . LoginPrompt . . . . . Anzahl der Datensätze abfragen . . . . . . . . . . EndTransaction . . . . Navigieren durch eine Datenmenge . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Schlüsselfelder . . . . . . . . . . . . . . . . . ExecuteDirect . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Wie kommen die geänderten Daten in die Datenbank Filtern. . . Zugriff auf Felder . . . . . . . . . . . . . . . . . . . . . . . . . . . . Connected . . . . . . . . . . . . . . . . . . . . . . . . . . 6. . . . . . . GetTableNames . . . . . . . . . .

. . . . . . . . . . . . . . . . Close . . . . . . . .9 TPQConnection . . . . . . . . . . . . . . .1. . . . . . . . . . . . . . . . . Allgemeines . Commit . . . . . . . . . . . . . . . . . . TSQLTransaction . . Prepared . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ReadOnly . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ServerFiltered . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Prepare . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Unprepare . . . Active . . . . . . . . . . . . . . . . . . . . . . . . . RollbackRetaining . . Params . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . StartTransaction . IsEmpty . . . . . . . . . . . . . . . . . . . . . . ServerFilter . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .1. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Filtered . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Eigenschaften von TSQLQuery . . .1. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Open . . . . . . . . . . . . . . . Filter . . . . . . . . . . . . . . . . . . Methoden von TSQLQuery . . . . . . . . . . . . . . . . . . . . . . .7 7. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . DataSource . . . . . . . . . . . . . . . .8 7. . . . . . . . . . . . . . . . . . . . . . . . . . InsertSQL. . . . . . . . . . . . . RecordCount . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ParseSQL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . UpdateStatus . . . . . . 7. . . . . . . . StatementType . . . . . . . . . Database . . . . . . . . . . . . . . . . UpdateSQL. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . CommitRetaining . . . . . . . . . . .Inhaltsverzeichnis 7. . . . . . . . . . . . . . DeleteSQL Transaction . . . . . . . . . . . . . . . . . . . . . . . . . SetSchemaInfo . . . . . . . . . . . . . . . . . . . . . . . . . . Locate . . . . . . . . . . . . . . . .1. . Params . . . . . . . . . . . . . ApplyUpdates . . . . . UpdateMode . . . . . . . . . . . . . . . Database . . . . . . . . . . . . . . . . . . . TODBCConnection . . . . . . . . . . . . . . . . . . . . . . . Rollback . . . . FilterOptions . SQL. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .10 TSQLQuery . . . . . . . . . . . . . . . . . . . . . . . . . . . . . EndTransaction . . . . . . . . . . . . . . . . CancelUpdates . . . . . . . . ExecSQL . . . . . . . . . . . . . . . . . . . 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 6 . . . Action . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Active . ExecProcessEx . . . . . . . . . . . . . . . . . . 7. . . . . . . . . . . Einleitung . . . . . . . 7. . . . . . . . . . . . . . . 7. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . GetMainIconHandle . . . . . SQL . . . . . . . DateTimeToHourString . . . . . . . . . . Data Access . . . . . . . ValidateFileDir . . . . . . . . . SizeToText . . . . . . . 7. . . . . . . . . . . . . . . . . ValidateFileName . . . . . DateTimeToIndustrialTime . . . . . . . . . . . . . . . . . . . . . . .2 Code . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7. . . . . . . . . . . . . . utils. . . . . . . . . . . . . . . . . . . . . . . . .2. . . . . . . .2. . . . . . . . .Inhaltsverzeichnis UsePrimaryKeyAsKey . . . . HexToBin . . . . . . . . . . .2. . . . . . . . .2. . . . . . . . . . . . . . . . . . . . . LoadLanguage . . . . . . . . . . . . . . .1 Beschreibung . 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. . . . . . . . . . . CanWriteToProgramDir . . . . . . . . . . . . . . . . . . . . . . . . . . . SaveOnClose . . . . . . . . . . . . . . . . . . .3 SDF . . . . . . . . . 7. . . . . . . . . . . . . . . . . .5 TDBF . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .7 SQLite . . . . . . . . . . . . ExecSQL . . . . . . . . . . . . . . . . . . . . . . IsNumeric . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ApplyUpdates . . . . . . . . . . . . . . . . . . GetTempPath . . . . . . . . . . . . . . . . . . . . . .2. . . . . . . . . . . . . . . . . . . . . . . . . . . . .4. . . . . . . . . . . . . . . . . . . . . . . . . . . . .4 FIXED . . . . . . . . . . . . . . InstallExt . . . . . DrawText .4 7 . . . . . . . . . . . . .pas . . . . . . . . . . . . . . . . . . . . . . 7. . . . .3. . . . . . . . . ValidateDate . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . GetGlobalConfigDir . . . . . . . lNet Leightweight NETworking Library . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .2 TDatasource . . SaveOnRefetch . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .2 Installation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7. . 7. . . . . . . . . OpenBrowser . . . . . . . . . . . . . . GetConfigDir . . . . . . . . . . . . . . . . .6 MEM . . . . . . . . . . . . . . . . .3. . . . . . . . . . . . . . . . . . . . . . . . . . . Einleitung . . . . . . . . . . . . . . . . . . . . . .Clientdatenbank Komponenten 7. . . . . . . . . . . . . . . . . . . . . . . . . . . . ExecSQL . . . . . . . . . . . . . . . ClearDir . . . . . . . . . . . . . . . . . . . . . . . . . . . . .2. . . . .4. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .2 7. . . . . . . . . . . . . . .3 7. . . . . . . . . . . HTTPEncode . . . . . . . . . . . . . . . . . . . . . . . .2. . . . . . . . . . . . .1 Beschreibung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7. . . . . . . . . . . . . . . . . . .1 Beschreibung .

. . . .2 Tool Versionenselektierer . . . . . . . . . . . . . . . . . . . GetProcessforExtension . . . . . . . . .pas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 115 10. . . . . . . . 7. . . . . . . . . . . . . . . . FoxPro . . 9 Programme 9. . . . . . . . . . . . . . . . . 7. . . . . . . . . . . . . . . . . . . . . . . . . . . . 9. . . . . . . . . . .1. . .2 Typendefinitionen . . . . . . . . . . . . . . . . . . . . . 8. . . . . . . . . . . . . . . . . . . . . StripHTML . . . . . . . . . . . . ExecVisualProcess . . . . . . .2 Datenbanken SQLite 3. . . . .1 Datenbanken MySQL 5. .1. . . . . . . . . . . . . . . . . . 7. . . . . . . . . . 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. . . . . . . . . . . . . . . . . . . . . . . . . . RPos . . . . . . . . . . . . 8. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9. . . .x . . . . . . . . 8. . . . . . . . . . . . . . . . . . . . 8. . . . . . . .5. . . . . . . . . . . . .1 Demodatenbank MySQL . StrTimeToValue . . .x . . . . . . . . . . . . . . GetSystemLang . . . . . . . .3 Datenbanken DBase. . . . . . . . . . . . TimeTotext . . . . . . . .1 Versionskontrolle . . . . . . . . .2 GNU Free Documentation License . . . . 8. . . . . . . . . . 10 Anhang 115 10.1 Tabellenverzeichnis . . . .x . . . . ExecProcess . . . . . . . . . . . . . . . . . Was macht das Tool eigentlich? Konfiguration . . . . . . . . . . . . . . . . . . . . . . .3 Projekt MySQLTestData . . . . . . . . . . . . . . . .4 Beispiel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .2 Projekt MySQLSimple . . . . . . .1. . . . . SystemUserName . SearchFile Variante 2 . . . . . . . . . . . . . .5. . . . . . . . . . . . . . . . . . 118 GNU Free Documentation License 118 1. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .5. .3 Code . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Erstellung der DEMO Datenbank Windows FAQ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .5 8 Beispiele 8. . . . . 118 8 . . . . .1 Nützliche Werkzeuge . . . . . . . . . . . . . . . . . . . . . . . APPLICABILITY AND DEFINITIONS . .5. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .1. . . . . . . . . . . . . . . . . . . . . . . . . . . SearchFile Variante 1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Installieren von MySQL 5. . . . . . . . . . GetMimeTypeforExtension . . . . . . . .1 Beschreibung . . . . . . . . . . . 7. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .1. . . . . . . . . . . . . . . . . . . . . . . uFileMisc. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . svn Kommandozeile . . . . . . . . . . .Inhaltsverzeichnis RoundTo . . .

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

10 . beim Schreiben dieses Buches.1 Danksagung Meiner Frau Vor allen möchte ich meiner Frau danken.1 Vorwort 1. Für ihre schier endlose Geduld mit mir.

Die Ereignisroutine „Button1Click“ wird durch ein Doppelklicken auf den Button automatisch von Lazarus erzeugt. Und zwar werden Anweisungen immer von links nach rechts und von oben nach unten durchgeführt.. Zusätzlich bilden die Schleife repeat . end auch automatisch einen Block. end.1 Anweisungen Einleitung Ein Programm besteht aus einer Reihe von Anweisungen1 . begin .. Das folgende Beispiel demonstriert wie es richtig ist. until und die Verzweigung case . Dieser Block wird mit begin eingeleitet und mit end abgeschlossen. begin Anweisung1. Anweisungen werden immer mit einem Strichpunkt2 abgeschlossen. Die Anweisungen zwischen begin und end werden wie eine einzelne Anweisung betrachtet. Das wird dann bei Schleifen und Verzweigungen verwendet. denn der zweite Block befindet sich komplett innerhalb des ersten Blockes. Schleifen Vorbereitung Bei den hier verwendeten Beispielen handelt es sich um ein neu erstelltes grafisches Projekt mit einem Formular mit dem Namen „TestForm“ und einem darauf plazierten Button mit dem klingenden Namen „Button1“. begin AnweisungA. die Blockgrenzen dürfen sich aber nicht schneiden. Blöcke können verschaltelt werden. Anweisungen Block 1... 1 2 Englisch: Statement Semikolon „. Anweisungen .. Um diesen Ablauf zu durchbrechen gibt es zusätzlich auch noch Verzeigungen und Schleifen. 2..Stufe. Ausnahmen sind unmittelbar vor einem Blockende und am Ende einer Unit . Daher schliesst end immer das letzte begin ein.“ 11 ...1 Anweisungen. Block Bildung Anweisungen werden immer in Blöcken zusammengefasst.. Verzweigungen. Anweisung2.dort wird ein Punkt gesetzt.....2 Lazarus Pascal 2. Diese werden zur Laufzeit nacheinander ausgeführt. .1..

.. die boolsch3 sein muß. AnweisungB.. .Button1Click(Sender: TObject). da die Anweisung einfach übersprungen wird.Stufe.. 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 . end. dass die Bedingung wahr ist. dass es nicht so ist. den Wert true angenommen hat. wird abgeprüft ob eine Bedingung.Stufe. if i=1 then showmessage(’Geht nicht’). als auch den Fall.keine Strichpunkt notwendig end. 2.2 Lazarus Pascal . var i : integer. procedure TTestForm.. Bedingte Verzweigungen Bei den bedingten Verzweigungen wird eine Bedingung als Entscheidung genommen. var i : integer..keine Strichpunkt notwendig end. begin i := 0.. AnweisungC <. Wenn nicht so wird die Anweisung nicht durchgeführt. Anweisungen Block 1. Wenn man sowohl den Fall behandeln will.Button1Click(Sender: TObject). Anweisung4. Anweisung5 <. Anweisung3. wohin sich der Programmablauf verzweigt. Im folgenden Beispiel kann die Bedingung nie Wahr4 werden und somit wird die Hinweisbox5 nie am Bildschirm angezeigt. kann man die if Bedingung then Anweisung1 else Anweisung Verzweigung nehmen.1.. procedure TTestForm. begin i := 0. Anweisungen Block 2. if then else Bei if Bedingung then Anweisung. if i=1 then showmessage(’Geht nicht’) else showmessage(’Geht doch’) end.2 Verzweigungen Einleitung Verzweigungen dienen zum Unterbrechen des geradlinigen Ablaufes und zum Treffen von Entscheidungen.

Will man mehere Werte von„i“ abprüfen so muß man die Verzweigungen entsprechend verschachteln.Button1Click(Sender: TObject). 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’). 1 : showmessage(’i=1’). Integer. bewirkt das die Abarbeitung der Befehle an der Stelle weitergeführt wird. procedure TTestForm. Es gibt im folgenden eine einfachere Art solche Verzweigungen zu behandeln. end. Char siehe auch Kapitel Datentypen 13 . mit nachgestellter Sprungmarke. Das heisst die Sprünge müssen sich innerhalb derselben Prozedur oder 6 Byte.2 Lazarus Pascal Hier wird dann im else Zweig der Bedingung die Hinweisbox mit dem Text „Geht doch“ angezeigt. case i of 0 : showmessage(’i=0’). begin i := 2. wo sich die Sprungmarke befindet. procedure TTestForm. case Bei case wird ein so gennanter Selektor eingesetzt. ob die Variable „i“ gleich 1 ist oder nicht. welcher Zweig genommen wird. var i : integer. Word. Der Selektor darf aber nur ein ordinaler Typ6 sein. alles andere wird als unbekannt bewertet. Der Befehl kann nur lokal springen. else showmessage(’Wert unbekannt’) end. so ist es mit Hilfe des obigen Beispiels möglich das case nachzubauen. var i : integer. 2 : showmessage(’i=2’). Bis jetzt konnte das Beispiel nur unterscheiden.Button1Click(Sender: TObject). anhand dessen entschieden wird. Unbedingte Verzweigungen goto und label Der Befehl goto . wenn aber die case Verzweigung nicht verwendet werden kann. end.. Im folgend Beispiel prüfen wir die Zahlen von null bis zwei ab.

end. 2. kann man sich den Funktionsumfang den Lazarus hat.. dieses Label dient als Sprungmarke.. label hier. begin i := 3.1. 1 : showmessage(’i=1’). 2 : showmessage(’i=2’)..Button1Click(Sender: TObject). wobei die Sprungmarke unmittelbar vor dem letzen end sich befindet. procedure TTestForm. else showmessage(’Wert unbekannt’) end. In dem Beispiel wird die case Anweisung nicht bearbeitet. Es ist vergleichbar mit einem Goto. selbst erweitern. var i : integer.2 Lazarus Pascal Funktion bewegen. wirkt dort nur auf den lokalen Block 14 .. . . Eine Verbesserung muss nicht an etlichen Stellen im Code durchgeführt werden. solange „i“ den Wert drei hat. case i of 0 : showmessage(’i=0’). das sind Prozeduren und Funktionen. procedure TTestForm. 7 Wird bei Schleifen auch verwendet. Der Code liegt an einer Stelle. ohne das nachfolgende Befehle abgearbeitet werden. if i=3 then exit.Button1Click(Sender: TObject).3 Prozeduren und Funktionen Einleitung Durch das Schreiben von Routinen.. bevor es innerhalb der Prozedure oder Funktion verwendet werden kann. zusammenzufassen und an einer Stelle zu warten. end. goto hier. In einigen Fällen kann er die Lesbarkeit und Funktion von Programmenteilen erhöhen. begin i := 2.. hier: i := 3. Im Normalfall wird der Befehl nicht benötigt. So kann man auch keine Stellen zu ändern vergessen. Exit Exit7 bewirkt das die aktuelle Funktion oder Prozedure beendet wird. Das Wesen von Routinen ist. Es muß ein Label deklariert werden. Es ist wird so der Quelltext auch leichter lesbar und vor allem wird der Code auch leichter zu warten. Anweisungen die immer wieder in fast gleicher Weise verwendet werden. var i : integer.

procedure MyHinweisBox(a:integer).Button1Click(Sender: TObject).. bis auf die Tatsache. Das Beispiel ist gleich zum obigen.erg : integer. 15 .b : integer):integer. Prozeduren Prozeduren sind eine Sonderform der Funktion. mit dem Unterschied. Der automatisch erstellen Variable result übergeben wir den Wert der Berechnung. begin result := a + b end. können wir jetzt unsere Anweisungen hineinschreiben. Sie sind komplett gleich. Zusätzlich gibt die Funktion einen (aber nur einen!) Wert zurück. das eine Prozedure kein Ergebnis zurückliefert. showmessage(’Ergebnis=’ + IntToStr(erg)) end. var i1. function MyFunction(a.i2.2 Lazarus Pascal Funktionen Funktionen sind in Blöcken zusammengefasste und gekapselte Ansammlungen von Anweisungen..b : integer):integer. i2 := 3. function MyFunction(a. Dazu definieren wir den Funktionskopf. Beim Aufruf der Funktion übergeben wir die Parameter „i1“. In der nächsten Zeile wird der Wert der Variablen „erg“ in eine Zeichkette umgewandelt und in einer Hinweisbox ausgegeben. erg := MyFunction(i1. das die Ausgabe in die Hinweisbox jetzt über eine Prozedure abläuft. dass die Funktion ein Ergebnis auch vom Typ Integer zurückgibt. end Block.„i2“ und das Ergebnis speichern wir in der Variablen „erg“ ab. Sie kann somit im Programm wie eine Variable verwendet werden. In den die Funktion begrenzenden begin . begin result := a + b end. begin showmessage(’Ergebnis=’ + IntToStr(a)) end. Die Variablenliste mit den Parametern „a“ und „b“ definieren wir von Typ Integer und zusätzlich.i2). Im folgenden Beispiel schreiben wir eine Funktion mit dem Namen „MyFunction“ die zwei Zahlen addieren soll. begin i1 := 2. procedure TTestForm.

Button1Click(Sender: TObject).erg : integer. begin // . ansonsten durch einen Strichpunkt getrennt.12.2 Lazarus Pascal procedure TTestForm. end. einige sinnvolle Anweisungen end.Button1Click(Sender: TObject). MyHinweisBox(erg) end.5). Bei der Definition werden gleichartige Parameter durch einen Beistrich.. 16 . showmessage(’Wert in MyProc ist ’ + IntToStr(param1)).Button1Click(Sender: TObject). param3 : single).Anzeige ist 6 end. Die Reihenfolge der Parameter ist bindend. In den bisherigen Beispielen zu Funktionen und Parameter ist nur die Richtung in die Funktion oder Parameter betrachtet worden. Parameterliste Die Parameter dienen dazu.param2 : integer. //<-. i2 := 3. procedure MyProc(param1. Ä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.i2. var iWert : integer. um Daten in die Funktion bzw. erg := MyFunction(i1... Prozedure zu übertragen und auch in der anderen Richtung von diesen zu erhalten.i2). procedure TTestForm. procedure TTestForm. var i1. procedure MyProc(param1: integer).. Beim Aufruf werden die Parameter einfach durch Beistriche getrennt angegeben.30. begin // . begin MyProc(11. so wird der Inhalt des übergebenen Wertes kopiert und diese Kopie der Funktion oder Prozedur zur Verfügung gestellt. begin i1 := 2. einige sinnvolle Anweisungen param1 := param1 + 5. Parameterübergabe per Wert Wenn der Parameter als Wert übergeben wird.

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

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

text := ToString(11.Text:= ToString(true). begin edit1.2 Lazarus Pascal edit1. end. procedure TForm1. end. begin edit1.text := ToString(10). Version: $LastChangedRevision: $ 9 9 Autor: Andreas Frieß Lizenz: GFDL 19 .Button3Click(Sender: TObject).01).Button2Click(Sender: TObject). procedure TForm1. end.

co_str := ’Ein anderer String’. or.2 Variablen. { Character Typen Konstante } co_str = ’Irgend ein String’. 2. mod. Normale Konstanten Die Deklaration von Konstanten ist nur für Ordinale-. const co_char : char = ’A’. ord. Die folgenden Operatoren können immer verwendet werden „.2. Anders als bei normalen Konstanten kann ihnen zur Laufzeit ein neuer Wert zugewiesen werden. pi. Im Gegensatz zu normalen Variablen. co_ls_real = SizeOf(co_real). Eine Zuweisung10 an die Konstante ist nicht möglich. not. Konstanten. 10 Nur mit typisierten Konstanten möglich 20 . Das heisst das sehr viele Funktionen die nur zur Laufzeit zur Verfügung stehen nicht verwendet werden können. Die Fehlermeldung resultiert daher.{Character Typen Konstante} co_str : string = ’Irgendein String’. and. den Term aufzulösen. frac. /. Datentypen Ein großer Teil der hier verwendeten Definitionen und Texte stammen aus dem ’Language Reference Guide[FPCLangRef]’.{String Typen Konstante} Somit ist das gültiger Code. trunc. aber keine Variable.1 Konstanten Bei Konstanten muß der Compiler zur Kompilierzeit fähig sein. Char. Es handelt sich hier nicht um eine exakte Übersetzung. Reale-. wird ihr Wert initialisiert wenn das Programm startet. round.+. das zwar eine Konstante mit dem Namen existiert. Das ist bei normalen Konstanten nicht erlaubt und wird mit der Fehlermeldung xxx. sondern um eine für dieses Buch angepasste Form. odd“. chr. const co_real = 3. -. Typisierte Konstanten Typisierte Konstanten sind ein Weg um das Programm mit initialisierten Variablen zu versorgen.14.pas(47. *. wo der Programmierer sich um die Initialisierung selbst kümmern muß. { Reale Typen Konstante } co_int = 25.11) Error: Variable identifier expected quittiert. {String Typen Konstante} co_ls = SizeOf(Longint). div. int. { Integer Typen Konstante } co_char = ’A’.2 Lazarus Pascal 2. sizeof.und Stringtypen erlaubt.

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 müssen 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 spezifiziert sein und zwar in der Form: Feldname, Doppelpunkt, Werte getrennt durch Strichpunkt und das ganze von runden Klammern umschlossen. Die Felder müssen in der Reihenfolge in der Deklaration verwendet werden, ansonsten gibt es eine Compilerfehlermeldung xxx.pas(47,11) Error: Some fields coming before "Y"weren’t initialized Resourcen Strings Sie verhalten sich Grundlegend wie normale Konstanten, es ist aber nur der Typ Strings zugelassen. Zusätzlich 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 für 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 können Strings für 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 befindet, ist vom Ort der Deklaration abhängig. Globale Variablen Sind Variablen die innerhalb einer Unit oder Programmes definiert sind, aber NICHT innerhalb von Prozeduren oder Funktionen. Diese werden auf fixen Speicherbereichen gelegt und sind während der ganzen Programmbearbeitung verfügbar. Lokale Variablen Sind innerhalb von Prozeduren oder Funktionen definiert. Sie werden auf den Stack, daher nicht auf einen fixen 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 müssen extra deklariert werden, wenn sie gebraucht werden. Es wird solange kein Speicherbereich zur Verfügung 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 für Informationen zum Thema. Ich bin leider noch nicht soweit.

2.2.3 Initialisierung
Variablen, wie auch andere Indentifizierer gehorchen den generellen Regeln der Gültigkeit. Zusätzlich 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 ausgeführt wird. Man beachte, dass das Verhalten von lokal initialisierten Variablen ein anderes ist, als von lokal definierten Konstanten. Eine lokal definierte Konstante verhält sich wie eine global initialisierte Variable. Welche Variablen werden überhaupt, wie initialisiert ? AnsiString teilweise Der Platz für den Pointer wird erstellt und mit nil vorbelegt. Gültig nur für globale und lokale AnsiStrings, die ein Teil einer Struktur sind (Statische Arrays, Records und Objekte). Typisierte Konstanten Verhält sich wie eine Globale initialisierte Konstante, wird einmalig initialisiert wenn des Programm startet, auch wenn sie sich Lokal in einer Prozedur oder Funktion befindet.

11

Für den Programmierer nicht sichtbar, im Hintergrund

22

2 Lazarus Pascal Es werden die meisten Variablen aus Geschwindigkeitsgründen 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. Befindet sich der Code in einer Prozedur oder Funktion, die in einer Schleife aufgerufen wird, so kann der Zeitaufwand dafür erheblich werden.

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

12

Originalautor: Michaël Van Canneyt, Lizenz: free Übersetzung und Bearbeitung: Andreas Frieß

23

Mittels der Klassendefinition class(TParentObject)definieren wir ein Objekt mit dem Namen TMyGreatObject. eine gute Frage.3. aber kann weder Aktionen durchführen. Das heißt alles was das Elternobjekt kann oder hat. override.3 Objekte 2. override. Mit diesen Zeilen kann mal ein grundlegendes Objekt definieren. weiters beinhaltet es Daten zum Verwalten seiner Zustände. var aMyGreatObject : TMyGreatObject. procedure SetWert(const AValue: integer). property Wert : integer read GetWert write SetWert. Aktionen etc. Ein Objekt hat Eigenschaften und kann Aktionen durchführen. das alle Eigenschaften.1 Was ist ein Objekt Was ist ein Objekt. procedure SetIsValid(const AValue: Boolean). { TMyGreatObject } TMyGreatObject = class(TParentObject) private FIsValid: Boolean. vom Elternobjekt erbt. destructor Destroy. noch hat es Eigenschaften. public constructor Create. TMyObject = class end. Außerdem muß das Objekt auch einen Namen besitzen. Es hat einen Namen. public und published wird die Sichtbarkeit der Eigenschaften und Aktionen definiert. aber es ist das minimalste Beispiel. protected function GetWert: integer. hat unser Objekt auch. protected. In unseren Fall hat das Objekt den Namen „TMyObject“. Wie definieren wir ein Objekt? Unter (Lazarus) Pascal verwenden wir dazu die Klassendefinition class. zusätzlich kann auch bei Kindobjekten auf die Eigenschaften und Aktionen zugegriffen werden 24 . published property IsValid : Boolean read FIsValid write SetIsValid. Durch die Deklarationen private. Nähern wir uns einmal dem Begriff indem wir ein Objekt beschreiben. Sehen wir uns jetzt eine volle Definition an.2 Lazarus Pascal 2. end. private Nur hier in dieser Deklaration kann auf diese Eigenschaften und Aktionen zugegriffen werden protected Wie private.

end. 13 14 Zum Setzen Zum Abfragen 15 Auch Getter und Setter genannt 16 manchmal kommen Namensabwandlungen vor 17 Variablen macht man normalerweise über Eigenschaften zugänglich 18 Aus dem Projekt: BspObjErzeug 25 . Generell ändert man den Wert einer Variablen nicht direkt. in diesem Fall eine Stringliste nicht in einem gebrauchsfähigen Zustand. end.3. Das setzt sich auch im protected Abschnitt fort. Memo1. Eigenschaften. Wie geht es also richtig.Add(’Eine Zeile’). Deshalb wird auch eine Anweisung wie aListe. Als Namen für die Prozeduren13 und Funktionen14 die interne Variablen ändern haben sich GetXXXX 15 und SetXXXX durchgesetzt. aListe. aListe. try aListe. reicht nicht aus. nicht aber das Objekt selbst! Zu diesem Zeitpunkt ist das Objekt.2 Lazarus Pascal public Auf die Eigenschaften und Aktionen kann immer zugegriffen werden published Wie public zusätzlich sind die Eigenschaften auch im Objektinspektor verfügbar Im private Teil ist eine Boolsche-Variable und eine Prozedur zum Ändern der Variablen definiert. entweder direkt in der Klasse oder in einem Vorfahren. Alle Objekte haben einen Konstruktor.Create nicht funktionieren und eine Exception auslösen.Create.2 Zur Laufzeit erzeugen und zerstören Gerade am Anfang erweist sich das richtige Erzeugen und Löschen von Objekten als Problem. procedure TForm1.Assign(aListe). Destruktoren (immer Destroy) und die von ausserhalb sichtbaren Variablen17 .Free.Add(’Eine zweite Zeile’). Im public Bereich sind die Konstruktoren (immer Create16 ). Denn die Zuweisung mittels var aListe : TStringList.Add(’Eine dritte Zeile’). var aListe : TStringList. den wir dann in unserer Variablen ablegen können. der aufgerufen werden kann und der das Objekt richtig erstellt und uns den richtigen Verweis zurück liefert. finally aListe. Damit wird nur der Platz für den Verweis auf das Objekt erzeugt. in der auch eventuell die nötigen Prüfungen oder Bearbeitungsschritte durchgeführt werden. der Verweis ist undefiniert (und zeigt ins Nirgendwo).Lines. Sehen wir uns den Beispielcode18 einmal von oben nach unten an. begin aListe := TStringList. 2. sondern verwendet eine Prozedur dazu.buObjektClick(Sender: TObject). Prozeduren und Funktionen.

Create.Lines. Obj2 := TObject.Free. Bei der Deklaration ist ja noch alles in Ordnung. Ôbj1.3 Was sollte man unterlassen Es gibt bei Klassen immer wieder Kode. Meistens wird der Gedanke aus einer vermeintlichen Abkürzung im Kode geboren. auch wenn innerhalb des try. Definieren einer Variable für den Verweis auf ein Objekt von Typ TStringlist aListe := TStringList.finally Blocks ein Fehler aufgetreten ist. Einfügen eines Strings in die Stringliste Memo1..3. Obj2 : TObject.Create.Create. Obj1 := TObject. Erzeugen des Objektes und initialisieren der Variablen mit dem Verweis aListe. er ist nicht Null oder nil. daß das Objekt sicher zerstört wird.2 sind nur Zeiger die im Moment auf irgendwas zeigen wenn man drauf zugreifen will gibt es eine Zugriffsverletzung (’Access violation’).. Freigeben des Objektes Stringliste durch aufruf von Free.Add(’Eine Zeile’). Der Inhalt zeigt jetzt auf kein gültiges Objekt mehr und enthält einen beliebigen Inhalt. Obj1 : TObject. hat man eine Leiche erschaffen.2 Lazarus Pascal var aListe : TStringList. den man besser nicht schreiben sollte. Ich werde hier versuchen Beispiele zu bringen...end eingegrenzte Anweisung wird in jedem Falle ausgeführt. Erzeugung von Speicherleichen (Memoryleaks) 19 Eine einfacher Weg um Speicherleichen zu erzeugen ist das ’wilde’ zuweisen von Klassen.end sichergestellt.Assign(aListe). Das zwischen dem finally. 19 Basierend auf Informationen von christian[11] im deutschen Lazarusforum 26 . jetzt zeigen unsere Zeiger auf die Objekte die erstellt wurden und die Objekte sind jetzt auch benutzbar. Nach dem Aufruf von Free ist der Inhalt der Variablen aListe nicht mehr definiert! Free ruft den Destruktor des Objektes auf. 2. weil das Objekt ja noch nicht erstellt wurde. Obj1 := Obj2. Füllen des Memos mit den Strings aus der Stringliste aListe aListe. Wenn man jetzt aus welchen Grund auch immer die folgende Zuweisung macht. meistens werden sie aus dem Forum stammen. Zusätzlich ist mit der Exceptionbehandlung try.finally.

Version: $LastChangedRevision: 59 $ 20 20 Autor: Andreas Frieß Lizenz: GFDL 27 . Obj2. Obj1 kann nie wieder benutzt werden.Free erzeugt jetzt eine Zugriffsverletzung. Somit kann Obj1 auch nicht mehr gelöscht und der Speicherplatz frei gegebnen werden.Free. Obj1. da ja in Wirklichkeit das Obj2 freigegeben wird und nicht das ursprüngliche Obj1 .das ist ja in Vergessenheit geraten. wie im folgenden Kode.2 Lazarus Pascal Mit dieser Zuweisung zeigen beide Zeiger auf Obj2. da das Objekt ja bereits freigegeben wurde und das ursprüngliche Obj1 ist eine Leiche (im Speicher-Keller). Das nachfolgende Obj2.Free wird anstandslos ausgeführt. da jegliche Referenzierung darauf verschwunden ist.Free. Das erste Obj1.

sollte man die verwendeten Begriffe möglichst genau definieren: • Eine Datenmenge ist eine Menge von einzelnen Datensätzen. • Eine Tabelle ist als Datenbankbestandteil eine spezielle Ausführung einer Datenmenge. Begriffe Um Missverständnisse auszuschließen und zu einer gemeinsamen Sprachregelung zu kommen. des Datenbankservers selbst. Wichtige Informationen bei der Entwicklung einer Datenbankanwendung sind das Verhalten der Datenbank bzw. die auf irgendeine Weise miteinander in Beziehung stehen. Um auf einen bestimmten Datensatz zu zugreifen.1. muss man an den Anfang der Datei (oder Bandes) gehen und anschließend alle Datensätze durchlaufen. beziehungsweise dient als Nachschlagwerk für die verschiedenen Begriffe. Die Herkunft dieser Datenmenge ist nicht festgelegt.1 Datenbanken 3. bis man den richtigen gefunden hat. In diesem Datei-Systemen wurden die Daten nacheinander abgespeichert. • Eine Datenbank ist eine Zusammenstellung von logisch zusammengehörigen Tabellen. die den Inhalt von tatsächlich vorhandenen Tabellen in einer frei wählbaren Anordnung abbildet.1 Einführung in die Datenbanktheorie Das Folgende Kapitel wendet sich speziell an den Personenkreis der in die Theorie von Datenbanken noch nicht so eingedrungen ist. das ein einfaches sortieren oder einfügen von Daten in eine 28 .3 Grundlagen Datenbank 3. die Sicherung und andere Verwaltungsdienste zur Verfügung. Was ist eine Datenbank Eine Datenbank ist eine geordnete Sammlung von Daten. Die ersten Generationen von Datenbanken waren sogenannte File-Systeme. Zuerst auf Band. • Ein Datenbankserver verwaltet verschiedene Datenbanken und stellt auch das Management. manchmal auch Projektion genannt. Man kann also bei entsprechenden Vorwissen die folgenden erklärenden Kapitel überspringen und bei Bedarf nachschlagen. • Eine Abfrage ist eine virtuelle Datenmenge. Die Tabelle speichert als physisches vorhandenes Element die Daten. Jeder Datensatz besteht aus mindesten einem Feld. dann auch auf Festplatten. Somit ist auch klar.

Auf die Daten kann immer nur ein Anwender. Bei der File-Share Datenbank müssen alle Datensätze geholt und bearbeitet werden. Client-Server Datenbank Bei Client-Server Datenbanken hat nur der Datenbankserver selbst direkten Zugriff auf die Dateien des Datenbestandes. der eine Benutzer öffnet die Datenbankdatei und vergisst auf das schließen des Programms. 29 .3 Grundlagen Datenbank sortierte Datenmenge enormen Aufwand und Kapazität erfordert hat. Man stelle sich nur vor. Desktop und Client-Server Datenbankarten Gerade der Begriff Netzwerkdatenbank ist sehr verwirrend. dementsprechend hoch ist die Belastung für das Netzwerk. Stand-Alone Datenbank Eine Stand-Alone Datenbank ist eine Desktop-Datenbank. Es ist zwar prinzipiell möglich über ein Netzwerk auf die Datenbankdatei zuzugreifen. Kein anderer Benutzer kann die Daten in der Zwischenzeit benutzen! File-Share Datenbank Moderne Netzwerke bieten die Möglichkeit. Für Abfragen muss der jeweilige ganze Datenbestand zu den Arbeitsplatzrechnern gebracht werden. zu inkonsistenz der Datenbeständen führen. Probleme die durch den gleichzeitigen Zugriff entstehen können daher gar nicht auftreten. (und durch neue. Gerade zur File-Share Datenbank können Netzbelastungen drastisch gesenkt werden. dass mehrer Anwender auf ein und dieselbe Datei zugreifen. Wird damit eine Access-Datenbank. es befinden sich daher die Daten auf dem Arbeitsplatzrechner. das man den größten Wert aus einer unsortierten Tabelle mit 1 Millionen Datensätze habe will. bei der Client Server Datenbank nur das Ergebnis. Die derzeit am meisten verwendeten Datenbanken sind die relationalen und im weiteren werde ich nur noch diese behandeln. die mehrere Benutzer über das Netzwerk verwenden so bezeichnet ? Oder eine Serverbasierende Datenbank? Die folgenden Erklärungen sollten die Begriffe klarer werden lassen. von diesem bearbeitet und die Ergebnisse an den Arbeitsplatzrechner zurückgeliefert. Das ganze hat jedoch (unter anderem) einen entscheidenden Nachteil: Die Datenverarbeitung erfolgt auf den Arbeitsplatzrechnern. Anfragen werden somit direkt an den Datenbankserver gestellt. schnellere und größere Festplatten ermöglicht) haben sich aus diesen System die heutigen relationalen oder objektorientierten Datenbanken entwickelt. Die Verwaltung beim gleichzeitigen Zugriff durch mehrer Arbeitsplatzrechner obliegt dem Datenbankserver. Auf diese Weise ist es auch möglich das mehrer Programme auf ein und dieselbe Datenbankdatei zugreifen. Um diesen Beschränkungen zu entfliehen. Diese Version der Desktop-Datenbank nennt man File-Share Datenbank und damit ist bereits ein echter Mehrbenutzer Betrieb möglich. Falls eine Verbindung durch eine Störung abbricht. aber es kann der eine nur in der Datenbank arbeiten. so wird dieses erkannt und die noch nicht kompletten Anfragen verworfen und somit die Konsistenz der Daten erhalten. wenn der andere sein Programm geschlossen hat. Weiter können auch Störungen am Netzwerk leicht zu Datenverlust bzw. Bei jeder etwas umfangreicheren Datenbank wird dieses Verhalten zu einem Engpass. Man stelle sich nur vor. Weitere Bereiche sind die Möglichkeit Backups zu erstellen während die Datenbank weiter in Verwendung ist. mit immer nur einem Programm zugreifen.

Warum dieser Umweg? Wenn man später Tabellen miteinander verknüpft (in Relation bringt). Attribut und Tuples Die Attribute sind die Spalten einer Relation (Tabelle). Habe ich vorher eine Domain definiert. [*]Der Anwender sieht keine Verweisstrukturen zwischen den Tabellen. [list] [*]Die Informationen werden einheitlich in Form von Tabellen repräsentiert. der Projektion und des JOIN definiert. folglich also unbekannt ist. die relationalen Datenbanken im strengeren Sinn definieren. so gibt es keine Probleme. Begriffe in relationalen Datenbanken Man kann nicht über relationale Datenbanken sprechen. die Tuples sind die Datensätze. das ist der Ausdehnungsgrad. NULL Ein „Nichtwert“ der anfangs immer für Verwirrung sorgt ist NULL. Eine Relation mit Degree Null macht keinen Sinn. Jedem Konferenzraum kann ein Beamer mit seiner Nummer zugeteilt werden. Weiter ist es kein Problem wenn man draufkommt das die „Nachnamen“ länger sind. NULL ist nicht gleich Null! Ein besserer Ausdruck wäre UNBEKANNT. Die Zahl der Tuples ist die Kardinalität. 30 . normalerweise sprechen Hersteller von relationalen Datenbanken. eine Domain Nachnamen vom Type „Zeichen mit Länge 20“ erstellen.3 Grundlagen Datenbank Relationale Datenbanken Der Begriff relationale Datenbank geht auf einen Artikel von E. wenn die Mehrheit der 12 Regeln eingehalten werden. da ja ein nicht vorhandener Beamer auch keine Nummer besitzt. Die Daten werden daher in Relationen gespeichert. in dem er die einstigen zwölf Regeln des relationalen Modells auf 333 Regeln differenziert. Codd zurück. Dadurch wird die Relationalität einer Datenbank bis ins letzte Detail festgeschrieben Soweit die Theorie. Ende 1990 veröffentlichte er ein Buch über relationale Datenbanken. Diese wird immer dann verwendet wenn man Datenspalten mit dem Type „Nachname“ erstellen muss. ohne zuvor einige Begriffe zu klären. F. eine Kardinalität von NULL Tuples hingegen ist eine leere Relation. Die Räume welche keinen Beamer besitzen (zuwenige Beamer vorhanden) bekommen als Wert NULL zugeteilt. Relationen Eine Relation ist gleich einer Tabelle. [/list] 1985 veröffentlichte Codd zwölf Regeln. Man kann z. so müssen die Spalten (Attribute) der gleichen Domain unterliegen. Codd bezeichnet Datenbanken als "minimal relational". [*]Es gibt mindestens die Operation der Selektion. NULL macht übrigens aus einer zweiwertigen Logik (Ja/Nein) eine dreiwertige (Ja/Nein/Unbekannt). Vorstellen kann man es sich am besten mit einem Beispiel. Degree und Kardinalität Die Zahl der Attribute einer Relation nennt man Degree. Domain Eine Domain ist ein Wertebereich. Würde ich beim händischen Editieren eine Spalte vergessen so würde die Datenbank nicht mehr korrekt arbeiten. wenn sie folgende Bedingungen erfüllen.B. der 1970 veröffentlich wurde. so kann die Definition der Domain geändert werden und alle Spalten haben die richtige Länge.

Fremdschlüssel (Foreign Key) Ist der Verweis in der Tabelle auf einen Primärschlüssel in einer anderen Tabelle. das Geschäftsmodell keine Normalisierung sinnvoll erscheinen lassen. verwendet. Vorsicht bei bestimmten Fällen.und Nachteile stark datenbankabhängig sind. oder der gewonnene Platz bzw. Gerade in relationalen Datenbanken gibt es sehr viele Verknüpfungen die auf Primär. auch Keys genannt.3 Grundlagen Datenbank Schlüssel Im Zuge der Normalisierung (welche später erklärt wird) werden die Daten auf viele Tabellen vereilt. ist aber nicht zwingend. wird die Technik des logischen Datenbankdesigns bezeichnet. Man kann zum Beispiel keine Datensätze aus der Personentabelle löschen. denn selbst Sozialversicherungsnummern müssen nicht eindeutig sein ! Sekundärschlüssel (Secundary Keys) Werden dafür verwendet um bei bestimmten Datenbankoperationen die Effizienz zu steigern. das Primär.und Fremdschlüssel) glaubhaft bleiben. da die Datensätze intern nicht ungeordnet sondern in sortierter Reihenfolge verwaltet werden. 31 . Es erfolgt meistens durch das Schrittweise optimieren der Datenbank zur Designzeit. die Rücksicht auf das verwendete Datenbanksystem und die damit zu erzielenden Performance. das in Teilbereichen sogar eine Denormalisierung aus Performancegründen nötig ist. sondern eine möglichst effiziente Komplettlösung für das Problem zu erhalten. da die Vor.und Fremdschlüssel der gleichen Domain unterliegen. solange in der Tabelle der Bestelllungen auf diese Personen verwiesen wird. Theoretiker haben insgesamt 5 Stufen der Normalisierung herausgearbeitet. Um dieses Tabellen wieder richtig in Relation zu bringen werden verschiedene Schlüssel. Normalform normalisiert? Bei der Anwendungsentwicklung besteht meistens nicht das Ziel. Wichtig ist. Dazu gehört natürlich auch.und Fremdschlüsselpaaren aufbauen. Es leuchtet jedem ein. wobei in der Praxis meist nur die ersten 3 Stufen verwendet werden. Meistens wird dafür eine fortlaufende Nummer verwendet. Warum wird meistens nur bis zur 3. Ausnahmen von dieser Regel gibt es nur bei „M:N Verknüpfungen“ für die Zwischentabellen verwendet werden (die meisten Datenbanksysteme können diese Verknüpfungen nicht direkt abbilden). Normalisierung Unter der Normalisierung einer Datenbank. Beim verwenden sollte aber immer auf die zugrunde liegende Datenbank Rücksicht genommen werden. Primärschlüssel (Primary Key) Jede Relation (Tabelle) besitzt einen Primärschlüssel um einen Datensatz eindeutig zu identifizieren. möglichst den exakten theoretische Grundlagen zu entsprechen. Somit kann es sein. das die Aufteilung der Informationen auf viele Tabellen bei einer Auswertung zu schlechteren Ergebnissen führt. Referentielle Integrität Die referentielle Integrität stellt sicher das die Daten zueinander (über Primär. ändern oder löschen ist zu verweigern wenn dadurch die Datenintegrität verletzt würde. Ein einfügen. Ein Primärschlüssel ist immer eindeutig und ohne Duplikate.

3 Grundlagen Datenbank Ausgangslage 1. Normalform Alle Informationen in einer Tabelle Jede Spalte einer Tabelle enthält unteilbare Informationen. Die Datensätze verwenden keine sich wiederholenden Informationen, die nicht auch zu einer separaten Gruppe zusammengefasst werden könnten Es wird die 1. Normalform eingehalten und alle Informationen in nicht Schlüsselfeldern hängen nur vom kompletten Primärschlüssel ab Es wird die 2 Normalform eingehalten und alle Informationen in den nicht Schlüsselfeldern sind untereinander nicht abhängig. Es wird die 3. Normalform eingehalten und in gleichen Tabellen sind keine unabhängigen Objekte vorhanden, zwischen denen eine m:n Beziehung bestehen könnte 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 für die tägliche Arbeit sind und während des täglichen 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 längeren Zeitraum benötigt werden. Sie bilden den Grundbestand an Daten für das Datenbanksystem und werden auch als Bestandsdaten bezeichnet. Stammdaten weisen eine geringe Änderungshäufigkeit auf. Üblicherweise ist bei der Neuanlage von Stammdaten noch nicht bekannt, wann Änderungen zu erwarten und wie lange die Daten insgesamt gültig sind. Da auf Stammdaten häufig zugegriffen wird, ist ihre aktuelle Pflege 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 für 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 gegenüber Stammdaten in der Menge mächtiger sind, ist gerade hier auf ein gutes Design zu achten. Betrachten wir es am Beispiel eines Zählers einer Station: Die Zähler werden im 10 Minutenrhythmus in die Bewegungsdaten eingefügt, das sind 144 Datensätze pro Tag, währenddessen der Stammdatenteil gleich bleibt, nämlich 1

2 Normalform

3 Normalform 4 Normalform

5 Normalform

32

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

1

1

Autor: Andreas Frieß Lizenz: GFDL

33

3 Grundlagen Datenbank

3.1.2 DDL Datendefinitionssprache
Die Datendefinitionssprache (Data Definition 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 Datenveränderungssprache
Die Datenveränderungssprache (Data Manipulation Language = DML3 ) umfasst die Sprachteile von Datenbanksprache, die sich mit dem Lesen, Ändern und Löschen von Daten beschäftigen. Es sind das die Befehle SELECT, INSERT, UPDATE und DELETE. Im folgend sehen wir uns die wichtigsten Befehle an, wobei ein Befehl besonders mächtig ist—SELECT—. SELECT SELECT ist einer der Vielseitigsten und am meisten eingesetzten Befehle überhaupt. Er dient zum Abfragen von Datenmengen aus der Datenbank. Er ermöglicht die Abfrage von Daten aus den Tabellen (die Projektion) Einfachste Darstellung wörter zu tun. Bei der einfachsten Abfrage haben wir es mit wenigen Schlüssel-

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 gewünschten 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 später in der rückgelieferten Datenmenge finden. 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 qualifizieren. Somit kann ein SELECT so aussehen: SELECT MyDB.STPerson.Vorname, meistens wird die verkürzte 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_Definition_Language siehe auch http://de.wikipedia.org/wiki/Data_Manipulation_Language

34

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

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

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

cVName as Vorname FROM st_person group by cVName desc having Anzahl = 16."Ruby" 15. cVName as Vorname FROM st_person group by cVName order by count(cVName) desc."Elizabeth" 16."Angel" 17.3 Grundlagen Datenbank 16. Beim einfachen Einfügen haben wir es mit wenigen Schlüsselwörter INSERT ’Ziel’ (’Spaltenliste’) VALUES (’Werteliste’) Bei dem Ziel handelt es sich um die Tabelle in die die Daten eingefügt werden sollen."Laura" 16."Sophie" 14. "Anzahl". wie die Definition in der Tabelle."Abby" 14."Caitlin" 14. Dazu noch die Spaltennamen geändert und die Anzahl muß sechzehn sein "Anzahl"."Paris" 16."Paris" 16. Die Spaltenliste kann auch weggelassen werden. Dazu noch die Spaltennamen geändert. wenn die Werteliste in der exakt gleichen Reihenfolge ist."Ruby" INSERT INSERT wird für das Einfügen von Datensätzen in eine Tabelle verwendet. Einfache Darstellung zu tun."Vorname" 16."Sophie" 14."Mikayla" SELECT count(cVName) as Anzahl. Anzahl der Vorkommen der Vornamen absteigend sortiert. Anzahl der Vorkommen der Vornamen."Paris" 16."Abby" 14."Vorname" 19."Elizabeth" 16."Caitlin" 14."Elizabeth" 16. 38 ."Amelia" 19."Ruby" 15."Mikayla" SELECT count(cVName) as Anzahl.

Es muß dann aber nicht die Reihenfolge und Anzahl der Spalten mit der Tabellen Definition übereinstimmen. denn so ist die Eindeutigkeit sichergestellt."Campbell"."Collins"."cVName".cMName."HoGi".cFName. Bei UPDATE und anderen Befehlen zur Erstellung von Daten.3 Grundlagen Datenbank Wenn die Spaltenliste vorhanden ist. Bezüglich der Möglichkeiten der WHERE-Klausel bitte beim Befehl SELECT nachzulesen. Bei INSERT und anderen Befehlen zur Erstellung von Daten. cRName) VALUES ("Hope". gibt es kein Ergebnismenge."Giordano". da an Spalten mit automatischen Zählern (meist Primärschlüssel) keine Werte übergeben werden dürfen! Beispiele zu INSERT INSERT st_person (cVName."Clark". ist zwar beim INSERT nicht angegeben. Beispiele zu UPDATE UPDATE st_person set cRName = "HoGi"WHERE STPerson = 1. SELECT * FROM st_person."HaCl"."Hope0Giordano" 2."Holly7Collins" Die Spalte STPerson. "Hope0Giordano"). Wichtig ist hier die WHERE-Klausel! Fehlt sie so werden alle Datensätze der Tabelle geändert! Soll nur ein einziges Datensatz von der Änderung geändert werden."Holly". wird vom System automatisch vergeben."Hope". Normalerweise wird hier der Primärschlüssel (auch zusammengesetzt) verwendet."Harmony"."Harmony7Campbell" 3."Harmony4Clark" 4. 39 ."cFName". Beim einfachen Ändern haben wir es mit wenigen Schlüsselwörter UPDATE ’Ziel’ SET ’Spalte1’ = ’Wert1’ . Nach dem Schlüsselwort SET erfolgt die Auflistung der Spalten mit den neuen Wert. Ein weiteres Beispiel befindet unter Projekt MySQLTestData UPDATE Mit UPDATE können die Daten in den Tabellen geändert werden."HaCa". "STPerson"."Harmony"."cMName". so muß die Einschränkung richtig definiert sein. Das wird normalerweise verwendet. so müssen die Werte in der Werteliste in der gleichen Reihenfolge stehen."Giordano"."HoCo"."cRName" 1. Einfache Darstellung zu tun. ’Spalte2’ = ’Wert2’ WHERE ’Where-Klausel’ Bei dem Ziel handelt es sich um die Tabelle in der die Daten geändert werden sollen. gibt es kein Ergebnismenge."HoGi".

"Campbell"."Holly7Collins" UPDATE st_person set cVName = "Hopper"."Giordano"."HaCa"."HoGi"."Holly"."HaCa"."HaCl"."cRName" 1."Hopper"."HoGi1" 2."Collins"."Harmony". Daher gilt. cRName = "HoGi1"WHERE STPerson = 1."Harmony7Campbell" 3."HoCo"."Clark"."cMName"."cVName"."HoGi"."HaHa"."HoGi". fehlt die WHERE-Klausel."Holly7Collins" UPDATE st_person set cVName = "HaHa"WHERE cVName like „Ha“."Holly7Collins" DELETE Mittels dem Befehl DELETEwerden Datensätze in der Datenbank gelöscht."Clark".3 Grundlagen Datenbank SELECT * FROM st_person."cRName" 1."Hopper". "STPerson"."Campbell"."Holly". ohne entsprechende WHERE-Klausel werden alle betroffenen Datensätze gelöscht."HaHa". DELETE ’Ziel’ WHERE ’Where-Klausel’ Aber Vorsicht."Harmony4Clark" 4."Campbell". "STPerson"."cFName". so werden alle Datensätze unwiderruflich gelöscht! 40 ."Holly"."HoGi1" 2."HoCo"."cVName"."cRName" 1."Giordano"."Harmony7Campbell" 3."HaCa"."Harmony4Clark" 4."Collins"."Harmony7Campbell" 3."Giordano"."cMName"."cVName"."Clark"."HoCo". "STPerson"."HaCl". Hier werden mehrere Datensätze gleichzeitig geändert SELECT * FROM st_person. Einfache Darstellung Beim einfachsten DELETE haben wir es mit wenigen Schlüsselwörter zu tun. Hier werden zwei Spalten gleichzeitig geändert SELECT * FROM st_person."Harmony4Clark" 4."cFName"."Harmony"."Collins"."Harmony"."Harmony"."HaCl"."HoGi" 2."cFName"."cMName"."Hope".

"HaCl"."HoCo". Bei DELETE und anderen Befehlen zur Erstellung von Daten."HoCo". "STPerson"."cMName"."Collins". 4 siehe auch http://de."Hope"."Harmony7Campbell" 3. gibt es kein Ergebnismenge."Holly7Collins" DELETE FROM st_person."Harmony"."HoCo"."Collins"."Campbell".1."cRName" 1."cRName" 1. SELECT * FROM st_person."Hope". SELECT * FROM st_person.3 Grundlagen Datenbank Beispiele zu DELETE DELETE FROM st_person WHERE STPerson = 1. Bei DELETE und anderen Befehlen zur Erstellung von Daten."cMName"."Harmony"."Campbell"."HoGi" 2."cVName". mit deren Hilfe man die Rechte vergibt."HaCa"."HaCl"."HoGi". "STPerson"."cRName" 2."Campbell". Es sind das Befehle wie GRANT und REVOKE. Hier wird der Datensatz mit dem Wert 1 in der Spalte STPerson gelöscht. Hier werden alle Datensätze in der Tabelle st_person gelöscht! SELECT * FROM st_person."Collins"."Holly7Collins" DELETE st_person WHERE STPerson = 1. gibt es kein Ergebnismenge."cRName" 3."Giordano"."HaCl"."HaCa". "STPerson".org/wiki/Data_Control_Language 41 ."cFName"."Harmony7Campbell" 3."cMName"."cFName"."cFName"."HoGi"."Holly"."cMName"."Harmony"."Harmony4Clark" 4. "STPerson"."cFName"."Clark"."cVName"."Clark"."Harmony7Campbell" 3."cVName"."Giordano". SELECT * FROM st_person."HaCa"."Holly"."Harmony"."Clark"."Harmony4Clark" 4."Holly"."Holly7Collins" DELETE FROM st_person WHERE STPerson = 1.wikipedia."Harmony"."Harmony4Clark" 4."HoGi" 2.4 DCL Datenkontrollsprache Die Datenkontrollsprache (Data Control Language = DCL4 ) umfasst die Sprachteile von Datenbanksprache. Wartungen durchführt."cVName"."Harmony".

3 Grundlagen Datenbank Version: $LastChangedRevision: 52 $ 5 5 Autor: Andreas Frieß Lizenz: GFDL 42 .

es wird gemäß der Vollständigkeit jedoch trotzdem aufgeführt. das es nicht zu Konflikten zwischen den Versionen kommt.0-0. Die benötigten Quelltexte werden allerdings später separat installiert 43 . gestaltet sich die Installation von Freepascal extrem einfach.0 2.i386.2.2.0 deinstalliert werden. so dass die entsprechenden Passagen übersprungen werden können. Systemvorbereitungen für Lazarus und Installation von Lazarus aus dem SVN 3. Für die 64-Bit-Version von FPC/Lazarus können abweichungen auftreten. Beispielsweise könnten die benötigten Packete schon installiert sein.eins für den eigentlichen FPC und eins für die Sourcen . welche am besten im Homeverzeichnis gespeichert werden (unter der Annahme eines 32Bit-Systems.rpm Momentan scheint dieses packet nicht zu funktionieren.1 Installation von Freepascal 2.2.2. können natürlich kleine Unterschiede möglich sein.rpm • fpc-2. auf welcher die gesamte Tutorialserie basiert): • fpc-2. Wine und GTK2 Anmerkung: Die Tutorialserie baut auf einem System mit 32 Bit auf.0-0. Inhalt: 1. Zunächst müssen die entsprechenden beiden RPMs von der Sourceforge-Seite heruntergeladen werden (alternativ gehen natürlich auch andere FPC-Mirrors): Benötigt werden folgende zwei Pakete. So sollte eine vorhandene Version des Freepascalcompilers wenn man sicher gehen möchte und keine händischen Änderungen vornehmen will (die hier nicht beschrieben sind) vor der Installtion von FPC 2.src. Erstellung der Lazarus-IDE aus dem SVN Das Tutorial wurde auf der Grundlage einer frischen Installation von OpenSUSE mit XFCE verfasst und getestet.1. Sollte es auf ein bestehendes System angewendet werden.0 Da für die Installation von Freepascal bei RPM-Basierten Sytsemen lediglich zwei RPMs .4 Installation 4.1 Linux openSUSE Erweiterte Lazarusinstallation Installation von FPC. Crosscompiling 4. Installation von Freepascal 2.2. Außerdem sollte bei bereits bestehenden Installationen sichergestellt werden.installiert werden muss. 4.

Ob die benötigten Pakete auf der DVD-Version zur Verfügung stehen. damit es auf dem System fehlerfrei erstellt und benutzt werden kann.2. Zumindest bietet jedoch die 1-CD-Installaiton von openSUSE die benötigten Pakete nicht auf der CD an. Über folgende Eingaben im Terminal installieren wir nun den Freepascalcompiler auf dem System: Code: (Plaintext) ~ su # rpm -ivh fpc-2.1. in welchem nun die beiden RPMs zu finden sein sollten Nun öffnet man in diesem Verzeichnis ein Terminal (meist über das Kontextmenü und Terminal hier öffen o. kann ich nicht mit sicherheit sagen.4 Installation Downloadseite für Freepascal bei Sourceforge1 Nach dem Download öffnet man das Homeverzeichnis. sollte man bei der Installation nicht bereits das Häkchen für 1 http://sourceforge. Bei den Paketquellen wird davon ausgegangen.).ä.0-* # exit Die Ausgabe zur Installation sollte in etwa so aussehen: Zur vollen Sicherheit. Außerdem benötigt man zum Auschecken der Lazarussourcen aus dem SVN natürlich einen entsprechenden SVN-Clienten auf dem lokalen Rechner.2 Systemvorbereitung für Lazarus Lazarus benötigt einige Abhängigkeiten. das dass Hauptrepository OSS als Onlinequelle eingebudnen ist. ob der FPC korrekt installiert wurde.net/project/showfiles. gebe man nun noch folgendes ein: ~ fpc ~ exit wobei nach fpc ungefähr folgende Ausgabe erscheinen sollte: 4. Die benötigte Paketquelle lässt sich aber nachträglich auch bequem über Yast einbinden.php?group_id=2174 44 .

Dafür öffne man Yast und anschließend Software installieren und löschen. 45 . mit der Installation der Lazarus-IDE fortfahren. Dort kann man bequem nach Subversion suchen und das entsprechende Paket zur Installation vormerken und anschließend installieren. nachdem die entsprechenden Änderungen übernohmen wurden.3 einfach Installieren. Im Gegensatz zur vorhergehenden Version von OpenSuse ist es auch nicht mehr nötig. die benötigten Abhängigkeiten installiert werden. stets die aktuellen Sourcen von Lazarus zu installieren. Den nötigen Klienten kann man bequem aus dem Opensuse-Repository installieren. Abhängigkeiten von Lazarus Alles in allem lassen sich die für Lazarus benötigten Pakete unter openSUSE 10. dritt-Paketquellen einzubinden. So werden durch die Abhängigkeiten der gdk-pixbuf-devel auch andere benötigte Pakete wie gtk-devel und glib-devel automatisch mit installiert und man kann anschließend. um die benötigten Pakete zur Verfügung zu haben. Dafür wähle man in Yast lediglich das Paket gdk-pixbuf-devel zur Installation aus und akzeptiere alle automatischen Änderungen. So können bequem und ohne Drittpakete nutzen zu müssen. (Alternativ kann das Repo mit einem Klick über Yast » Community Repositories aktiviert werden) Subversion Über SVN ist es möglich.4 Installation ’Online-Repositories hinzufügen’ gesetzt und die Quellen ausgewählt haben.

anstatt den Bereich trunk auszuchecken.1. Der Zweite Weg [nach Meinung des Autors der zu bevorzugende] besteht darin./ 4. 46 . welche nicht mit der aktuellen SVN-Version arbeiten wohlen ist es ja auch möglich. Für besonders Vorsichtige. müssen diese manuell hinzugefügt werden.0.3 Installation von Lazarus aus dem SVN Ein entscheidender Vorteil neben der Aktualität einer Installation aus dem SVN besteht darin.4 Installation FPC-Quellen Da das FPC-Sourcepaket leider nicht alle benötigten Sourcen installiert. Man läd das Paket fpc-2. die Relaeseversionen aus dem Lazarus-SVN zu nutzen. einen entsprechenden Ordner (im Home) anzulegen und die Quellen direkt aus dem entsprechenden SVNArchiv zu holen mittels: ~ svn co http://svn.tar.org/svn/fpc/tags/release_2_2_0 . Dabei sind zwei Wege denkbar. Somit empfiehlt es sich. das später Lazarus schnell und ohne erst als root angemeldet zu sein geändert und neu erstellt werden kann.source.2. die die Releaseversionen noch aufweisen. Die weitere Beschreibung bezieht sich allerdings auf die aktuellste Version von Lazarus aus dem trunk.freepascal. Der Vorteil dabei liegt klar darin. Lazarus ins eigene Homeverzeichnis zu installieren. das Lazarus in ein frei wählbares verzeichnis installiert werden kann. da in dieser oftmals Probleme behoben sind.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 später in Lazarus unter Umgebungseinstellungen als Quellverzeichnis der FPC-Sourcen angegeben werden.

1... Anschließend öffnet man wieder in diesem neuen. Musste man bei alten Versionen für die Erstellung von Windowsanwendungen unter Linux ein extra Paket FPCCross.2.cfg aus den Freepascalsourcen einen lauffähigen 47 . 4. Um dies zu korrigieren geht man inder IDE auf Einstellungen » Umgebungseinstellungen. um mit wenigen Befehlen und ein bisschen Anpassung der fpc.man könnte sich also beispielsweise den Kaffee holen. lazarus_trunk oder auch nur lazarus je nach Geschmack und der Überlegung.. Nachdem dies dann hoffentlich ohne Fehlermeldungen abgeschlossen ist.org/svn/lazarus/trunk .../ nun wartet man. um Lazarus zu erstellen: ~ make Dies kann etwas dauern. installieren. und gibt bei FPC-Quelltextverzeichnis das oben angelegte Verzeichnis mit den FPC-Sourcen an. das das Quelltextverzeichnis falsch gesetzt ist.0 schon alle benötigten Elemente mit..4 Erstellen der Crosscompiling-Umgebung Hierbei gibt es einen gravierenden Unterschied zu älteren Versionen vom FPC. ob man vielleicht noch eine zweite Version (bspw.. noch leeren Verzeichnis ein Terminal in welchem man nun den entsprechenden Befehl eingibt. kann man Lazarus über das Terminal öffnen mit .bis schließlich alle Dateien im Ordner zu finden sind und eine Meldung wie diese erscheint: Danach kann man gleich im selben Terminal den entscheidenden Befehl eingeben./lazarus Nun wird man noch darauf hingewiesen werden.4 Installation Man sollte sich nun also ein entsprechendes Verzeichnis in seinem Home erstellen. so bringt der FPC 2. um das SVN aus dem lokalen Verzeichnis zu holen: ~ svn co http://freepascal.... bspw. das letzte Relaese) installieren möchte.

cfg vorgenohmen werden. die Datei mit Adminrechten zu öffnen. wo er die entsprechenden Units für Windows finden kann. Ohne diese Änderung greift er automatisch auf die Linuxunits zu. Anpassung der fpc. können wir dies nun gleich nutzen.cfg Nun muss allerdings noch eine Anpassung an der in /etc zu findenden fpc. 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. wie das geht. (Unter XFCE im Terminal su und anschließend thunar.0/units/i386-win32/ -Fu/usr/local/lib/fpc/2.cfg editieren. Ebeso kann man in KDE Konquero aus dem Terminal heraus mit Rootrechten starten) Folgende Änderung muss in der fpc. sei den einzelnen Plattformen/Desktops überlassen.~/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.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/. Zunächst benötigt man dazu jedoch das komplette Packet der FPC-Sourcen.2.0/units/i386win32 die neu erstellten Untis für das crosscompiling zu Windows zu finden sind. in welchem unter 2.0/units/i386-win32/rtl -XPi686-mingw32- 48 .cfg eingefügt werden: Relativ weit unten finden sich in der standardmäßig installierten fpc.4 Installation Crosscompiler von Linux auf Windows zu erstellen. dann kann man mit Adminrechten durch Dateisystem ziehen und in /etc die fpc.0/units/i386-win32/* -Fu/usr/local/lib/fpc/2. Da normale Nutzer unter /etc kein Schreibrecht haben ist es nötig. damit der FPC auch Klarheit darüber hat.~/fpc/fcl/units/.2. wodurch natürlich keine Kompilierung für Windows möglich ist. Da wir bereits ein entsprechendes Verzeichnis mit allen FPC-Sourcen angelegt haben (siehe Teil 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/. Dazu geht man in Lazarus auf Werkzeug » Lazarus erstellen einrichten... Windowsanwendungen zu compilieren. muss noch Lazarus entsprechend angepasst werden.. Nachdem der FPC in der Lage ist.. für das ’normale’ Erstellen von Linuxanwendungen auf die schon vorher eingestellten Units in /usr/lib... und wählt im erscheinenden Dialog den Reiter Erweiterte Build-Optionen 49 . zuzugreifen. während dessen er für das erstellen von Windowsprogrammen im Verzeichnis /usr/local/lib/fpc.~/fpc/rtl/units/ #ENDIF Somit wird der FPC angewiesen. Anschließend sollte man in der Lazaruside unter den Ungebungseinstellungen den FPC-Quelltextverzeichnispfad auf das oben ausgecheckte Quellverzeichnis des FPC legen.2. fündig wird.4 Installation -FD/usr/local/lib/fpc/2.~/fpc/fcl/units/.

IDE.4 Installation Innerhalb dieses Dialogs müssen folgende Einstellungen gesetzt werden (wie auch im Bild zu sehen): • LCL. Package-Registrierung IDE-Schnittstellen müssen auf Clean and Build gesetzt werden • JIT-Form. Start gleich ausführen möchte. die entpsrechenden Komponenten neu zu erstellen. SynEdit. ein unter Windows lauffähiges Executabel zu erzeugen. um ein unter Windows lauffähiges 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 Anschließend kann man das Projekt über Start » Erstellen neu bauen. ob alles. 4. den entsprechenden Konfigurationsdialog auf. alle verwendeten Schnittstellen neu erstellen. wenn man statt nur auf Erstellen zu gehen. müssen zwei Umstellungen an den Compilereinstellungen vorgenohmen werden. 50 . Allerdings sollte man bei änderungen an den Lazarus-Sourcen. Dieser Umsatnd erschwert das effektive erstellen von crosscompilierten Programmen jedoch sehr stark.. Windowsprogramme unter Linux auszuführen indem es wichtige Windowsschnittstellen unter Linux zur Verfügung stellt und entsprechende Aufrufe auf Linuxeigene umleitet. Da Laz die erstellten Units automatisch für jede LCL-Schnittstelle (Widgetset) in eigene Unterordner packt. Logischer Weise ist dieses Programm unter Linux nicht ohne Hilfsmittel ausführbar. wenn das Projekt anstatt für Windows wieder für Linux erstellt werden soll. ist es nicht jedesmal nötig. Dazu ruft man über Projekt » Compilereinstellungen. wie angedacht funktioniert. Eine Abhilfe dabei schafft wine. allerdings kann dieses nicht ohne weiteres über Start auch ausgeführt werden.5 Wine Wie bereits im vorhergehenden Teil angesprochen. Wine bietet die Möglichkeit. CodeTools. woraufhin sich im Ausgabeordner eine unter Windows lauffähige exe befindet. das Projekt über F9 bzw. ist es zwar nach entsprechender Konfiguration über Start > Erstellen möglich. weshalb es auch zu einem Fehler kommt. Starter und Beispiele müssen hingegen auf none gesetzt sein • Bei LCL-Schnittstelle wählt man win32/win64 aus • Zielbetriebssystem wird ebenfalls win32 angegeben Anschließend werden die entsprechenden Elemente durch Klick auf erstellen neu erstellt. beispielsweise durch ein update aus dem SVN. Da es doch kleine Unterschiede zwischen den Widgetsets gibt und man das Programm zumindest mal kurz überfliegen sollte. In diesem müssen nun zwei Eintragungen geändert werden. eh man es weitergibt..1. Möchte man nun ein Projekt für Windows unter Linux erstellen. da es sonst zu Fehlern aufgrund der Unterschiedlichen Dateiversionen kommen kann.

muss nun Lazarus noch so konfiguriert werden. bei anderen halbwegs aktuellen Distributionen mit der zur Verfügung stehenden Version von WINE. Nun kann man wie gewohnt über Yast » Software Installieren oder löschen nach WINE suchen und dieses installieren. apt-get usw. Alernativ funktioniert das folgende natürlich auch mit der (älteren) Version des Hauptrepositories bzw. anstatt die ältere aus dem Hauptrepository zu nutzen. Bezogen auf openSuse 10. Damit kann man bei der Installation von wine die neuere Version auswählen.) zu finden und es kann relativ Problemlos installiert werden. dass crosscompilierte Windowsprogramme automatisch in WINE gestartet werden. rpm. unter Yast noch folgende Einstellung vor der Wineinstallation vorzunehmen: • Software » Community Repositories aufrufen • dort das Wine-CVS-Repositorie aktivieren und Beenden Anschließend werden die Paketdaten dieses Pepositories heruntergeladen und dem Softwarekatalog hinzugefügt.3 empfiehlt es sich. yum. Programme in WINE ausführen Nachdem WINE erfolgreich installiert wurde. Somit ist es in der Regel bequem über den Paketmanager (ob nun yast. 51 .4 Installation Installation von WINE Wine sollte wohl bei den meisten Linuxdistributionen in den Repositories vorhanden sein.

bietet Linux von Haus aus je nach Desktopoberfläche und System verschiedene Möglichkeiten an.. müssen folgende Änderungen wieder rückgängig gemacht werden: • Start > Startparameter.: Startprogramm verwenden muss deaktiviert werden • Projekt > Compilereinstellungen. da es nur eine Standardschnittstelle gibt. Möchte man das Programm wieder für Linux erstellen.GTK2 Unter Linux stehen dem Programmierer verschiedene LCL-Schnittstellen (Widgetsets) zur Verfügung. Um Programme für GTK2 zu erstellen muss zunächst über yast (oder eine andere Packetverwaltung) das Package gtk2-devel installiert werden.: Reiter Quelltext: Zielbetriebssystem auf Linux zurücksetzen 4. In diesem Dialog müssen 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 ausgeführt werden und das erstellte Windowsexecutabel kann unter Linux begutachtet werden.4 Installation Dazu öffnet man zunächst über Start > Startparameter den Dialog in welchem die entsprechenden Konfigurationen zum Ausführen der Anwednungen eingestellt werden können. wie Gnome und XFCE auf dem Gimp-Tool-Kit (GTK/GTK2) basieren. Daher sollte man sich überlegen. Dabei kann man fast genauso vorgehen.6 Eyecandy . Allerdings sieht GTK unter den aktuellen Desktopoberflächen wohl für die meisten Benutzer doch recht altertümlich aus. wie bei der Vorbereitung zur Erstellung von Crosscompilierten Programmen: 52 . welche Schnittstelle man verwenden will. anstatt GTK zu benutzen. Danach müssen die entsprechenden Teile von Lazarus neu erstellt werden. ob man sein Programm nicht gleich der besseren Optik wegen mit GTK2 kompilieren will..: Reiter Pfade: LCL-Schnittstelle zurücksetzen • Projekt > Compilereinstellungen . Währenddessen man unter Windows sich keinerlei Gedanken machen muss. währenddessen andere. das moderne Linuxdistributionen teilweise das GTKWidgetset standardmäßig nicht mehr installieren.1... Hinzu kommt. Standardmäßig wird Lazarus mit GTK erstellt und alle erstellten Programme besitzen unter Linux ebenfalls eine GTK-Oberfläche. So basiert die Desktopumgebung KDE auf dem qt-Widgetset... stattdessen wird nur GTK2 von Haus aus installiert.

Starter und Beispiele müssen hingegen auf none gesetzt sein • Bei LCL-Schnittstelle wählt man gtk2 aus Anschließend kann man Lazarus. Dennoch sollten viele Anwendungen auch Problemlos auf GTK2 laufen. wie das folgende Bild zeigt.. und wählt im erscheinenden Dialog den Reiter Erweiterte Build-Optionen in welchem man folgende Einstellungen vornimmt: • LCL... die LCL und relevante Schnittstellen. Package-Registrierung und IDE-Schnittstellen müssen auf Clean and Build gesetzt werden • JIT-Form. CodeTools. Um nun nach diesen Vorbereitungen das eigene Programm für GTK2 zu erstellen. GTK ist das am besten entwickelte Widgetset von Lazarus unter Linux. 53 . oder besser gesagt. So ist es auch möglich. SynEdit.4 Installation Man geht in Lazarus auf Werkzeug » Lazarus erstellen einrichten. neu erstellen. • im Reiter Pfade muss die Einstellung LCL-Schnittstelle auf GTK2 gesetzt werden Anschließend sollte man beim nächsten Start des Projektes anstatt des GTK ein GTK2-Design der eigenen Anwendnung sehen. Der Vollständigkeit wegen muss noch folgendes gesagt werden. die Lazarus-IDE mit GTK2 neu zu kompilieren. den entsprechenden Konfigurationsdialog auf.. folglich ist dies auch in den meisten Fällen das fehlerfreiste. IDE. muss dies in den Projekteinstellungen angepasst werden: Dazu ruft man über Projekt » Compilereinstellungen.

jedoch ist QT teilweise noch recht fehleranfällig. Allerdings sei nochmal darauf hingewiesen. wobei sich gerade da in letzter zeit sehr viel getan hat. Anschließend sollte sich Lazarus nach erfolgreicher Kompilierung automatisch mit der optisch ansprechenderen GTK2-Oberfläche starten. Für die nötigen Grundlagen sei dabei auf das Wiki von Lazarus verwiesen. Sollte man wieder auf GTK wechseln wollen. So ist es natürlich jedem freigestellt. zu testen. setzt men einfach im Lazarus neu erstellen-Dialog alles auf Build und wählt als LCL-Schnittstelle GTK2.4 Installation Auch eine Neukompilierung für QT ist möglich. kann man die IDE ebenso wieder für GTK neu erstellen. Version: $$ 2 2 Autor: Johannes Müller Lizenz: GFDL 54 . Um die IDE für GTK2 zu erstellen. welche in GTK nicht vorhanden sind. das in dieser teilweise Ungereimtheiten auftreten können. QT zu verwenden. bzw.

2. muß aber nicht. Letzteres auch dann. ’libglib1.org/lazarus/ 55 . solange nichts anderes angegeben wird.2-dev’. installiert werden.1 Vorbereitung Als vorbereitung müssen folgende Pakete (mit ihren Abhängigkeiten) vorinstalliert sein. Es ist egal ob die Pakete mit Aptitude.es kann funktionieren.freepascal. Es ist mittlerweile zwingend notwendig. 3 http://www. 4. Diese Installationsbeschreibungen werden auf der Basis des Desktopsystem im Tasksel der Installation von Debian installiert. HINWEIS: Das sind automatisch erzeuge Pakete aus dem Stand vom SVN. wenn keine GTK2 kompiliert werden soll. apt-get.. ’libgdk-pixpuf-dev’ und ’libgtk2. Ausserdem wird hier die Installation für i386 Prozessoren beschrieben. den Computer beschädigen. Synaptic oder .hu. ’Alien’..2 Linux Debian Etch Snapshotinstallation Als Basis für die Installationsbeschreibung wird ein frisch aufgesetztes Debian Etch System genommen. Es ist somit ein Grafisches System auf Basis Gnome vorhanden. die Festplatte zerstören !! VIEL GLÜCK !! Es ist komplett ungetestete Software . Die restlichen Pakete werden durch die Abhängigkeit zu den genannten Paketen automatisch mitinstalliert. Es kann Projekte zerstören.4 Installation 4. Die Snapshots werden täglich automatisch aus dem SVN von Lazarus erstellt und auf der Snapshot Downloadseite vom Lazarusprojekt[LazEn]3 zum Herunterladen angeboten.0-dev’.

Dabei steht das Wort ’version’ für die gewünschte Version und ’datum’ für das gewünschte Datum.i386.4 Installation Die durch Alien erzeugen Pakete kann man jetzt ganz einfach installieren. das Paket in das Debianformat zu konvertieren und die Option ’-c’ sagt. Es wird nicht empfohlen beim FPC verschiedene Versionen und Datum zu mischen.i386. das man die Pakete in Gnome mittels ’GDebi Paket Installer’ einfach einzeln installiert. die FPC Quelldateien ((fpcsrc-version-datum. Die Originalpakete könnten jetzt gelöscht werden.3 Umwandeln RPM -> DEB Die Pakete liegen jetzt im RPM Format vor. da ansonsten zu wenig Rechte vorhanden sind um Lazarus beziehungsweise die Bibliotheken ordnungsgemäß zu kompilieren und an die richtige Stelle zu bringen. wo bei für ’paketname’ der volle Name des Paketes inklusive der Extension (rpm) steht.2. Auf der Konsole ist dazu folgendes einzugeben ’sudo startlazarus’ oder nur ’startlazarus’ auf der Rootkonsole. das zusätzlich auch die Scripts umgewandelt werden sollen.2. Anschliessend an die Installation muß der Lazarusstarter mit Rootrechten aufgerufen werden und Lazarus´inklusive der Widgetsets neu kompilert werden.rpm). Die Umwandlung nimmt einiges an Zeit und Platz in Anspruch und liefert als Ergebnis die Pakete mit der Endung ’deb’.i386. 4. Die Umwandlung dafür nimmt das Debian Tool ’Alien’ vor. Im Terminal gibt man ’alien --to-deb -c paketname’ für jedes der heruntergeladenen Pakete an. Die root Berechtigung ist notwendig. Dazu muß man ein sich entweder ein Rootterminal öffnen oder die folgenden Befehle als Root ausführen oder mit sudo arbeiten. Am einfachsten ist. 56 . anschliessend die FPC-Sourcen und zuletzt dann Lazarus.2 Download Von der Downloadseite die Pakete für den FPC (fpcversion-datum.4 Installation 4. 4.rpm) und Lazarus (lazarus-versiondatum. Man fängt mit dem FPC an.2.rpm) herunterladen. Die Option ’–to-deb’ weist Alien an. der Standardinstaller von Debian erwartet aber Pakete die im Format DEB vorliegen.

so kann man Lazarus und die Konsolen schliessen. Für das erste recompileren sind bevorzugt die Einstellungen wie am Bild vorzunehmen. das die LCL neu erstellt wird. 4.5 Ausführung Aufgerufen wird Lazarus über das Menü Anwendungen -> Entwicklung -> Lazarus. Innnerhalb von diesen kann man sich dann das entsprechende Widgetset einstellen. Im Beispiel wird Lazarus mit dem gtk2 Widgetset erzeugt. Beim Widgetset hat die Wahl zwischen dem stabilen ’gtk’ und dem neueren (noch nicht voll ausgereiften) ’gtk2’.2. Version: $$ 4 4 Autor: Andreas Frieß Lizenz: GFDL 57 . Die Projekte sind am besten im Heimatverzeichnis (home) des Benutzers aufgehoben. Wichtig ist. Damit läuft Lazarus im Kontext des aktuellen Benutzers. Wenn das Kompileren erfolgreich war. Die Dialoge zum Speichern enthalten immer den Button ’Neues Verzeichnis’. Dort ist das Vorgehen wie im letzten Absatz der Installation beschrieben anzuwenden. Dieses ist für die normale Programmierung ausreichend. sondern müssen selbst erstellt werden. Anders ist die Sache wenn man Lazarus selbst neu kompilieren muß.4 Installation Innerhalb von Lazarus wechselt man dann mit dem Menü ’Werkzeug -> Lazarus erstellen’ in den Erstellungs Dialog. Diese Projektordner sind nicht vorhanden. mit dessen Hilfe die Verzeichnisse angelegt werden können.

2: IDE .1.5 Lazarus IDE 5. Datei Tastenkürzel Strg+O Strg+S Umsch+Strg+S Strg+P Erklärung Datei öffnen Datei speichern alle Dateien speichern Drucken Tabelle 5.Tastenkombinationen Bearbeiten Version: $LastChangedRevision: 65 $ 2 1 2 /Lazarus_IDE_Tools/de#.Tastenkombinationen Datei Bearbeiten Tastenkürzel Strg+Z Umsch+Strg+Z Strg+X Strg+C Strg+V Strg+I Strg+U Strg+A Umsch+Strg+D Umsch+Strg+C Erklärung Rückgängig Wiederholen Auswahl ausschneiden Auswahl kopieren Auswahl einfügen Auswahl einrücken Auswahl ausrücken Alles auswählen $IFDEF einfügen Kodevervollständigung (Class Completion) Tabelle 5.1: IDE .C3.9Cbersichtstabelle_der_IDE_Tastenkombinationen Autor: Andreas Frieß Lizenz: GFDL 58 .1 Entwicklungsumgebung 5.1 Tastenkombinationen Die aktuelle Quelle für die Tastenkombinationen 1 ist die Lazarus-Homepage[10].

TastenkombinationenAnsicht Projekt Tastenkürzel Strg+F11 Umsch+Strg+F11 Umsch+F11 Erklärung Projekt öffnen Projekt Einstelllungen Datei ins Projekt übernehmen Tabelle 5.4: IDE .Tastenkombinationen Suchen Ansicht Tastenkürzel F11 Strg+F12 Umsch+F12 F12 Strg+Alt+F Strg+Alt+B Strg+Alt+W Strg+Alt+L Strg+Alt+S Erklärung Objektinspektor anzeigen Unitliste anzeigen Formularliste anzeigen Formulare/Unit Anzeige umschalten Suchergebnisse anzeigen Überwachte Ausdrücke Haltepunkte Lokale Variablen Aufruf Stack Tabelle 5.Tastenkombinationen Projekt 59 .3: IDE .5 Lazarus IDE Suchen Tastenkürzel 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 Erklärung nächstes suchen vorheriges suchen Ersetzen Inkremtielle Suche Zu Zeile springen Zurückspringen Vorwärtsspringen Zum nächsten Fehler springen Zum vorherigen Fehler springen Deklaration unter Cursor suchen Datei unter Cursor öffnen Prozedur Liste Tabelle 5.5: IDE .

gibt es viele Möglichkeiten Fehler zu suchen.2 Fehlersuche Im besten Fall läuft ein Programm fehlerfrei. 60 . fehlende Zeichen oder Buchstabendreher. Da dies aber meistens bei der Entwicklung nicht so ist.6: IDE .7: IDE . tauchen aber oft auch als Kompilerfehler auf. weil der Kompiler oder Präprozessor nicht in der Lage ist. Parameter falsch Typ oder Anzahl von Parametern falsch gewählt Kompiler Fehler Sind Fehler.1. den oder die Befehle zu übersetzen. die beim Kompilieren auftreten. Schreibfehler Diese Fehler entstehen durch vergessene Zeileabschlüsse.5 Lazarus IDE Start Tastenkürzel Strg+F9 F9 F7 F4 Strg+F2 Strg+F7 Strg+F5 Erklärung Erstellen Start Ein Schritt Start bis Cursor Halt Prüfen/ändern Überwachung hinzufügen Tabelle 5. Syntax Fehler siehe oben.Tastenkombinationen 5. oder dem Vergessen von Deklarationen.Tastenkombinationen Start Divers Tastenkürzel Strg+Click Strg+Shift+Upe Strg+J Strg+Space Strg+W Strg+Shift+Space Erklärung springt zur Deklaration eines Typen oder Variablen schaltet zwischen Definition und Rumpf um Code-Schablonen Bezeichnervervollständigung Word Completion Parameter Hinweise Tabelle 5. Bezeichner Namen von Objekte und Variablen mehrfach vergeben Schlüsselwörter Schlüsselwörter als Namen von Objekten oder Variablen verwendet Blöcke falsch Den Anfang oder das Ende von Prozedure. Allerdings muß man sich auch über die verschiedenen Arten von Fehlern und Unzulänglichkeiten im klaren sein. Funktionen oder Schleifen nicht richtig gesetzt. Syntax Fehler Sind Fehler in der Syntax selbst.

Initialierung Fehlende oder unzureichende Initialisierung von Objekten und Variablen Endloschleifen Schleifen werden nicht beendet Rekursionen Ungewollte Rekursionen entstehen Logik Ganz einfach die falsche Lösung für das richtige Problem genommen. ob der Lösungsansatz für das Problem wirklich der Richtige ist. Eine der besten Möglichkeiten ist.. Ebenso gibt es viele Wege. Version: $ $ 3 3 Autor: Andreas Frieß Lizenz: GFDL 61 . Laufzeit Fehler Bei dieser Art. das sich oft Logik und Laufzeit Fehler durch Planung stark vermindern lassen. Klammern falsch oder nicht gesetzt bei komplexen Ausdrücken Falsche Anzahl von Durchläufen Vergessen. DebugLn Ausgabe von Informationen an die Debugkonsole. gar keine Fehler zu machen. es ist damit gemeint. falsche Programmlogik für das Problem genommen. Einhaltung von Abläufen nicht erzwungen.. nur in der Programmlogik hat man Fehler. Fehler zu machen. das man Teilproblemstellungen im Vorfeld testet.5 Lazarus IDE Logische Fehler Hier ist zwar die Syntax prinzipiell in Ordnung. wie man Fehler beseitigen kann. Eingabe und Ausgabefehler Dateien oder Geräte die erwartet werden sind nicht oder nicht mehr verfügbar Anhand der Liste sieht man. Dazu gehört auch. sind (Rand-) Bedingungen zur Laufzeit nicht erfüllt und der Programmierer hat keine entsprechenden Gegenmaßnahmen im Programm getroffen. .. HeapTrace Ist ein Werkzeug bei der Entdeckung von Speicherlöcher und Leichen. Divisionsfehler Division durch Null nicht abgefangen Umwandlungen Inhalt von Zeichenketten enthalten keinen numerischen Wert. Zu finden ist das im Menü unter Projekt -> Compilereinstellungen -> Linker Punkt ’heaptrc unit verwenden’. Klingt banal. vergessen Objekte frei zu geben. das 0.n nicht gleich n-Durchläufen ist. das es sehr viele Möglichkeiten gibt. Variablen vergessen zu initialisieren.

dann das Gleichheitszeichen und zum Schluß eine Beschreibung. Die Schablonen selbst befinden sich dann in den Unterverzeichnissen. Die Ersetzung wird beim Kopieren in das neue Projekt sowohl in den Dateinamen gemacht. Die Bezeichnung „VARNAME“ ist durch den Namen der Variable zu ersetzen. als auch innerhalb der Dateien. Das Komponente „projekttemplates“ hilft bei der Verwendung von Schablonen4 . Zuerst kommt der Variablenname.5 Lazarus IDE 5. Weiters wird auch das Menü „Datei“ um den Eintrag „Neues Projekt aus Schablone“ erweitert.3 Projektschablonen Beschreibung Projektschablonen sind Vorlagen für öfters verwendete Projekte. Als Vorbereitung muß man die Komponente installieren. in welches das neue Projekt erzeugt wird ProjName Der Name des neuen Projektes Weitere Variablen. ProjDir Das Verzeichnis. Nach der Erstellung ist das Menü „Werkzeuge“ um den Eintrag „Optionen für Projektschablonen“ erweitert.9. Diese Zeichnenfolge wird durch den Inhalt der Variablen ersetzt.ini“. Mit Hilfe dieses Menüpunktes kann man das Basis Verzeichnis für die Schablonen einstellen.25 svn 13811 nicht geglückt das die Unterverzeichnisse kopiert werden 6 Platzhalter. Das Kennzeichen für diese Ersetzung ist __VARNAME__7 . Als Voreinstellung selbst gibt es zwei vordefinierte Variablen die die Ersetzungsroutine selbst kennt und die nicht definiert werden müssen. Diese Datei ist im „ini“ Format aufgebaut und es befinden sich derzeit zwei Sektionen darinnen. In der ersten Sektion mit dem Namen „[Variables]“ befinden sich die Variablen6 . welcher in der Eingabemaske auf scheinen wird.txt offenbar geändert ..war $(VARNAME) 5 4 62 . auch Vorlagen genannt Es mir in der derzeitigen Version Lazarus 0. Diese Struktur wird beim Erstellen eines neuen Projektes mittels Schablonen übertragen5 .1.“ Dialog entsprechend erweitert. Während des kopierens können Ersetzungen durchgeführt werden. Die Steuerung der Vorlagen erfolgt durch die Datei „project. müssen in der Sektion „[Variables]“ in der folgenden Form definiert werden. Zusätzlich ist auch der „Datei Neu . Jede Schablone liegt in einem eigenen Unterverzeichnis und kann selbst weitere Unterverzeichnisse enthalten. veränderbare Teile 7 Wurde gegenüber der Beschreibung im README.

In der zweiten Zeile gibt man den Pfad. 1=Ja) Exclude Durch Komma getrennte Liste. die beim kopieren ebenso durch die Werte ersetzt werden.txt“. Beispiel Als Beispiel habe ich ein vorhandenes einfaches Projekt im Vorlagen Verzeichnis abgespeichert. so wird die Datei als myform. welche Dateien nicht für die Ersetzung verwendet werden sollen Ist in dem Verzeichnis eine Datei mit dem Namen „description. Die Sektion „[Project]“ beinhaltet folgende Informationen zum Projekt. Heisst also eine Datei im Templateverzeichnis zum Beispiel __VarName1__. Author und die Beschreibung in Datei-Neu Dialog von Lazarus angezeigt wird.pas in das Zielverzeichnis kopiert. maximal einzeilig Recurse Ob in Unterverzeichnis hineinrekusiert8 werden soll (0=Nein.ini“) definierbaren Variablen. Weiter kommt in diese Verzeichnis eine „project. so wird der Inhalt der Datei als Beschreibung verwendet. Darunter befindet sich dann die Eigabemaske für die frei (in der „project.5 Lazarus IDE Die zweite Sektion beschäftigt sich mit dem beschreiben des Projektes selbst. den man rechts neben der Eingabezeile aufrufen kann. er ist in der nicht sichtbaren Variablen „ProjName“ dann vorhanden. Name Namen der Vorlage Author Author der Vorlage Description Kurze Beschreibung der Vorlage. Ebenso verhält es sich mit Variablen (nicht verwechseln mit Variablen innerhalb von Lazarus). wobei der Namen. 8 funktioniert ?! 63 . wohin die Dateien aus den Vorlagen kopiert werden sollen an.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. Das kann entweder durch Direkteingabe erfolgen oder über den Dateidialog. Der ausgefüllte Inhalt der Variablen ersetzt dann beim kopieren die Platzhalter.pas und bei der Variablen wird „myform“ festgelegt.

Version: $ $ 9 9 Autor: Andreas Frieß Lizenz: GFDL 64 . so wird die Kopieraktion durchgeführt und Lazarus öffnet das neue Projekt.5 Lazarus IDE Wird der Dialog jetzt bestätigt.

¨ art nun mehr als nur eine Schriftgröße erlaubt. Um das zu tun gehst du wie folgt vor: Klicke auf das Label deiner Wahl...lazarusforum.de/viewtopic. A: Dein Problem tritt auf. Autosize auf false setzen alleine hilft auch nicht.Size die Größe der Labelschrift festlegen. kannst du nun auch über Font. Wenn du auf die Eigenschaft Font (nicht aufs +) klickst.¨ Nun auf ¨ klicken und ne Schriftart mit beliebiger Schriftgröße festlegen.6 Codebeispiele & FAQ 6.heightïm Gegenzug und scheint meine Änderung ausgleichen zu wollen.php?p=16109#16109 ¨ Q: Ändere ich den Wert der Eigenschaft ¨ font. Die Schriftgröße ändert sich aber nicht. Version: $LastChangedRevision: 59 $ 1 1 Autor: Andreas Frieß Lizenz: GFDL 65 . dahinter ¨ ... erscheint ein Feld. Im Objektinspektor erscheint eine ¨ ¨ Eigenschaft Fontmit nem + davor.1 Oberfläche Schrift auf einen Label ändert sich nicht Aus dem Thread http://www. wenn du noch keine Schriftart ausgewählt hast.sizeändert sich die Eigenschaft ¨ font.1.1 FAQ 6. Wenn die Schrift.

dann kann man in das Verzeichnis ’fpc/packages/fcl-db’ gehen und mit ’make clean all OPT=’-gl” das Paket neu kompiliren.. Die Fehlersuche wird aber nur Personen empfohlen. Active.1 SQLdb 7. Für Clientdatenbanken (Dbase. FoxPro. die einige automatismen eingebaut hat.2. In diesem Kapitel wollen wir uns die Komponenten einmal genauer ansehen. Das Bild aus der Wiki aus dem englischen Lazarusforum[LazEn]2 erklärt schön. muß man sich vor Augen halten. das ist hier die Frage ? Um diese Frage zu beantworten.1 auf Seite 84 http://wiki. was man von der Komponente will. Besonders die TSQLQuery ist eine mächtige Komponente.. Open oder ExecSQL . aber oft das Gegenteil bewirken können. Die FCL wird standardmässig nicht mit den für den Debugger notwendigen Informationen kompiliert.7 Bibliotheken 7. die entsprechendes Wissen über die SQLdb Komponenten haben.lazarus. die zwar das Leben erleichtern sollen. Mittels dem Befehl Open fordert man eine Datenmenge. da der Kode so kompakter und kleiner ist. wie die Komponenten zusammenhängen und in welchen Units sie sich befinden.freepascal. anschliessen die neuen PPU’s über die alten kopieren.) sind die Komponenten unter ’Client Access’1 vorgesehen. für das Verwalten von Transaktionen (TSQLTransaction) und dem Verwalten von Datenmengen (TSQLQuery). die 1 2 Siehe Kapitel 7.org/SQLdb_Programming_Reference 66 .1... so muß man die fcl-db neu kompileren.1 Beschreibung Einleitung SQLdb wird speziell für Serverbasierende Datenbanken verwendet und besteht im Wesentlichen aus Komponenten für die Verbindung (TxxxConnection). Wenn man für die Fehlersuche es anders benötigt. Debbuging von SQLdb SQLdb ist ein Teil der FCL und nicht direkt von Lazarus. Dazu muß man die kompletten FCL Sourcen haben..

Denn die können Datenmengen sehr wohl. ’DELETE’. Vergisst man auf ApplyUpdates so ist dieses schlimmer als auf CancelUpdates zu vergessen.7 Bibliotheken Kardinalität3 einer Datenmenge4 kann auch Null sein. 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. Welche Statements in SQL liefern überhaupt Datenmengen zurück ? Eigentlich gilt das nur für das ’SELECT’ Statement. alle anderen (’INSERT’..1. Diese können eine Kombination im Verhalten darstellen. Prinzipiell muß man jetzt zwei Wege unterscheiden.1. Arbeitet man mit Transdaktionen.. Dort ist dann ein ExecSQL angebracht und es können Datenmengen zurückgeliefert werden. weil die Datenmenge sowieso nur lokal gefiltert werden kann. Ob man jetzt ’Open’ verwendet oder ’Active:=true. das bei allen Daten liefernden Statements das Open zu verwenden ist. Dazu muß man unterscheiden in Desktop Datenbanken und Server Datenbanken. ’UPDATE’. um diese Änderung auch in der Datenbank sichtbar zu machen. aber wo ? Die Standardantwort ist im Stile von Radio Eriwan: ’Dort wo es sinnvoll ist’.1 auf Seite 30 siehe Kapitel 3. Filtern. . an. dann soltte man ohne zwingenden Grund nicht mit ApplyUpdates das Transaktionsmanagment stören. Zusammenfassung: • Open. Damit wird am lokalen Rechner Netzwerkleistung.1 auf Seite 28 67 . Bei Desktop Datenbanken kann die Frage schon obsolet sein. Eine Besonderheit ist die Behandlung von ’Stored Procedure’ und ’Functions’ auf SQL-Servern. Speicher und Resourcen geschont.’ macht ist letztlich egal. Somit kann 3 4 siehe Kapitel 3.) führen etwas aus. Active: Bei der Verwendung von ’SELECT’ • ExecSQL: Für alle anderen Statements Wie kommen die geänderten Daten in die Datenbank Eine änderung der Datenmenge alleine ist nicht ausreichend. Mit ExecSQL wird nur eine Aktion angefordert ohne das eine Datenmenge zurück erwartet wird. Anderseits wenn man ohne explzite Transaktionen arbeitet. wenn man eine Datenmenge öffnet beziehungsweise anfordert. Denn ohne dem ApplyUpdates sind die Daten bei den meisten Datenbanken ganz einfach nicht in die Datenbank eingearbeitet und somit verloren. Dazu muß man sich vor Augen halten. Somit ist klar. Ich bin der Meinung. also Datenmengen öffnet ohne vorher Transaktionen geöffnet zu haben. ’Open’ führt genau dieses Statement aus. das man sich für einen der Wege entscheiden sollte. dann darf man nicht vergessen die Änderungen entweder mittels ApplyUpdates zu übernehmen oder mittels CancelUpdates zu verwerfen. effizient vor verarbeiten und nur die wenigen Ergebnisse zurück transportieren. Bei Datenbankenservern schaut die Sachlage ganz anders aus. liefern aber keine Daten zurück. wo man eine Datenmenge überhaupt filtern kann.

Einmal den Fall. Bis jetzt ist die Unterstützung auch nicht wirklich vorhanden. man weiß aber nicht um wie viel verfahren wurde. das die Datenmenge null ist. Somit ist klar.. Navigieren durch eine Datenmenge Für das Navigieren durch die Datenmenge stehen ein paar Befehle zur Verfügung. rückwärts mit negativen Zahlen. so ist das ein Zeichen. Werden aber Daten erst am lokalen Rechner verknüpft.Anfang der Daten Beginn of File . das man die Anzahl wissen will. mit ’last’ zum letzten. Anzahl der Datensätze abfragen Hier kann man generell zwei verschiedene Fälle unterscheiden.7 Bibliotheken man hier dem filtern am Server den Vorzug geben. so wird nicht die volle Distanz erreicht worden sein. Somit kann man diese genau für diesen Fall verwenden. Generell ist es nur dann sinnvoll die Anzahl der Datensätze zu bestimmen. Genau diese macht die Methode ’IsEmpty’. mit ’next’ springt man auf den nächsten und mit mit ’prior’ zum vorhergehenden Datensatz. 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 . Größere Bewegungen kann man mit ’MoveBy’ machen. Ob Datensätze überhaupt vorhanden sind. Weiters handelt es sich hier eher um eine Eigenschaft von Desktopdatenbanken. so kann man oft nur lokal filtern. Sind beide vorhanden (’true’) so muß die Datenmenge leer sein. wenn eine Abfrage aktiv ist. bei ’EOF’ am Ende der Datenmenge steht. 5 6 End of File . ob überhaupt Datensätze vorhanden sind und dem Fall. das es stark auf das Design der Applikation an kommt. Was ist BOF und EOF ’BOF’ bedeutet das man in der Datenmenge am Anfang. das man wissen will. das ein ’MoveBy’ nicht zwingend die volle Distanz verfahren kann. was sinnvoll ist. wenn die Grenzen der Datenmenge erreicht werden.Ende der Daten 7 Ist genaugenommen die Verbindungskomponente 68 . Das funktioniert vorwärts mit positiven Zahlen. Die Anzahl selbst der Datensätze. Mit ’first’ kommt man zum ersten. die Anzahl ermitteln. kann man über die Abfrage von EOF5 und BOF6 machen.. kann man theoretisch mittels der Eigenschaft ’RecordCount’ abfragen. Alledings muß dazu auch der Datenbanktreiber7 das unterstützen. denn dort kann die Anzahl der Datensätze nicht anders festgestellt werden. Wenn zum gleichen Zeitpunkt beide vorhanden sind. Allerdings muß man bedenken. Wenn also ein EOF oder BOF nach dem ’MoveBy’ ansteht.

Im SQL-Statement werden die Parameter durch einen Doppelpunkt am Anfang des Names kenntlich gemacht. Methode von TxxxConnection>TSQLConnection 8 9 auch Attribute genannt Schlüssel können über mehrere Felder gehen um eindeutig zu sein. Setzt ganz einfach die Eígenschaft active auf false. Schlüssel erzwingen eine Eindeutigkeit. Die Werte werden über die ’Values’ Eigenschaft als variant zugewiesen oder über die entsprechenden ’AsInteger’. ’AsString’ und ’As.Params.’..7 Bibliotheken Zugriff auf Felder Auf die Felder8 kann über die Eigenschaft ’Fields’ zugegriffen werden.2 TxxxConnection Genau genommen handelt es sich hier nicht nur um eine einfache Deklaration der Verbindung sondern um den lokalen Verwaltungsteil der Datenbank. 7. Hier werden die gemeinsamen Methoden und EIgenschaften behandelt..Zusätzlich kann über die Methode ’ParamsByName’ mittels des Feldnamens einfach auf die einzelnen Felder zugegriffen werden.’. Zugriff auf Parameter Auf die Felder der Parameter kann über die Eigenschaft ’Params’ zugegriffen werden.. Close procedure Close. override.ParamByName(’ Schlüsselfelder Als Schlüsselfelder werden die Felder9 bezeichnet in dem der primäre Schlüssel der Tabelle gespeichert ist. damit die Komponenente richtig die Datensätze ändern oder löschen kann.. Methode von TxxxConnection>TSQLConnection>TDatabase>TCustomConnection EndTransaction procedure EndTransaction. Zusätzlich kann über die Methode ’FieldByName’ mittels des Feldnamens oder ’FieldByNumber’ einfach auf die einzelnen Felder zugegriffen werden. Dieser sollte bei jeder änderbaren Datenmenge definiert sein.1. Die Zuweisung im Programm erfolgt über TQ1. row2) values (:param1. :param2) Hier ist ’:param1’ einer der Parameter... Ruft die entsprechede Methode der Komponente Transaction auf. im Folgenden die verschiedenen Connection mit den abweichenden Details behandelt. ’AsString’ und ’As. Die Werte werden über die ’Values’ Eigenschaft als variant zugewiesen oder über die entsprechenden ’AsInteger’... Zum Beispiel: insert tablex (row1. oder weil sie zusammengesetzt sind 69 .

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

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

7 Bibliotheken Eigenschaft von TxxxConnection>TSQLConnection Zugriff: Lesend und schreibend KeepConnection property KeepConnection. Eigenschaft von TxxxConnection>TSQLConnection>TDatabase>TCustomConnect Zugriff: Lesend und schreibend Params property Params : TStrings read FParams Write FParams. wenn LoginPrompt true ist. ToDo Eigenschaft von TxxxConnection>TSQLConnection>TDatabase Zugriff: Lesend und schreibend LoginPrompt property LoginPrompt: Boolean read FLoginPrompt write FLoginPrompt. Eigenschaft von TxxxConnection>TSQLConnection>TDatabase Zugriff: Lesend und schreibend Password Enthält das Passwort für die Verbindung. Nicht benötigt. Enthält spezielle Parameter für die Verbindung. Gibt an ob ein Login Prompt beim verbinden automatisch erzeugt werden soll. ToDo Eigenschaft von TxxxConnection>TSQLConnection Zugriff: Lesend und schreibend 72 . Eigenschaft von TxxxConnection>TSQLConnection>TDatabase Zugriff: Lesend und schreibend Role Property Role : String read FRole write FRole.

1. Eigenschaft von TxxxConnection>TSQLConnection Zugriff: Lesend und schreibend Jede Datenbank hat ihre spezielle Verbindung (Connection).1.1.5 TMySQL40Connection Jede Datenbank hat ihre spezielle Verbindung (Connection). Dies hier ist die Verbindung zu MySQL 5.1 7.4 TMySQL41Connection Jede Datenbank hat ihre spezielle Verbindung (Connection). 7.6 TOracleConnection Jede Datenbank hat ihre spezielle Verbindung (Connection). Dies hier ist die Verbindung zu MySQL 4. Eigenschaft von TxxxConnection>TSQLConnection Zugriff: Lesend und schreibend UserName property UserName : string read FUserName write FUserName.3 TMySQL50Connection Jede Datenbank hat ihre spezielle Verbindung (Connection).0 7.0 7. ToDo Eigenschaft von TxxxConnection>TSQLConnection>TDatabase>TCustomConnection Zugriff: Lesend und schreibend Transaction property Transaction : TSQLTransaction read FTransaction write SetTransaction Gibt die Transaktions Komponente an. Enthält den Benutzernamen für die Verbindung beziehungsweise für den Zugriff auf die Datenbank. Dies hier ist die Verbindung zu MySQL 4. Dies hier ist die Verbindung zu Oracle.1. 73 .7 Bibliotheken StreamedConnected property Streamedconnected: Boolean read FStreamedConnected write FStreamedConnected.

Führt ein Commit durch. virtual.1.8 TODBCConnection Jede Datenbank hat ihre spezielle Verbindung (Connection). Die Transaktion wird eröffnet. virtual. wenn wegen vergessener Eingabe bei Arbeitscschluß eine Transaktion aktiv bleibt und deshalb eine Sperre auf einer Datenbank liegt. Nach der Transaktion müssen die Daten konsistent sein. auch. Das heisst. bezeichnet. D) Dauerhaft. Auch bei widrigen Umständen dürfen die Transaktionen nicht verloren gehen oder vergessen werden. 7. Deshalb soll eine Transaktion nur solange aufrecht erhalten werden wie es unbedingt nötig ist. dann die Handlungen an der Datenbank gesetzt und die Transaktion entweder mit ’Rollback’ wenn sie zurückgenommen werden soll oder mit ’Commit’ wenn die Änderderungen dauerhaft übernommen werden sollten. Aktionen wie Sperren. Transaktionen müssen die ACID-EIgenschaft garantieren. 7. abgeschlossen.7 Bibliotheken 7. A) Atomität.1. Schliesst die Transaktion ab Methode von TSQLTransaction CommitRetaining procedure CommitRetaining. C) Konsistenz. während einer Benutzereingabe oder sonstiger Wartezeit sollte keine Transaktion stattfinden. Der Ablauf einer Transaktion ist relativ einfach. Besonders bei Mehrbenutzersystemen kann das bis zum Stillstand der Datenbank führen. Man muß sich nur vor Augen halten. Commit procedure Commit. Daher auch an allen geänderten Stellen den gleichen Inhalt haben. die eine Einheit bilden. mehrere gelichzeitig laufende Transaktionen dürfen sich nicht gegenseitig beeinflussen. bei Rücksicherungen nach Absturz. Dies hier ist die Verbindung zu den ODBC Treibern. I) Isolation. das heißt untrennbar. Methode von TSQLTransaction 74 . Wenn es die Datenbank nicht unterstützt. die Auswirkungen der Transaktion müssen im Datenbestand dauerhaft sein.7 TPQConnection Jede Datenbank hat ihre spezielle Verbindung (Connection). so wird es von der SQLdb Komponete simmuliert. Duplizieren oder auch Warten durchführen muß. Dies hier ist die Verbindung zu PostGreSQL Datenbanken. Es wird entweder alles oder nichts durchgeführt. lässt aber die Datenmenge offen.9 TSQLTransaction Als Transaktion wird eine feste Folge von Operationen.1. zB. das das Datenbanksystem um die ACID Eigenschaften garantieren zu können.

override. Gibt den Namen der Verbindung (=Datenbank) an. Startet die Transaktion Methode von TSQLTransaction Action property Action : TCommitRollbackAction read FAction write FAction. virtual. führt ein normalerweise ein Rollback durch. so wird es von der SQLdb Komponete simmuliert. Methode von TSQLTransaction StartTransaction procedure StartTransaction. Eigenschaft von TSQLTransaction>TDBTransaction Zugriff: Lesend und schreibend 75 . override. Führt ein Rollback durch. ToDo Eigenschaft von TSQLTransaction Zugriff: Lesend und schreibend Database Property DataBase : TDatabase Read FDatabase Write SetDatabase. Wenn es die Datenbank nicht unterstützt.7 Bibliotheken EndTransaction procedure EndTransaction. macht daher die Änderungen nicht aktiv. Methode von TSQLTransaction Rollback procedure Rollback. Beendet die Transaktion. Rollt die Transaktion zurück. lässt aber die Datenmenge offen. virtual. Methode von TSQLTransaction RollbackRetaining procedure RollbackRetaining.

Überträgt die Änderungen von der Datenmenge in die Datenbank. Sie wird sowohl für DDL10 . Enthält spezielle Parameter für die Verbindung. DML11 und DCL12 verwendet Methoden von TSQLQuery Im folgenden sind hier die wichtigsten Methoden beschrieben. overload. virtual. virtual.1.1.2 auf Seite 41 Datenveränderungssprache siehe Kapitel 3. Eigenschaft von TxxxConnection>TSQLConnection>TDatabase Zugriff: Lesend und schreibend 7. Methode von TSQLQuery>TBufDataset Close procedure Close. procedure ApplyUpdates(MaxErrors: Integer). Somit wird die Datenmenge geschlossen. ApplyUpdates procedure ApplyUpdates. Es ist nicht nur ein Behälter für Abfragen (Query) sondern die Kapselung für die Datenmenge.1.3 auf Seite 41 12 Datenkontrollsprache siehe Kapitel 3.7 Bibliotheken Params property Params : TStrings read FParams Write FParams. virtual.4 auf Seite 41 76 . über die Komponente läuft eigenlich alles bezüglich Daten und Datenmenge. Methode von TSQLQuery 10 11 Datendefinitionssprache siehe Kapitel 3. Das heisst.10 TSQLQuery Allgemeines Der Name beschreibt nur unzureichend die Komponente. overload. Die Änderungen an der Datenmenge werden verworfen. Standardmethoden wie ’Create’ oder ’Free’ werden hier nicht beschrieben.1. ’ApplyUpdates’ entspricht ’ApplyUpdates(0)’. Setzt die Eigenschaft ’Active’ auf ’false’. Methode von TSQLQuery>TBufDataset CancelUpdates procedure CancelUpdates.

wenn die Datenmenge leer ist. Führt die in der Eigenschaft SQL definierten SQL-Befehle aus und liefert die Datenmenge zurück.) Methode von TSQLQuery>TBufDataset Parameter keyfields: string Angabe des Suchfeldes keyvalues: Variant Inhalt nach dem gesucht wird options: TLocateOptions Scheibweise egal ’loCaseInsensitive’. Beim Suchen selbst sind keine Wildcards erlaubt (’*’. ’%’. Methode von TSQLQuery Prepare procedure Prepare. das das SQL-Statement endgültig ist. nur mehr 77 . das das Ergebnis immer false ist. options: TLocateOptions) : boolean. Sonderfall ’Stored Procedure’ kann unter umständen Datenmengen zurück liefern.. Die Komponente geht davon aus. nur eine Teilmenge ’loPartialKey’ Open procedure Open. Ausserdem ist die Prüfung nur dann sinnvoll wenn eine Abfrage aktiv ist. Methode von TSQLQuery>TBufDataset>TDBDataset>TDataSet Locate function Locate(const keyfields: string. wenn die Datenmenge im Zustand ’dsinsert’ ist. Zu beachten ist. liefert aber keine Datenmenge zurück. Führt die in der Eigenschaft SQL definierten SQL-Befehle aus. Mittels Prepare wird die Komponente darauf vorbereitet. Gibt true zurück. es ist derzeit nur möglich in einem Feld zu suchen.. sprich ein Datensatz eingefügt wird. const keyvalues: Variant. Achtung. override.. das es den Ablauf optimieren kann.7 Bibliotheken ExecSQL procedure ExecSQL. nicht in mehreren. Methode von TSQLQuery IsEmpty function IsEmpty: Boolean. Überprüft ob die Datenmenge leer ist. Intern wird die Eigenschaft ’Active’ auf ’true’ gesetzt.

werden hier nur die wichtigsten erläutert. Kann folgende zustände annehmen : Keine Änderungen ist ’usUnmodified’. stColumns. Setzt die durch Prepare ausgelösten Vorverarbeitungen zurück. Methode von TSQLQuery SetSchemaInfo procedure SetSchemaInfo( SchemaType : TSchemaType. Wie schon bei den Methoden. Einfügungen ’usInserted’ und bei Löschungen ’usDeleted’. Methode von TSQLQuery Parameter SchemaType : TSchemaType Kann folgende Werte annehmen: stNoSchema. Gibt den Status des Zwischenspeicher für geänderte Daten an.7 Bibliotheken die Parameter können sich ändern. stPackages. wenn man Prepare verwendet hat. SchemaPattern : string). stProcedures. SchemaObjectName : string SchemaPattern : string Unprepare procedure Unprepare. override. Methode von TSQLQuery>TBufDataset Eigenschaften von TSQLQuery Hier beginnt die Beschreibung der wichtigsten Eigenschaften und Ereignisse. 78 . Die Komponente kann die Staements an die Server leiten und diese können die Befehle jetzt vorkompilieren und optimieren. Sollte immer vor Änderungen an der Komponente aufgerufen werden. Somit können die Statement verarbeitet werden und die Verbindungen vorbereitet. SchemaObjectName. stTables. Zusätzlich wird der Datenbankzugriff auf nur lesen gesetzt. stIndexes. stSysTables. die aktuellen SQL Statements gehen dabei verloren und werden durch die neuen Informationen ersetzt. stProcedureParams. Setzt das Schema. Methode von TSQLQuery UpdateStatus function UpdateStatus: TUpdateStatus. bei Änderungen ’usModified’.

wenn definiert. Eigenschaft von TSQLQuery Zugriff: Lesend und schreibend 79 . da die transportierte Datenmenge geringer ist.siehe auch ’Serverfiltered’. Sagt aus ob die Komponente derzeit aktiv ist und eine Datenmenge zurückliefert. Gibt die zuständige Databasekomponente (TxxxConnection) an. Ein setzen auf ’true’ entspricht der Methode ’Open’ und ein setzen auf ’false’ entspricht der Methode ’Close’. Entspricht einer ’WHERE’-Klausel bei einem SQL Statement . Enthält den Filter für die Datenmenge. Normalerweise ist eine Filterung am Server vorzuziehen.7 Bibliotheken Active property Active: Boolean read GetActive write SetActive default False. Eigenschaft von TSQLQuery Zugriff: Lesend und schreibend Defaultwert: false Filter property Filter: string read FFilterText write SetFilterText. 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. Wird erst aktiv durch aktivieren der Eigenschaft ’Filtered’. Eigenschaft von TSQLQuery Zugriff: Lesend und schreibend Defaultwert: false Database property Database.

Weiters wird dann auch UsePrimaryKeyAsKey ausgewertet und zusätzlich. DeleteSQL und InsertSQL durchgeführt. Ein setzen der Eigenschaft bewirkt. Es kann sein. was sich durch dubiose SQLFehler zeigt. Kleinschreibung und ’foNoPartialCompare’ schaltet die Erkennung von Teilen beim Filtern aus. Enthält die Parameter für die SQLStatements Eigenschaft von TSQLQuery Zugriff: Lesend und schreibend ParseSQL property ParseSQL : Boolean.7 Bibliotheken Filtered property Filtered: Boolean read FFiltered write SetFiltered default False. das der Filter aktiv wird und die Datenmenge entsprechend eingeschränkt wird. Eigenschaft von TSQLQuery Zugriff: Lesend und schreibend FilterOptions property FilterOptions: TFilterOptions read FFilterOptions write SetFilterOptions. wenn nicht schon vorhanden. Gibt an ob die Datenmenge gefiltert ist. Mit dieser Eigenschaft wird angezeigt ob die Komponente den SQL-Text auswerten soll. so kann der Text für die Optimierung der Indexe etwas umgestellt werden. Wirkt nur auf die lokale Filterung und nicht auf die Serverfilter. Eigenschaft von TSQLQuery>TBufDataset>TDBDataset>TDataSet Zugriff: Lesend und schreibend Params property Params : TParams. Eigenschaft von TSQLQuery Zugriff: Lesend und schreibend 80 . Dann kan man versuchen das ParseSQL und UsePrimaryKeyAsKey auszuschalten und alle Queries von Hand richtig zu setzen. Soll sie den SQL-Text auswerten. die Vorbereitungen für die UpdateSQl. Möglich sind ’foCaseInsensitive’ ignoriert Groß-. das die Query in machen fällen schlecht ausgewertet wird.

Somit erfolgt die Filterung bereits am Server. das der Filter am Server aktiv wird und die Datenmenge dort entsprechend eingeschränkt wird. Wenn nichts implementiert wird. Gibt den Status an. Ob die Eigenschaft verfügbar ist. Gibt an ob die Datenmenge am Server gefiltert ist. wenn definiert. hängt von der Connectionkomponente ab. Eigenschaft von TSQLQuery Zugriff: Nur lesend RecordCount property RecordCount: Longint read GetRecordCount.7 Bibliotheken Prepared property Prepared : boolean read IsPrepared. so kommt bei einer Abfrage der Wert ’-1’ zurück. ansonsten kann es zu Laufzeitfehlern kommen. Sinnvoller weise sollte eine Abfrage aktiv sein. Eigenschaft von TSQLQuery Zugriff: Nur Lesend ServerFiltered property ServerFiltered: Boolean read FServerFiltered write SetServerFiltered default False. Enthält den Filter für die Datenmenge. Ein setzen der Eigenschaft bewirkt. Eigenschaft von TSQLQuery>TBufDataset>TDBDataset>TDataSet Zugriff: Nur lesend ServerFilter property ServerFilter: string read FServerFilterText write SetServerFilterText. ob die Komponente Vorverarbeitung aktiviert hat. Wird erst aktiv durch aktivieren der Eigenschaft ’ServerFiltered’. Ansonsten die Anzahl der Datensätze der Abfrage. Zeigt an ob auf die Datenmenge nur lesend zugegriffen werden kann. Intern wird der Filter in eine ’WHERE’-Klausel umgesetzt. Eigenschaft von TSQLQuery Zugriff: Nur lesend ReadOnly property ReadOnly : Boolean. 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 befindet sich das SQL Statement was ausgeführt werden soll. Ist es ein einfacheres Select-Statement so kann TSQLQuery auch automatisch die Statements für Änderungen (UpdateSQL), Einfügen (InsertSQL) und Löschen (DeleteSQL) ausfüllen. Ist das SQL Statement komplexer so geht diese automatik manchmal ins Leere, kann die Statements nicht richtig auswerten und verursacht unerklärliche Probleme. UpdateSQL: Hier stehen die SQL Statements um Änderungen in der Datenmenge durchzuführen. InsertSQL: Die Statements um Datensätze einzufügen. DeleteSQL: Statements um Datensätze zu löschen. 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 näher ansehen. Eigenschaft von TSQLQuery Zugriff: Lesend und schreibend Transaction property Transaction; Gibt die zuständige Transaktionskomponente an. Eigenschaft von TSQLQuery Zugriff: Lesend und schreibend StatementType property StatementType : TStatementType read GetStatementType; Möglich 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 Datensätze geändert werden sollen. Möglich sind alle Datensätze ’upWhereAll’, nur die geänderten Datensätze ’upWhereChanged’ oder nur welche wo der Schlüssel bekannt ist ’upWhereKeyOnly’. Eigenschaft von TSQLQuery Zugriff: Lesend und schreibend UsePrimaryKeyAsKey property UsePrimaryKeyAsKey : boolean; Wenn aktiv, so benutzt ParseSQL den Primärschlüssel immer als Schlüssel zu verwenden. Kann bei komplexeren Abfragen manchmal zu Problemen führen, 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 für die lokale Verwaltung von Datenbanken, auch lokale Datenbanken genannt, zuständig. Für die Erstellung, Verwaltung und Zugriff auf Dbase und Foxpro Datenbanken ist die Komponenete ’TDBF’ zuständig. Für Datenbanken direkt im Speicher ist die Komponenete ’MEM’, für Datenbanken mit eine festen Format (CSV) die Komponente ’FIXED’ und Textbasierende Datensätze mittels der Komponente ’SDF’. Für Serverdatenbanken sind die Komponenten auf der Seite ’SQLdb’14 zu verwenden. Die Komponente ’TDatasource’ dient unter andern als Verbindung zu den grafischen 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 standardmässig nicht vorhanden. Dazu muß erst das Paket ’sqlite3laz 0.3’oder besser installiert werden. Nach dem neu erstellen der IDE, befindet sich die Komponente hier. ExecSQL procedure ExecSQL(const ASql:String); Führt den in ASql definierten String aus, liefert aber keine Datenmenge zurück. procedure ExecSQL; Führt die in der Eigenschaft SQL definierten SQL-Befehle aus, liefert aber keine Datenmenge zurück. Methode von TSqlite3Dataset

14

Siehe Kapitel 7.1.1 auf Seite 66

84

Führt die in der Eigenschaft SQL definierten SQL-Befehle aus. Wenn true. liefert aber keine Datenmenge zurück. Führt den in ASql definierten String aus. Ein setzen auf ’true’ entspricht der Methode ’Open’ und ein setzen auf ’false’ entspricht der Methode ’Close’. procedure ExecSQL. Eigenschaft von TSqlite3Dataset>TCustomSqliteDataset>TDataSet Zugriff: Lesend und schreibend Defaultwert: false SaveOnClose property SaveOnClose: Boolean read FSaveOnClose write FSaveOnClose. dann wird beim Schliessen der Datenmenge automatisch ein ApplyUpdates durchgeführt. liefert aber keine Datenmenge zurück.7 Bibliotheken ApplyUpdates function ApplyUpdates: Boolean. Überträgt die Änderungen von der Datenmenge in die Datenbank. Methode von TSqlite3Dataset Active property Active: Boolean read GetActive write SetActive default False. Sagt aus ob die Komponente derzeit aktiv ist und eine Datenmenge zurückliefert. dann wird vor dem Holen neuer Datenmengen automatisch ein ApplyUpdates durchgeführt. Eigenschaft von TSqlite3Dataset>TCustomSqliteDataset Zugriff: Lesend und schreibend 85 . Wenn true. Methode von TSqlite3Dataset>TCustomSqliteDataset ExecSQL procedure ExecSQL(const ASql:String). Eigenschaft von TSqlite3Dataset>TCustomSqliteDataset Zugriff: Lesend und schreibend SaveOnRefetch property SaveOnRefetch: Boolean read FSaveOnRefetch write FSaveOnRefetch.

In SQL befindet sich das SQL Statement was ausgeführt werden soll. Eigenschaft von TSqlite3Dataset>TCustomSqliteDataset Zugriff: Lesend und schreibend Version: $$ 15 15 Autor: Andreas Frieß Lizenz: GFDL 86 .7 Bibliotheken SQL property SQL: String read FSql write FSql.

Die Homepage befindet sich unter http://lnet.2 Installation Version: $$ 16 16 Autor: Andreas Frieß Lizenz: GFDL 87 .7 Bibliotheken 7.3.com/ die Programmierer sind Ales Katona (Main programmer aka Almindor) und Micha Nelissen (HTTP server and client programmer aka neli).3 lNet 7.wordpress. 7.und TCP-Protokolle im Internet.3.1 Beschreibung Einleitung Leightweight NETworking Library enthält Klassen und Komponenten zur Kommunikation über UDP.

Parameter DateTime : TDateTime Das Datum das in ein Uhrzeit im Textformat gewandelt wird. Graphics. Forms. Löscht ein Verzeichnis komplett. Dialogs. da ein Aufruf auf das Wurzelverzeichnis alles löscht. Wandelt ein Datum in einen Stunden/Minuten String um wie zum Beispiel 05:30. Parameter 17 JCL 88 .4 utils. FileUtil. Ein Abschliessender „/“ ist nötig. Result Rückgabe: string Die in einen Uhrzeit String gewandelte Datum. SysUtils.pas 7. DateTimeToHourString function DateTimeToHourString(DateTime : TDateTime) : string.4. weil diese Routinen in dieser oder ähnlicher Form auch nicht in der JCL17 [12] oder ähnlichen Sammlungen vorkommen. Abhängigkeiten Es bestehen Abhängikeiten zu Classes. Die Funktion arbeitet rekursiv. Wandelt ein Datum in einen industriellen Stunden/Minuten String um wie zum Beispiel 0530.1 Beschreibung Einleitung Diese Unit wurde ürsprünglich von Christian Ulrich[11] geschrieben.4. DateTimeToIndustrialTime function DateTimeToIndustrialTime(dateTime : TDateTime) : string.7 Bibliotheken 7.2 Code ClearDir function ClearDir (Path: string): boolean. Result Rückgabe: boolean true wenn erfolgreich. Parameter Path: string Der Pfad der zu löschen ist. Vorsicht ist geboten. Clipbrd. daher löscht sie auch enthalten Verzeichnisse. Process. false wenn ein Problem war. Translations zusätzlich bei Windows noch zu Registry und Windows 7. da es keine weiteren Sicherheitsabfragen gibt.

Standard ist das aktuelle. Result Rückgabe: string Die in einen Uhrzeit String gewandelte Datum. die an das externe Programm übergeben wird. DrawText procedure DrawText(Canvas : TCanvas. ansonsten eine Fehlermeldung. Result Rückgabe: string Ist der von dem Programm auf de Kommandozeile ausgegeben Text. 89 . CurDir : string = ”) : string. Führt ein externes Programm aus. Parameter s: STRING Der String gewandelt werden soll. Zeichnet den Text auf den Canvas. Standard ist nein ExecProcessEx function ExecProcessEx(CommandLine : string. Result Rückgabe: boolean True wenn der Sting in eine Zahl gewandelt werden kann. Str : string.7 Bibliotheken DateTime : TDateTime Das Datum das in ein Uhrzeit im Textformat gewandelt wird. 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. Parameter CommandLine : string Die Kommandozeile. Überprüft ob ein String in eine Zahl gewandelt werden kann. IsNumeric FUNCTION IsNumeric(s: STRING): boolean. CurDir : string Das Verzeichnis das aktuellsein soll. false wenn er nicht gewandelt werden kann. CenterV : Boolean = False. Rect : TRect. Standard ist nein CenterH : Boolean Ob Horizontal zentriert wird. CenterH : Boolean = False). wenn Erfolgreich.

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

Result Rückgabe: string . 91 . Result Rückgabe: string . Result Rückgabe: string . Beschreibung fehlt Parameter app : string . GetGlobalConfigDir function GetGlobalConfigDir(app : string) : string. GetTempPath function GetTempPath : string. GetConfigDir function GetConfigDir(app : string) : string. Beschreibung fehlt Parameter D : string . Result Rückgabe: string . Beschreibung fehlt Result Rückgabe: string .7 Bibliotheken Parameter old : string . ValidateDate function ValidateDate(D : string) : string. Beschreibung fehlt Parameter app : string .

HexToBin function HexToBin(h: STRING): dword. Beschreibung fehlt Parameter Site : string . GetMainIconHandle function GetMainIconHandle : Cardinal. Gibt das Handle auf das Haupt Icon der Anwendung zurück. Beschreibung fehlt Parameter size : Longint . CanWriteToProgramDir function CanWriteToProgramDir : Boolean. Result Rückgabe: Cardinal Das Handle auf das Haupt Icon der Anwendung. Result Rückgabe: boolean . Result Rückgabe: dword . das in der Taskleiste beziehungsweise am linken oberen Fensterrand befindet. OpenBrowser function OpenBrowser(Site : string) : Boolean. 92 .7 Bibliotheken SizeToText function SizeToText(size : Longint) : string. Beschreibung fehlt Parameter h: STRING . Das ist das Icon. Result Rückgabe: string . Beschreibung fehlt Result Rückgabe: boolean .

Waitfor : Boolean = True). 93 . RoundTo function RoundTo(const AValue : extended . TimeTotext function TimeTotext(Seconds : Integer) : string. ExecProcess procedure ExecProcess(CommandLine : string. Beschreibung fehlt Parameter AValue : extended . const ADigit : TRoundToRange) : extended . ADigit : TRoundToRange . Result Rückgabe: extended .7 Bibliotheken LoadLanguage procedure LoadLanguage(lang : string). Beschreibung fehlt Parameter lang : string . CurDir : string .CurDir : string = ”. Beschreibung fehlt Parameter Seconds : Integer . Beschreibung fehlt Parameter CommandLine : string . Result Rückgabe: string . Waitfor : Boolean .

Result Rückgabe: string . Beschreibung fehlt Parameter InfoTyp : TProcessinfoTyp . CurDir : string .CurDir : string = ”.Waitfor : Boolean = True). GetSystemLang function GetSystemLang : string. Beschreibung fehlt Result Rückgabe: string . GetProcessforExtension function GetProcessforExtension(InfoTyp : TProcessinfoTyp. Result Rückgabe: string . 94 . Beschreibung fehlt Parameter CommandLine : string . GetMimeTypeforExtension function GetMimeTypeforExtension(Extension : string) : string.Extension : string) : string. Extension : string . Waitfor : Boolean . Beschreibung fehlt Parameter Extension : string .7 Bibliotheken ExecVisualProcess procedure ExecVisualProcess(CommandLine : string.

Version: $LastChangedRevision: $ 18 18 Autor: Andreas Frieß Lizenz: GFDL 95 .7 Bibliotheken RPos function RPos(const Substr: string. Result Rückgabe: string . StripHTML function StripHTML(S: string): string. Beschreibung fehlt Parameter Substr: string . const S: string): Integer. StrTimeToValue FUNCTION StrTimeToValue(val : string) : LongInt. S: string . Result Rückgabe: LongInt . SystemUserName function SystemUserName : string. Beschreibung fehlt Result Rückgabe: string . Beschreibung fehlt Parameter S: string . Beschreibung fehlt Parameter val : string . Result Rückgabe: Integer .

overload.5.5. Wird sie nicht verwendet so ist nil anzugeben. Result Rückgabe: string Dateiname mit Pfadangaben. overload. 7. 7. ASubDir. AFileName: string) of object. SysUtils.5. ShowContent: TSampleSearchResults Callbackfunktion die für jedes Ergebnis aufgerufen wird. AFileName: string Der Dateiname der gesucht wird. Abhängigkeiten Es bestehen Abhängikeiten zu Classes. StdCtrls.1 Beschreibung Einleitung Diese Unit wurde von Erhard Kieling[14] geschrieben und dient zur Unterstützung bei Suchvorgängen. Beispiele zur Verwendung befinden sich im LazSnippets Code Paket auf Sourceforge. Parameter AInitDir: string Das Verzeichnis in dem gesucht werden soll.2 Typendefinitionen TSampleSearchResults = procedure (ADir.3 Code SearchFile Variante 1 function SearchFile(AInitDir. Sucht in einem Verzeichnis nach einer Datei. AFileName : string. Sie muß nicht zwingend angegeben werden.5 uFileMisc. SearchFile Variante 2 function SearchFile(AInitDir. ShowContent: TSampleSearchResults): string.pas 7. Wildcards sind erlaubt. Parameter AInitDir: string Das Verzeichnis in dem gesucht werden soll. 96 . AFileName : string. AFileName: string Der Dateiname der gefunden wurde. ShowContent: TSampleSearchR string.7 Bibliotheken 7. Definition der Callbackfunktion Parameter ADir: string Das Verzeichnis in dem in dem die Datei gefunden wurde.

Clear. Self. // of if SelectDirectoryDialog1. end.5. edFileName.4 Beispiel procedure TForm1.Add(ADirName). s:= SearchFile(edStartDir. begin if SelectDirectoryDialog1. Wird sie nicht verwendet so ist nil anzugeben. Result Rückgabe: string .Text:= PathDelim.7 Bibliotheken ASubDir: string Das Unterverzeichnis in dem auch gesucht werden soll. 97 .SpeedButton1Click(Sender: TObject).Items. if (AFileName <> ’’) then begin lbFileBox.FormCreate(Sender: TObject).Button2Click(Sender: TObject).Update.Items. begin if (ADirName <> ’’) then begin lbDirBox. ShowContent: TSampleSearchResults Callbackfunktion die für jedes Ergebnis aufgerufen wird.SampleResults procedure TForm1.Text:= SelectDirectoryDialog1. AFileName: string). ’’.FileName. var s: string. Wildcards sind erlaubt.Text. 7.SampleResults(ADirName.Execute then begin edStartDir. begin edStartDir. end.Text. Sie muß nicht zwingend angegeben werden. procedure TForm1. procedure TForm1. // of TForm1.Update. lbFileBox.Execute then begin end. end. Self.Add(AFileName).Clear. end. end. begin lbDirBox. AFileName: string Der Dateiname der gesucht wird.

7 Bibliotheken @SampleResults). if (s <> ’’) then edFileName. end.Text:= s. Version: $LastChangedRevision: $ 19 19 Autor: Andreas Frieß Lizenz: GFDL 98 .

das einem gar nicht bewusst ist. Das lässt sich noch so halbwegs merken und besteht aus Groß und Kleinbuchstaben.de/ http://dev. Die Dateigröße kann schon einen Breitband Internetzugang verlangen. Dasselbe gilt natürlich in abgemilderter Form auch für normale Benutzer. ein gutes Passwort für den „root“ („Administrationsuser“) zu wählen.mysql. Die Tools sind nicht zwingend erforderlich. Mit Hilfe der beiden Tools kann man später dann den Server komfortabel administrieren und auch die Datenbanken verwalten und Scripts laufen lassen. Zur Installation geht man entsprechend den Erfordernissen seines Betriebssystems vor.com/ 99 . Denn später vergisst man gerne den laufenden MySQL-Server und wenn der Rechner dann doch im Internet auftaucht. beginnen wir nun mit der Erstellung unserer Datenbank. beinhaltet Zahlen und ist außerdem noch zwölf Zeichen lang. denn je nach Version sind bis zu knappen 100 MB Download-Volumen gefragt.1 DatenbankenMySQL5x 8. Dort kann man sich dann den entsprechenden Server für sein Betriebssystem aussuchen und herunterladen. die etwas mehr Rechte als lesen in der Datenbank haben. Ein Nachteil dabei ist. Eine Alternative dazu ist sicherlich auch das arbeiten mit „PHPMySQLAdmin“.x Am einfachsten ist es im Internet auf die MySQL-Seite1 zu gehen und dort unter „Community“2 den Punkt „Downloads“ und „MySQL Community Server“ auszusuchen. die sich dann später durch alle Beispiele ziehen wird. für jedes Betriebssystem mit seinen Eigenheiten eine entsprechende Anleitung zu erstellen. das man bei der Installation und Konfiguration nicht vergisst. das es einen Webserver mit PHP voraussetzt. Daraus kann sich ein Paßwort wie folgt ergeben „WsjnbMuh99Lg“. Aber genug dem Ausflug in die Installation und Paßwortauswahl. das man sich unter „Downloads. 1 2 http://www. so hat man ein ganz schönes Sicherheitsleck. erleichtern aber gerade am Anfang das Leben. Es würde den Rahmen dieser Beschreibung sprengen.1. Wichtig ist nur.mysql. Das Tool ist sehr ausgereift und auch entsprechend bekannt. GUI Tools“ auch noch die Programme „MySQL Administrator“ und „MySQL Query Browser“ herunterlädt. ein launiges Sprichwort zu nehmen und die Anfangsbuchstaben aneinander zu reihen. Weiters ist es zu empfehlen.8 Beispiele 8. Beispiel: „Wir sind ja nicht blöd Mann und haben 99 Luftballone gekauft“.1 Demodatenbank MySQL Installieren von MySQL 5. Eine gute Möglichkeit ist.

8 Beispiele Erstellung der DEMO Datenbank Das Erste. Ich werde jetzt die Felder von oben nach unten besprechen. das sie eine andere Sprachversion verwenden. Damit wir nicht immer die Informationen neu eingeben müssen. Diese Zeile geben wir oben im „MySQL Query Browser“ ein und drücken dann auf den grünen Button daneben. Anschliessend gehen wir mit „Ok“ im Dialog weiter. Ist bis jetzt alles gut verlaufen und der MySQL Datenbakserver aktiv. Das Feld „Standardschema“ lassen wir bei diesem ersten Einstieg einmal leer. unter der später die Einstellungen wieder abgerufen werden können. eine neue Datenbank. Somit hat der Benutzer alle Rechte außer dem Recht. ist eine neue Datenbank für unsere Zwecke. Als nächstes kommen jetzt der „Nutzername“ und das „Passwort“ dran. so öffnet sich jetzt endgültig der „MySQL Query Browser“. bei einer lokalen Installation. der noch dazu ein halbwegs sicheres Paßwort hat. „localhost“ und „3306“ ein. Dazu öffnen wir den „MySQL Query Browser“. Anschließend können wir mit der Maus auf „Schemata“ klicken und mit der Taste „F5“ ein neuerliches einlesen der Übersicht der Datenbanken (= Schemata) erreichen. Verbindungen“ benutzen und sich dort ein entsprechndes Profil anlegen. Alternativ kann man den „MySQL Query Browser“ schliessen und als Benutzer „lazarus“ neu anmelden.. Es öffnet sich als ersters das Verbindungsfenster. denn es könnte ja sein. das nun folgende Hinweisfenster zum Thema fehlendes Standardschema übergehen wir mit dem Button „Ignorieren“. Unter „Gesp.* TO lazarus@localhost. Für den produktiven Betrieb würde sich jetzt noch anbieten. kann man den Button rechts neben den „Gesp. 100 . Jetzt sollte dort unsere neue Datenbank vorhanden sein. Als ersters erzeugen wir mittels CREATE USER lazarus@localhost IDENTIFIED BY ’WsjnbMuh99Lg’. Anschließend erzeugen wir jetzt als Benutzer „lazarus@localhost“ mittels dem Kommando CREATE DATABASE ‘laztest‘ DEFAULT CHARACTER SET latin1. Bei „Server Host“ und „Port“ geben wir. einen Benutzer zu erzeugen. Zusätzlich geben wir diesen Benutzer alle Recht an dieser Datenbank mit folgenden Befehl GRANT all ON *. Später sollte man sich nur in zwingend notwendigen Fällen mit dem Administratorpaßwort verbinden. Somit haben wir die Datenbank erstellt und auch einen Beutzer mit hohen Rechten darin erzeugt. Wobei die Portnummer „3306“ der Standardport von MySQL ist. dort geben wir in diesem Fall den Benutzer „root“ mit dem bei der Installation vergebenen Paßwort ein. das Paßwort eingeben und schon ist man drinnen. einen neuen Benutzer. Im Menüpunkt „Datei“ wählen wir die Funktion „Verbindung umschalten“ an und wechseln die Verbindung auf den User „lazarus@localhost“. Somit braucht man später nur sein Profil in der Top-Down Box anwählen. mit dem Namen „laztest“. das wir am neuen oder geleerten MySQL Datenbankserver erstellen. selbst Rechte zu vergeben. Verbindungen“ wird ein beliebiger Namen eingetragen.

dass sich im Suchpfad befindet zu kopieren. Wenn das ganze. Die Abhilfe ist wieder die Biblothek in ein Verzeichnis. die Biblothek fehlt. belassen wir es einmal dabei. dass im Suchpfad liegt zu kopieren. wenn es an den Rechten am Systemverzeichnis fehlt. Denn innerhalb der IDE benötigt Lazarus die Datei in seinem Pfad.2 Projekt MySQLSimple Einleitung In diesem Projekt wird nur eine einfache Verbindung zur Datenbank aufgebaut und die grundlegenden Elemente die dafür notwendig sind erklärt. Geht das nicht. Besonders wenn man eine Version aus dem SVN selbst kompiliert. Windows FAQ Einleitung Es hat sich auch bei mir gezeigt. ‘cFName‘ VARCHAR(45) NOT NULL DEFAULT ’’ COMMENT ’Familienname’.8 Beispiele der entsprechend den Erfordernissen weniger Rechte hat. Genauso kann es sein. das es hier Probleme gibt. kompilerte und gestartete Programm. Version: $LastChangedRevision: 38 $ 3 8. Die Abhilfe ist nur. innerhalb von Lazarus passiert.exe“ befindet und einmal in das Verzeichnis. dass wie oben bereits besprochen. so kann es einmal am Lazarus liegen. Genauso ist es möglich. wo die ausführbare Datei des Projektes liegt. Cannot load MySQL library „libmysql. kann es vorkommen. CREATE TABLE ‘laztest‘. MySQL unter Lazarus zu verbinden. Es werden hierbei nur Elemente verwendet die bei einer Standardinstallation von Lazarus dabei sind. das es manchmal nicht so einfach ist. ‘cVName‘ VARCHAR(45) NOT NULL DEFAULT ’’ COMMENT ’Vorname’.1. Die einfachste ist. dass auf dem Rechner ganz einfach die Treiber für MySQL nicht installiert sind. wie am Bild. Hier ein paar Hilfen. die Bibliothek ins selbe Verzeichnis wie die ausführbare Datei zu kopieren. Datenbank In der Datenbank muß für dieses Beispiel folgende Anweisung ausgeführt werden oder das ganze mittels des „MySQL Query Browserërstellt werden.dll“ Dieser Fehler kann mehrer Ursachen haben. eine bessere oder stabile Version von Lazarus zu verwenden. so muß die Datei einmal in des Verzeichnis kopiert werden. Aber nachdem das hier ja ein Tutorium ist. Die Abhilfe ist die Datei in ein Verzeichnis. wird die Datei aber ausgeführt. so benötigt sie das aktuelle. 3 Autor: Andreas Frieß Lizenz: GFDL 101 . wo sich die „Lazarus. der Weg bietet sich an.‘ST_Person‘ ( ‘STPerson‘ INTEGER UNSIGNED NOT NULL AUTO_INCREMENT \ COMMENT ’Primaerschluessel’.

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

Bei Transaction müssen wir nur in das im Objektinspektor klicken und eine Auswahl erscheint. Der DatabaseName wird auf den Namen unserer Datenbank laztest gesetzt. was wir wirklich wollen. Im MainMenu Komponente erzeugen dann ein kleines Menü. so müssen wir jetzt die Komponeneten für die Abfrage der Datenbank und die Anzeige der Daten noch hinzufügen. da sich die Eigenschaft Database im Objektinspektor bereits selbst auf MySQL50Connection1 geändert hat. Durch anklicken der Eigenschaft Connected von MySQL50Connection1 wechselt diese von False auf True. Wir nehmen hier unsere SQLTransaction1.8 Beispiele Weiters fügen wir noch eine „TSQLTransaction“ Komponente unserer Form hinzu. Die nächste Komponenete ist die „TSQLTransaction“. ‘cRName‘ FROM st_person. ‘cFName‘. ‘cVName‘. Prinzipiell ist unser Programm jetzt einmal optisch fertig. Wir ändern mit der Maus die Eigenschaft Align auf alClient und die Eigenschaft DataSource auf Datasource1. Den ersten Test kann man jetzt bereits durchführen. wir haben die Komponenten konfiguriert. „TDataSource“ vom Tab „Data Access“ und „TDBGrid“ vom Tab „Data Controls“. Wenn wir es jetzt kompilieren und laufen lassen. Die Eigenschaft hat sich Transaction im Objektinspektor bereits selbst auf SQLTransaction1 geändert. der sich mit der Datenbank verbindet. Anschliessen stellen wir die Eigenschaft wieder auf False zurück. so läuft die Verbindung ohne Probleme ab. 103 . Wenn alles gut gelaufen ist. Jetzt der Reihe nach. Damit erfasst das Grid das komplette Formular. und den Eigenschaftseditor wieder schließen. Ausserdem Erzeugen wir die Ereignisproceduren für das Form erzeugen un Form schliessen. In der Komponenete „Datasource1“ müssen wir nur DataSet per Mausklick auf SQLQuery1 einstellen. aber etwas Code wird auch benötigt um den Komponenten zu sagen. actOpenDB und actDataSetRefresh. aber keine Daten und ändern können wir auch nichts. Der HostName ist bei einer kokalen installation immer localhost. Wenn nicht. das ist ganz einfach der Benutzer den wir in der Datenbank erstellt haben. Sie ist zuständig für die richtige Abfrage am Datenbankserver. sehen wir das Formular. Fangen wir mit der Komponente „SQLQuery1“ an. Es ist klar. Wir stellen die Eigenschaft DataBase auf unsere MySQL50Connection1 ein. so muß man die Einstellungen nochmals überprüfen. Es handelt sich hier um die Komponeneten „TSQLQuery“ von Tab „sqldb“. Für das Paßwort nehmen wir das des Benutzers. Dazu verwenden wir eine „TActionList“ und ein „TMainmenu“ aus dem Tab „Standard“. Als letztes geben wir den UserNamen ein. also lazarus@localhost. Dort müssen wir aktuell nichts einstellen. In der ActionList1 erzeugen wir ganz einfach die Ereignisse actCloseDB. Als letztes konfigurieren wir das „TDBGrid“. angefangen bei der „TMySQL50Connection“ Komponente. Weiters müssen wir in die Eigenschaft SQL folgendes einfügen SELECT ‘STPerson‘. Nachdem die Verbindung zur Datenbank möglich ist. ‘cMName‘. Bei der „TMySQL50Connection“ Komponente sind es folgene Einstellungen. müssen wir Einstellungen im Objektinspektor treffen.

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

Betriebssystem Linux Suse WinXP getestet nein ja Abbildung 8. die Datenbankkomponenten wieder ordnungsgemäß von der Datenbank getrennt werden. Version Derzeit ist das Beispiel mit der Version 0.sourceforge. das hier die Server zwischen Großbuchstaben und Kleinbuchstaben unterscheiden. Weiter ist auf die Schreibweise zu achten.8 Beispiele Wichtig ist.net/svnroot/lazsnippets/\ trunk/datenbank/MySQL/MySQLSimple . in konsistenten Zustand zu hinterlassen.9. Die Zeile ist in einem zu schreiben und wurde nur aus Formatierungsgründen hier beim Rückstrich (Backslash) umgebrochen.svn. Die Datenbank muß man aber trotzdem selbst am MySQL Server erstellen. Der Punkt am Ende der Zeile ist notwendig. Die dazu benötigten Informationen befinden sich im Text von „Datenbank“ weiter oben. da es das Kennzeichen für das aktuelle Verzeichnis ist. ansonsten hat man Fehlermeldungen und auch blockierte Datenverbindungen. svn co https://lazsnippets. das beim Schließen des Formular. Generell sollte danch getrachtet werden. die Verbindungen. egal was geschieht. SVN Den Quelltext des Beispiel kann man sich auch mit folgenden Kommando aus dem SVN ind das aktuelle Verzeichnis holen.23 beta von Lazarus entwickelt.1: Versionsübersicht Version: $LastChangedRevision: 38 $ 4 4 Autor: Andreas Frieß Lizenz: GFDL 105 .

Transaction := SQLTransaction1. aSqlQuery. Durch self wird das Objekt dem Formular zugeordnet.’).DataBase := MySQL50Connection1. wie man relativ einfach Testdaten in größerer Zahl in die Tabelle ST_Person unserer Datenbank einfügt. Einfüge. Weitere Informationen können dort gefunden werden. if not MySQL50Connection1.8 Beispiele 8. finally aSqlQuery. wenn nicht so wird die Verbindung hergestellt.und Auswahloperationen durchgeführt.3 Projekt MySQLTestData Einleitung Es soll zeigen. Die Verbindungseinstelllungen wurden über den Objektinspektor schon beim Design getroffen.Connected then MySQL50Connection1. Und jetzt die Funktionen mit den dahinterliegenden Code im Detail. da es sich hier um Beispiele handelt. Wichtig ist.ExecSQL. Auf der ersten Seite des Tab-Sheets kann man das Abfrage Statement eingebn. aSqlQuery.Clear. aSQLQuery. Datenbank Es wird die Datenbank und Tabelle vom Beispiel MySQLSimple verwendet.2: Projekt TestData GUI Mit dem obersten Button wird die Tabelle komplett geleert.Create(self). Benutzerschnittstelle Auf der Oberfläche befinden sich links drei Buttons.). Zugleich kann man es als Basis für Versuche mit SELECT Statements verwenden.1. In der Tabelle werden Lösch-. try aSqlQuery. daß das Objekt erzeugt wird (aSqlQuery := TSQLQuery. end.Create(self). aSqlQuery := TSQLQuery. 106 .Add(’DELETE FROM st_person. aSqlQuery. falls es bis dahin noch nicht zerstört wurde. Abbildung 8. Anschliessend wird zur Laufzeit die TSQLQuery Komponente erzeugt.free. die Anzeige erfolgt auf der zweiten Seite des Tab-Sheet. Die Anzahl der Datensätze wird durch den Wert im Eingabefeld vorgegeben. Oberer Button Zuerst wird geprüft ob die Verbindung (Connection) zur Datenbank besteht.SQL. diese wird durch eine Delete Anweisung im Quelltext durchgeführt.Connected := true.SQL. so das das Formular beim Beenden auch das Objekt zerstören kann. Der mittlere Button und das Eingabefeld darüber gehören zusammen und fügen neue Datensätze in der Tabelle ein. Der unterste Button und das Tab-Sheet rechts daneben diesen zum Abfragen der Daten.

löscht es somit alle Daten aus der Tabelle. Mittlerer Button Beim betätigen des Buttons wird als erstes die Eingabe des Editfeldes überprüft und nur wenn der Wert in eine Zahl umgewndelt werden kann. randomize().ptInput). except showmessage(’Nur Zahlen erlaubt’).ptInput). aSQLQuery.Params.Transaction := SQLTransaction1. wird fortgefahren.8 Beispiele Im nächsten Schritt wird ein eventuell vorhandenes gespeichertes SQL-Statement sicherheitshalber gelöscht. Anschliessend eine TSQLQuery zur Laufzeit erzeugt und mit den nötigen Informationen versorgt.Text).’vname’. end. Damit wird erreicht. aSqlQuery. aSqlQuery. aSqlQuery. Mittels des Behfels randomize wird der Zufallszahlengenerator initialisiert. try aSqlQuery. Da es ohne ’WHERE’ EInschränkung verwendet wird. das es sich hier um einen Parameter handelt.Params. try iAnzahl := StrToInt(edAnzahl. Dies geschieht genauso als würde man es über den Objektinspektor machen. Weil wir später in einer Schleife Daten in die Datenbank einfügen. if not MySQL50Connection1. Dann wird das neue SQL-Statement hinzugefügt.CreateParam(ftInteger. HINWEIS: Das Arbeiten mit Parametern ist wesentlich besser.DataBase := MySQL50Connection1. Mit den Doppelpunkt zeigt man. als das Statement mittels Stringverwaltung zusammen zu setzen. Zum Abschluß wird das verwendete SQL-Query Objekt wieder sauber entfernt.’fname’.CreateParam(ftInteger. Man vermeidet damit Probleme mit speziellen Zeichen.Connected := true. so erzeugen wir hier jetzt die nötigen Parameter. 107 . dann die Verbindung zur Datenbank nötigenfalls hergestellt. exit. aSqlQuery := TSQLQuery.. wie Hochkomma und der SQL-Server hat die Möglichkeit das Statement vor zu kompilieren und zu optimieren. Anschliessend wird das SQL-Statement in die Query eingefügt.SQL. Weiters die Verbindung und die Transaktion zugewiesen. das das Objekt auch nach einem Fehler richtig gelöscht wird.Connected then MySQL50Connection1.Clear. Damit dies auch geschieht wenn es einen Fehler gegeben hat.finally Statement geklammert. sind die Teile ab der Erstellung des Objektes durch ein try.Create(self).

8 Beispiele aSqlQuery.AsString aSqlQuery. Hier beginnt die Schleife. dieser erwartet keine Ergebnismenge zurück. end. Der Befehl lautet ExecSQL.Params. finally aSqlQuery. :rname). Jetzt wird die Query mit den aktuellen Parametern durchgeführt. cVName := VorNamen[iZufall]. end.AsString := := := := cVName.SimpleText := ’Fehler in: ’ + IntToStr(i). cRName. denn dieses erwarted das eine Ergebnismenge zurück geliefert wird.:fname.CreateParam(ftInteger.Params. cMName := leftStr(cVName.2). except Statusbar1.ExecSQL.’rname’. aSqlQuery. cMName.CreateParam(ftInteger.SQL. anschliessend die Strings den Parameteren übergeben.:mname.cFName. end.’mname’. aSqlQuery.AsString aSqlQuery. try aSqlQuery. cFName.cMName.2) +LeftStr(cFName. cRName)’).Params.ParamByName(’vname’). ALs erstes werden dir Stringvariablen erzeugt. Wenn beim Ausführen ein Fehler auftritt.Add(’INSERT st_person (cVName.Params. iZufall := Random(MaxFamilienNamen-MinFamilienNamen) + MinFamilienNamen.Add(’ VALUES (:vname. bis alles abgearbeitet wurde. sleep(100).’). aSqlQuery. aSqlQuery. 108 .Params. for i := 1 to iANzahl do begin iZufall := Random(MaxVorNamen-MinVorNamen) + MinVorNamen.AsString aSqlQuery. so wird in der Statuszeile eine Fehlermeldung angezeigt und mit dem nächsten durchlauf weitergemacht.ParamByName(’fname’). if cVName = ’’ then continue.ptInput). cFName := FamilienNamen[iZufall].ptInput). if cFName = ’’ then continue.free.SQL. Das ist auch der Grund warum hier kein Open oder Active=true verwendet wurde.Params.ParamByName(’rname’). Anschliessend wird solange in der Schleife verblieben. cRName := cVName + IntToStr(Random(10)) + cFName.ParamByName(’mname’).

Assign(Memo1. Betriebssystem Linux Suse WinXP getestet nein ja Abbildung 8. svn co https://lazsnippets.SQL. da wir ja eine Ergebnismenge erwarten.SQL. Dann ganz einfach der Inhalt der Strings aus dem Meno in die Query übertragen und die Query wieder aktiv gemacht. da es das Kennzeichen für das aktuelle Verzeichnis ist. Die Zeile ist in einem zu schreiben und wurde nur aus Formatierungsgründen hier beim Rückstrich (Backslash) umgebrochen.sourceforge. SQLQuery1. except showmessage(’Anweisungen nicht gültig’). falls sie offen war. end. try SQLQuery1. Das soll auch den Unterschied zwischen den beiden Methoden zeigen. if SQLQuery1. Der Punkt am Ende der Zeile ist notwendig. Damit entfällt das erzeugen zur Laufzeit. Dann kann man im Datengitter die Ergebnisse betrachten.svn. Deshalb aktiv gemacht. Es wird zuerst die Query inaktiv gemacht. ist diese Query zur Designzeit auf dem Formular hinterlegt worden.net/svnroot/lazsnippets/\ trunk/datenbank/MySQL/MySQLTestData .8 Beispiele Unterer Button Zum Unterschied vorher. SQLQuery1.Lines).Clear.Active := false. SVN Den Quelltext des Beispiel kann man sich auch mit folgenden Kommando aus dem SVN ind das aktuelle Verzeichnis holen. Weiter ist auf die Schreibweise zu achten. das hier die Server zwischen Großbuchstaben und Kleinbuchstaben unterscheiden.Active := true. Das hätten wir beim ausführen von ExecSQL nicht.3: Versionsübersicht Version Version: $LastChangedRevision: 38 $ 5 5 Autor: Andreas Frieß Lizenz: GFDL 109 .Active then SQLQuery1.

2 DatenbankenSQLite3x 8.3 DatenbankenTDBF 110 .8 Beispiele 8.

. das diese Art damit zu arbeiten auf allen Plattformen (Unix. 111 . Da wir hier nur SVN einsetzen werden. Fehlt die Angabe des Pfades. Der eine bringt die Änderungen ein. so wird es schon hier zu Problemen kommen. so wird das aktuelle Verzeichnis genommen. Linux.9 Programme 9. svn help Gibt die Onlinehilfe zu SVN aus. Weiters ist die Verfolgung der Änderungen fast. Wenn man aber in einem Team arbeiten muß. will ich mich hier auf die grundlegende Bedienung von SVN beschränken. Diesem Archiv gebe ich ganz einfach einen guten Titel und die Sache hat sich.1 Nützliche Werkzeuge 9. Die dafür notwendigen Befehle sind hier kurz vorgestellt.. Um dieses Szenario zu vermeiden und die arbeit im Team zu vereinfachen haben sich im laufe der Jahre Versionsmanagmentsysteme entwickelt. bzw.) vorhanden ist.. MacOS. Denn jeder Entwickler hat seine eigene Version und muß die Änderungen in das Projekt ein pflegen.1. 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. der andere bekommt die Änderung aber auch nicht mit und bringt seinerseits seine Änderungen ein. nur schwer möglich. Erklärung siehe dort. Somit sind die Änderungen des ersten Entwicklers unbemerkt verloren und das Projekt somit nicht konsistent. Das kann bei einem einzelnen Entwickler durchaus so noch funktionieren. svn Kommandozeile SVN von der Kommandozeile aus zu bedienen ist eine der universellsten Möglichkeiten. svn list URL und svn list Pfad Zeigt zusätzliche Informationen zur URL beziehungsweise zum Pfad an. Vor allen wenn man nur Projekte aus dem SVN holt und auffrischt ist die Syntax relativ einfach. Windows. svn co URL [Pfad ] ist die Kurzform von „checkout“. Was ist aber wenn gerade 2 Entwickler an derselben Datei arbeiten.1 Versionskontrolle Warum ein Versionsmanagment überhaupt verwenden? Es ist doch viel einfacher den Sourcecode und die benötigten Dateien einfach auf der Festplatte zu haben und von Zeit zu Zeit macht man davon ein Archiv.

. Änderungen übertragen svn add Datei Fügt eine Datei in der Arbeitskopie zur Versionskontrolle hinzu. svn update Aktualisiert die lokale Kopie und läd alle Änderungen. welche sich bereits unter Versionkontrolle befinden bzw." ] Legt eine neue Revision an und überträgt alle Änderungen an Dateien. Version: $LastChangedRevision: 95 $ 1 1 Autor: Andreas Frieß Lizenz: GFDL 112 . vorher mit add markiert wurden. Der Parameter -m erlaubt es. welche in der Zwischenzeit von anderen entwicklern am Repository vorgenohmen wurden. direkt eine Beschreibung der Änderungen anzugeben. svn revert Pfad Entfernt die Änderungen sei der letzten Revision und stellt einen unveränderten Zustand wieder her.. welche später ein Nachverfolgen der Änderungen ermöglicht.9 Programme svn log URL und svn log Pfad Zeigt die Loginformationen zur URL beziehungsweise zum Pfad an. svn commit [-m"Beschreibung. Die Datei wird jedoch nicht direkt in das Repository geladen. sondern lediglich markiert.

1. Nun ist das ja gut und schön. Noch etwas in eigener Sache: das Programm wurde lediglich als kleines Hilfstool programmiert.pas. währenddessen die andere ignoriert wird.. Lazarus erstellt bei der Installation wenn man es aktiviert hat. Das Programm bietet nun alle Eingetragenen Lazarusversionen zum öffnen an. Um dies zu vereinfachen und komfortabel eine Versionenauswahl zur Verfügung (siehe Screenshot) zu haben dient dieses kleine Tool.2 Tool Versionenselektierer Was macht das Tool eigentlich? Alle Betriebssysteme stellen ja die jedem bekannte Möglichkeit zur Verfügung. weitere Funktionalität einzubauen. Wie bereits gesagt.’ in die IDE laden. wieso ich dieses kleine Tool für mich geschrieben habe.php?p=11822 113 . Mehrer Lazarusversionen auf einem System zu haben kann beispielsweise den Vorteil bringen. kann ja nur eine Lazarusversion in diesem Fall zum automatischen Öffnen verknüpft werden. Daher erfolgt beispielsweise die Konfiguration auch direkt in der Textdatei. Somit ist es möglich mit (Doppel)Klick auf eine Datei automatisch ein entsprechendes Programm zur Bearbeitung bzw. Statt mit Lazarus selbst werden die entsprechenden Dateien über die ’Öffnen mit’ . aktuelle Bugentwicklungen verfolgen. während dessen man stehts noch ein ’altes’ Lazarus zum sicheren Arbeiten hat. so startet das Tool automatisch die entsprechende Version und läd die gewünschte Datei genau so. das man sowohl das letzte offizielle Release sowie die aktuelle SVN-Version bzw. Möchte man allerdings die andere Nutzen muss man erst umständlich die IDE aufrufen und anschließend kann man die gewünschte Datei über ’Datei öffnen.9 Programme 9. Jedem steht es natürlich frei. wie im Folgenden erklärt wird.pp. Somit kann man beispielsweise die Kompatibilität der eigenen Anwednung mit neuern lazarusversionen im Auge behalten bzw.. einen aktuelleren Snapshot installiert hat. Dateien mit den entsprechenden Anwednungen zu verknüpfen.de/viewtopic. Und genau bei diesem ’ein’ Programm liegt der Grund. ein kleiner Patch/bzw. . automatisch Verknüpfungen für die entsprechenden dazugehörigen Dateitypen. öffnet sich ja dennoch nur die verknüpfte Version automatisch.lazarusforum. wie . Wird eine entsprechende Version ausgewählt. ohne auf besondere Funktionen wert zu legen. eine Mail mit aktuellem Code dazu wäre natürlich nett. als wenn die Datei direkt mit Lazarus verknüpft wäre. Betrachtung zu öffnen. http://www.lpr usw. .Eigenschaft mit diesem Tool verknüpft. aber wenn man mehrer Lazarusinstallationen auf dem System laufen hat.

X wird für jeden neuen Button ainfach um 1 hochgezählt.bmp Pfad=c:\Lazarus_trunk\Lazarus.Angabe.bmp Pfad=c:\lazarus\Lazarus. welche auf dem Button erscheint • Glyph . Wird es direkt gestartet. 114 . Auf die Systemkonfiguration soll hier nur kurz eingegangen werden.bmp in ein Verzeichnis kopiert werden.9 Programme Konfiguration Systemkonfiguration Das Programm selbst muss lediglich mit zusammen mit der config. so dass dieses bei öffnen der Datei gestartet wird. erlaubt es ebenfalls die Auswahl und das starten einer Lazarusversion.diese Angabe enthält den absoluten Pfad zum Programmverzeichnis Einstellungen für die einzelnen Schaltflächen: • ButtonX . ist das Programm einsatzbereit. welche über diesen Button gestartet werden soll Sind alle Konfigurationen entsprechend angepasst.exe Allgemeine Einstellungen: • Starter .ini und optional (möchte man das Icon auf den Buttons haben) mit der lazarus.exe [Button2] Name=Lazarus Entwicklungszweig Glyph=lazarus.Name des Bildes welches auf dem Button angezeigt werden soll. Programmkonfiguration Als Konfiguration dient eine einfache Ini mit folgendem Aufbau: [Pfade] Starter=c:\lazarus\Starter\ #Die einzelnen Schaltflächen: [Button1] Name=Lazarus Release Glyph=lazarus. das die entsprechenden Dateien anstatt mit Lazarus direkt mit dem Programm verknüpft sind.absoluter Pfad zur entsprechenden Lazarusversion. das Bild sollte im Programmpfad liegen • Pfad . ohne das eine Datei übergeben wird. Es ist wichtig. ansonsten kann der gesamte Block kopiert werden und die folgenden Angaben werden angepasst: • Name .

1 Tabellenverzeichnis 115 .10 Anhang 10.

. . . . .Tastenkombinationen Suchen . . . . . . IDE . . . . . . . . . . . . . . . . . . . .1 5. . . . . . .5 5. . . . . . . IDE . . . . . . . . . . . . . . . . . . . . . .3 5. . . . .Tastenkombinationen . . . . . . . . . .Tastenkombinationen Datei . . . . . . . . IDE . . . . . . . . . . . . . . . . . . . . .Tastenkombinationen Start . . . .Tabellenverzeichnis 3. . . . . . . .4 5. . . . . . . .Tastenkombinationen Projekt . . . IDE . . . . . . . . . . . . IDE .7 Datenbank Normalisierungstufen Übersicht . . 32 58 58 59 59 59 60 60 116 . . . . .1 5. . . . . . . . . . . . . . .2 5. IDE . . . . . . . . . . IDE . . . . . . . . . .Tastenkombinationen Bearbeiten . . .TastenkombinationenAnsicht . . . . .6 5. . . . . .

version 2.freepascal.org/pub/fpc/docs-pdf/ref.org Übersichtstabelle_der_IDE_Tasten- [11] Homepage http://www.de Forum [LazEn] Englisches Lazarusforum http://www.de/ [12] Homepage http://homepages.freepascal.ullihome.Literaturverzeichnis [LazDe] Deutsches Lazarusforum http://www.???/ 117 .lazarusforum.freepascal.pdf [10] Lazarus Wiki kombinationen http://www.lazarus.0.Document version 2.????.com/jedi/jcl/ [14] Homepage http://www.codegear.4.lazarus.0 August 2006 ftp://ftp.org [FPCLangRef] Reference guide for Free Pascal.

or other functional and useful document “free” in the sense of freedom: to assure everyone the effective freedom to copy and redistribute it. Such a notice grants a world-wide. Inc. It complements the GNU General Public License. We have designed this License in order to use it for manuals for free software. textbook. unlimited in duration. either copied verbatim. commercial. in any medium. which is a copyleft license designed for free software.2001.2. November 2002 Copyright c 2000.Literaturverzeichnis 10. Preamble The purpose of this License is to make a manual. which means that derivative works of the document must themselves be free in the same sense. modify or distribute the work in a way requiring permission under copyright law. This License is a kind of “copyleft”. philosophical. either commercially or noncommercially. We recommend this License principally for works whose purpose is instruction or reference. (Thus. to use that work under the conditions stated herein. it can be used for any textual work. MA 02110-1301 USA Everyone is permitted to copy and distribute verbatim copies of this license document. that contains a notice placed by the copyright holder saying it can be distributed under the terms of this License. The “Document”. refers to any such manual or work. 1. below. But this License is not limited to software manuals. or with modifications and/or translated into another language. this License preserves for the author and publisher a way to get credit for their work. 118 . Secondarily. APPLICABILITY AND DEFINITIONS This License applies to any manual or other work. if the Document is in part a textbook of mathematics.) The relationship could be a matter of historical connection with the subject or with related matters. 51 Franklin St. Boston. while not being considered responsible for modifications made by others. a Secondary Section may not explain any mathematics. ethical or political position regarding them. 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 Document’s overall subject (or to related matters) and contains nothing that could fall directly within that overall subject. but changing it is not allowed. or of legal.2002 Free Software Foundation. because free software needs free documentation: a free program should come with manuals providing the same freedoms that the software does. royalty-free license.2 GNU Free Documentation License Version 1. and is addressed as “you”. Any member of the public is a licensee. regardless of subject matter or whether it is published as a printed book. with or without modifying it. A “Modified Version” of the Document means any work containing the Document or a portion of it. Fifth Floor. You accept the license if you copy.

) To “Preserve the Title” of such a section when you modify the Document means that it remains a section “Entitled XYZ” according to this definition. LaTeX input format. legibly. The “Cover Texts” are certain short passages of text that are listed. and standard-conforming simple HTML.Literaturverzeichnis The “Invariant Sections” are certain Secondary Sections whose titles are designated. (Here XYZ stands for a specific section name mentioned below. for a printed book. or absence of markup. such as “Acknowledgements”. “Title Page” means the text near the most prominent appearance of the work’s title. in the notice that says that the Document is released under this License. A “Transparent” copy of the Document means a machine-readable copy. and a Back-Cover Text may be at most 25 words. “Dedications”. PostScript or PDF produced by some word processors for output purposes only. Examples of transparent image formats include PNG. and the license notice saying this 119 . XCF and JPG. SGML or XML for which the DTD and/or processing tools are not generally available. and the machinegenerated HTML. If the Document does not identify any Invariant Sections then there are none. the copyright notices. as being those of Invariant Sections. A copy made in an otherwise Transparent file format whose markup. For works in formats which do not have any title page as such. Examples of suitable formats for Transparent copies include plain ASCII without markup. in the notice that says that the Document is released under this License. 2. plus such following pages as are needed to hold. 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. preceding the beginning of the body of the text. If a section does not fit the above definition of Secondary then it is not allowed to be designated as Invariant. Texinfo input format. “Endorsements”. or “History”. represented in a format whose specification is available to the general public. The Document may include Warranty Disclaimers next to the notice which states that this License applies to the Document. VERBATIM COPYING You may copy and distribute the Document in any medium. The “Title Page” means. Opaque formats include proprietary formats that can be read and edited only by proprietary word processors. The Document may contain zero Invariant Sections. These Warranty Disclaimers are considered to be included by reference in this License. either commercially or noncommercially. as Front-Cover Texts or Back-Cover Texts. the material this License requires to appear in the title page. provided that this License. PostScript or PDF designed for human modification. SGML or XML using a publicly available DTD. has been arranged to thwart or discourage subsequent modification by readers is not Transparent. An image format is not Transparent if used for any substantial amount of 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. and that is suitable for input to text formatters or for automatic translation to a variety of formats suitable for input to text formatters. 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. A Front-Cover Text may be at most 5 words. the title page itself. A copy that is not “Transparent” is called “Opaque”.

provided that you release the Modified Version under precisely this License. when you begin distribution of Opaque copies in quantity. MODIFICATIONS You may copy and distribute a Modified Version of the Document under the conditions of sections 2 and 3 above. and that you add no other conditions whatsoever to those of this License. In addition. as long as they preserve the title of the Document and satisfy these conditions. free of added material. and Back-Cover Texts on the back cover. 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. to give them a chance to provide you with an updated version of the Document. thus licensing distribution and modification of the Modified Version to whoever possesses a copy of it. If you distribute a large enough number of copies you must also follow the conditions in section 3. Copying with changes limited to the covers. you must take reasonably prudent steps. However. 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. Both covers must also clearly and legibly identify you as the publisher of these copies. with the Modified Version filling the role of the Document. be listed in the 120 . you must either include a machine-readable Transparent copy along with each Opaque copy. It is requested. you must enclose the copies in covers that carry.Literaturverzeichnis License applies to the Document are reproduced in all copies. COPYING IN QUANTITY If you publish printed copies (or copies in media that commonly have printed covers) of the Document. and the Document’s license notice requires Cover Texts. if any) a title distinct from that of the Document. clearly and legibly. and from those of previous versions (which should. that you contact the authors of the Document well before redistributing any large number of copies. if there were any. and continue the rest onto adjacent pages. If you use the latter option. and you may publicly display copies. You may add other material on the covers in addition. 4. can be treated as verbatim copying in other respects. you should put the first ones listed (as many as fit reasonably) on the actual cover. If you publish or distribute Opaque copies of the Document numbering more than 100. You may not use technical measures to obstruct or control the reading or further copying of the copies you make or distribute. The front cover must present the full title with all words of the title equally prominent and visible. numbering more than 100. all these Cover Texts: FrontCover Texts on the front cover. Use in the Title Page (and on the covers. under the same conditions stated above. If the required texts for either cover are too voluminous to fit legibly. you may accept compensation in exchange for copies. You may also lend copies. you must do these things in the Modified Version: A. 3. but not required.

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

If the Document already includes a cover text for the same cover. COLLECTIONS OF DOCUMENTS You may make a collection consisting of the Document and other documents released under this License. and that you preserve all their Warranty Disclaimers. likewise combine any sections Entitled “Acknowledgements”. provided that you follow the rules of this License for verbatim copying of each of the documents in all other respects. and replace the individual copies of this License in the various documents with a single copy that is included in the collection. You must delete all sections Entitled “Endorsements”. but you may replace the old one. The combined work need only contain one copy of this License. you may at your option designate some or all of these sections as invariant. 5. Preserve any Warranty Disclaimers. forming one section Entitled “History”. or else a unique number. add their titles to the list of Invariant Sections in the Modified Version’s license notice. and multiple identical Invariant Sections may be replaced with a single copy. You may add a section Entitled “Endorsements”. 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 Modified Version. provided it contains nothing but endorsements of your Modified Version by various parties–for example. If there are multiple Invariant Sections with the same name but different contents. In the combination. These titles must be distinct from any other section titles. unmodified. COMBINING DOCUMENTS You may combine the Document with other documents released under this License. and list them all as Invariant Sections of your combined work in its license notice.Literaturverzeichnis O. 122 . statements of peer review or that the text has been approved by an organization as the authoritative definition of a standard. To do this. on explicit permission from the previous publisher that added the old one. you may not add another. the name of the original author or publisher of that section if known. 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. Make the same adjustment to the section titles in the list of Invariant Sections in the license notice of the combined work. to the end of the list of Cover Texts in the Modified Version. previously added by you or by arrangement made by the same entity you are acting on behalf of. 6. and any sections Entitled “Dedications”. provided that you include in the combination all of the Invariant Sections of all of the original documents. You may add a passage of up to five words as a Front-Cover Text. make the title of each such section unique by adding at the end of it. under the terms defined in section 4 above for modified versions. in parentheses. If the Modified Version includes new front-matter sections or appendices that qualify as Secondary Sections and contain no material copied from the Document. you must combine any sections Entitled “History” in the various original documents. and a passage of up to 25 words as a Back-Cover Text.

or “History”. 9. “Dedications”. the original version will prevail. the Document’s Cover Texts may be placed on covers that bracket the Document within the aggregate. this License does not apply to the other works in the aggregate which are not themselves derivative works of the Document. from you under this License will not have their licenses terminated so long as such parties remain in full compliance. in or on a volume of a storage or distribution medium. Replacing Invariant Sections with translations requires special permission from their copyright holders. modify. Otherwise they must appear on printed covers that bracket the whole aggregate. and all the license notices in the Document. or rights. or the electronic equivalent of covers if the Document is in electronic form. FUTURE REVISIONS OF THIS LICENSE 123 . and any Warranty Disclaimers. and follow this License in all other respects regarding verbatim copying of that document. then if the Document is less than one half of the entire aggregate. 7. Any other attempt to copy. parties who have received copies. If the Cover Text requirement of section 3 is applicable to these copies of the Document. If a section in the Document is Entitled “Acknowledgements”. but you may include translations of some or all Invariant Sections in addition to the original versions of these Invariant Sections. In case of a disagreement between the translation and the original version of this License or a notice or disclaimer. 10. sublicense. TERMINATION You may not copy. and will automatically terminate your rights under this License. so you may distribute translations of the Document under the terms of section 4. provided that you also include the original English version of this License and the original versions of those notices and disclaimers.Literaturverzeichnis You may extract a single document from such a collection. is called an “aggregate” if the copyright resulting from the compilation is not used to limit the legal rights of the compilation’s users beyond what the individual works permit. 8. AGGREGATION WITH INDEPENDENT WORKS A compilation of the Document or its derivatives with other separate and independent documents or works. When the Document is included in an aggregate. modify. You may include a translation of this License. sublicense or distribute the Document is void. However. TRANSLATION Translation is considered a kind of modification. or distribute the Document except as expressly provided for under this License. and distribute it individually under this License. the requirement (section 4) to Preserve its Title (section 1) will typically require changing the actual title. provided you insert a copy of this License into the extracted document.

Such new versions will be similar in spirit to the present version. you have the option of following the terms and conditions either of that specified version or of any later version that has been published (not as a draft) by the Free Software Foundation. Permission is granted to copy. we recommend releasing these examples in parallel under your choice of free software license. . and with the Back-Cover Texts being LIST. If the Document specifies that a particular numbered version of this License “or any later version” applies to it.” line with this: with the Invariant Sections being LIST THEIR TITLES. If you have Invariant Sections without Cover Texts. If your document contains nontrivial examples of program code. such as the GNU General Public License. . or some other combination of the three. merge those two alternatives to suit the situation. 124 . 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. If the Document does not specify a version number of this License. A copy of the license is included in the section entitled “GNU Free Documentation License”. no Front-Cover Texts. and no Back-Cover Texts. with no Invariant Sections. Each version of the License is given a distinguishing version number. If you have Invariant Sections. with the Front-Cover Texts being LIST. distribute and/or modify this document under the terms of the GNU Free Documentation License. to permit their use in free software.2 or any later version published by the Free Software Foundation.gnu. but may differ in detail to address new problems or concerns. Version 1. ADDENDUM: How to use this License for your documents To use this License in a document you have written. replace the “with . See http://www.org/copyleft/. revised versions of the GNU Free Documentation License from time to time. you may choose any version ever published (not as a draft) by the Free Software Foundation.Literaturverzeichnis The Free Software Foundation may publish new. Front-Cover Texts and Back-Cover Texts. Texts.