Die Präsentation wird geladen. Bitte warten

Die Präsentation wird geladen. Bitte warten

Delphi Informatik-AG. Übersicht •Pascal Syntax •Konstanten •Variablen •Typen •Prozeduren/Funktionen •Schleifen •Verzweigungen.

Ähnliche Präsentationen


Präsentation zum Thema: "Delphi Informatik-AG. Übersicht •Pascal Syntax •Konstanten •Variablen •Typen •Prozeduren/Funktionen •Schleifen •Verzweigungen."—  Präsentation transkript:

1 Delphi Informatik-AG

2 Übersicht •Pascal Syntax •Konstanten •Variablen •Typen •Prozeduren/Funktionen •Schleifen •Verzweigungen

3 Grundlegende Pascal-Syntax Länge einer Programmzeile In Pascal dürfen Programmzeilen beliebig lang sein. Allerdings ist das wenig empfehlenswert, da das die Lesbarkeit massiv beeinträchtigt. Überall dort wo ein Leerzeichen (blank) möglich ist, können auch eine oder mehrere Leerzeilen eingefügt werden. Dies ermöglicht eine leichte Formatierung des Codes Strichpunkte Jeder Pascal-Befehl muss am Ende durch einen Strichpunkt begrenzt sein. Fehlt der Strichpunkt, so liefert der Compiler eine Fehlermeldung, die üblicherweise erst in der nächsten Programmzeile auftritt, da ja vorher nicht klar ist, dass eine Strichpunkt fehlt. Groß/Kleinschreibung In Pascal dürfen Groß- und Kleinbuchstaben beliebig gemischt werden. Man kann so Groß- und Kleinschreibung gezielt als Stilelement einsetzen um die Lesbarkeit von Programmen zu erhöhen Länge von Bezeichnern Namen oder Bezeichner (engl. identifier) von Konstanten, Datentypen, Variablen, Prozeduren und Funktionen, etc. können beliebig lange sein, allerdings empfiehlt sich ein Kompromiss zwischen sehr kurzen und sehr langen Namen (die kurzen Namen sind schnell zu schreiben, die langen leichter zu lesen). Für Variable wird man nur für Hilfsvariable kurze Bezeichner wählen.

4 Grundlegende Pascal-Syntax Kommentare In vielen Fällen möchte man sich im Programmcode Notizen machen. Grundsätzlich erlaubt Delphi drei verschiedene Arten von Kommentaren, wobei Kommentare überall dort im Programmcode geschrieben werden dürfen, wo ein Leerzeichen syntaktisch erlaubt ist: // Mit dem Doppelschrägstrich werden Teile einzelner Zeilen als Kommentar markiert. Alle Zeichen rechts neben dem Doppelschrägstrich bis ans Ende der Zeile gelten als Kommentar. {} Möchte man mehr als eine Zeile als Kommentar kennzeichnen, oder Teile innerhalb einer Zeile, so benützt man geschweifte Klammern. Alle Zeichen innerhalb geschweifter Klammern sind Kommentar. (* *) Man kann statt geschweiften Klammern auch die Zeichenkombinationen Program Test; begin // Das wird ein Programm { Mehrer Zeilen können über die geschweiften Klammern als Kommentare gekennzeichnet werden } (* alternativ ist auch diese Schreibweise möglich *)

5 Grundlegende Pascal-Syntax Struktur eines PASCAL Programms Pascal ist so konzipiert, dass Programme durch einen so genannten „One-Pass-Compiler“ übersetzt werden kann. Dies hat für die Geschwindigkeit der Übersetzung einen enormen Vorteil, bedeutet aber, dass der Programmierer eine bestimmte Reihenfolge innerhalb eines Programms einhält. Diese Einschränkung ist aber in der Praxis keine, sondern eher eine Erleichterung, da man auch bei fremden Programmen sehr schnell die Struktur erkennen kann. Betrachtet man ANSI-Pascal so ergibt sich für die Abfolge der wichtigsten Programmteile folgende Reihenfolge (Object-Pascal hält sich natürlich auch an diese Reihenfolge, allerdings kommen noch weitere Konstrukte, wie Interfaces etc. dazu): Program/Function/Procedure // Declarationen (Type, Const,Var) begin end;

6 Grundlegende Pascal-Syntax Deklaration von Konstanten Nach dem Programm- bzw. Unterprogrammnamen folgt die Definition der verwendeten Konstanten, die mit dem Schlüsselwort const eingeleitet wird. Der Bereich der Konstantendeklaration gilt so lange bis ein anderer Bereich definiert wird (z.B. die Deklaration der Variablen) oder der (Unter-)Programmkörper beginnt. Konstanten werden formal folgendermaßen deklariert: Name = Konstante; Als Konstante können beliebige einfache Datentypen verwendet werden. Für zusammengesetzte Konstanten (wie z.B. Records gelten etwas andere Regeln). Für die Konstantendefinition haben sich zwei Stilregeln eingebürgert, die die Lesbarkeit eines Programms stark verbessern: 1) Pro Konstante wird eine Programmzeile verwendet. 2) Die Bezeichner der Konstanten werden mit Großbuchstaben geschrieben. Damit kann man an beliebigen Stellen des Programms immer erkennen, ob ein Bezeichner einer Konstanten entspricht oder einer Variablen. Beispiel:const NAME = 'Lohninger'; MAX_MONTH = 12; // Höchster Monat SPEC_LENGTH = 512; // Länge der Spec

7 Grundlegende Pascal-Syntax Warum überhaupt Konstanten? Betrachtet man Konstanten aus logischer Sicht, so sind sie überflüssig, da man jedes Vorkommen einer Konstanten im Programmcode durch ihren Wert ersetzen kann. Allerdings haben Konstanten folgende Vorteile: Verbesserung der Wartungsfreundlichkeit eines Programms: Muss ein konstanter Wert geändert werden, so reicht bei Verwendung von Konstanten die Modifikation einer einzigen Konstantendefinition. Verbesserung der Lesbarkeit: Der Bezeichner MAX_LENGTH sagt einfach mehr aus als etwa die anonyme Zahl 150. Bessere Gliederung: Die Definition der Konstanten stehen an wohldefinierter Stelle und sind deshalb leichter zu finden. Eventuell erzeugt man sogar eine eigene Unit, in der alle globalen Konstanten (und Typen und Variablen) definiert sind.

8 Datentypen •Pascal ist eine streng typisierte Sprache. Darunter versteht man eine Sprache, bei der der Programmierer gezwungen wird, die einzelnen Datentypen zu deklarieren und die Verwendung dieser Typen nur typgerecht durchzuführen. Damit kann man z.B. das Alter eines Werkstücks nicht zur Bezeichnung des Werkstücks addieren (auch wenn das Werkstück als Bezeichnung eine Nummer trägt). •Pascal unterstützt einige vordefinierte, einfache Datentypen, die im Folgenden beschrieben werden: •ganze Zahlen: integer, word, byte, longint, shortint, cardinal, smallint, int64 •Gleitkommazahlen: single, double, extended •logische Typen: boolean •Zeichen und Zeichenketten: char, string

9 Ganze Zahlen Eigentlich gibt es ja (zumindest in der Mathematik) nur einen Typ von ganzen Zahlen; trotzdem bieten die meisten Programmiersprachen unterschiedliche Ganzzahltypen an, die sich im Wertebereich den sie abdecken unterscheiden. Der Grund dafür liegt darin, dass eine Zahl, die einen kleineren Wertebereich abdeckt auch weniger Speicherplatz verbraucht. Allerdings sind einige Typen gleich und eine Unterscheidung ist nur historisch gesehen gerechtfertigt. Die folgende Tabelle gibt einen Überblick zu den ganzzahligen Datentypen. In der Praxis verwendet man meist nur byte, word, integer und int64. TypBereich Speicherbedarf (Byte) Byte0 bis 2551 Word0 bis Shortint-128 bis 1271 Smallint bis Integer bis Longint bis Cardinal 0 bis Longword 0 bis Int64-2^63 bis 2^63-18

10 Gleitkommazahlen Gleitkommazahlen können reelle Zahlen mit einer bestimmten Präzision und innerhalb eines bestimmten Wertebereichs darstellen. Die folgende Tabelle gibt einen Überblick dazu: TypBereichPräzisionSpeicherbedarf (Byte) Single1.5*10^ *10^3874 Double5.0*10^ *10^ Extended3.6*10^ *10^

11 Boolean (logischer Datentyp) Der Boole'sche Datentyp kennt nur zwei Werte, nämlich true (wahr) und false (falsch). Im Rechner werden die beiden Werte als 1 und 0 gespeichert. Zeichen und Zeichenketten Zeichen werden in Pascal als ‚Char‘ bezeichnet. Eine Variable vom Typ Char kann genau 1 Zeichen aufnehmen. Mehrere Zeichen werden in Variablen des Typs String gespeichert. In Delphi kann ein String etwa 2 Milliarden Zeichen lang sein.

12 Variablen Variable sind eines der zentralen Elemente jeder Programmiersprache. Sie sind als "Datencontainer" aufzufassen, die man benützt um z.B. Ergebnisse zwischenzuspeichern. Die Einsatzmöglichkeiten von Variablen sind so vielfältig, dass an dieser Stelle nur auf die grundlegenden Aspekte eingegangen werden kann. Deklaration von Variablen Variable kann man nach ihrem Geltungsbereich in globale und lokale Variable unterscheiden. Die Deklaration ist für beide Arten syntaktisch gleich, allerdings wird man lokale Variable anders einsetzen als globale. Die Deklaration von einer oder mehreren Variablen erfolgt immer außerhalb des eigentlichen Programmcodes (der durch ein begin-end-Paar eingeklammert ist) und wird mit dem Schlüsselwort var eingeleitet. Die Syntax einer Variablendeklaration sieht folgendermaßen aus: Name : Typ; Der Name einer Variablen kann beliebig gewählt werden, er darf sich nur nicht mit den von Pascal reservierten Wörtern decken. Nach dem Namen steht der Typ der Variable, abgeschlossen durch einen Strichpunkt. Man darf Variable des gleichen Typs auch durch Beistriche getrennt in einem Statement deklarieren. Beispiel: var ShoeSize : integer; Age : double; i, j, k : longint;

13 Variablen Verwendung von Variablen Der Einsatz von Variablen im Programmcode ist ziemlich einfach - man verwendet an der passenden Stelle den entsprechenden Namen. Grundsätzlich dürfen an einer bestimmten Stelle im Programm nur Variable eingesetzt werden, die vom passenden Typ sind - man kann also nicht eine floating point-Variable (z.B. double) einer Boole'schen Variablen (boolean) zuweisen. Allerdings sorgt der Compiler für eine automatische Umwandlung des Variablentyps, falls das sinnvoll und möglich ist (ohne Veränderung des Inhalts der Variablen). Es können also z.B. integer-Variable an floating point-Variable zugewiesen werden, aber nicht umgekehrt. Im ersten Fall wird der Inhalt der Variablen nicht verändert (eine Gleitkommazahl kann ja auch ganzzahlig sein), im zweiten Fall müsste man die Gleitkommazahl zuerst runden, bevor sie der ganzen Zahl zugewiesen werden kann. Die Rundung muss aber vom Programmierer explizit (Funktion round) durchgeführt werden. Beispiel:var x1 : double; x2 : integer; begin x1 := 3*x2; // das ist erlaubt x2 := 3*x1; // das ist nicht erlaubt x2 := round(3*x1); // ist wieder erlaubt end;

14 Operatoren Arithmetische Operatoren Arithmetische Operatoren verknüpfen zwei Werte (in Form von Konstanten oder Variablen) und liefern das entsprechende Resultat zurück. Wichtig ist, dass der Typ des Ergebnisses von den Eingangstypen und von der Operation abhängt. Für ganzzahlige Berechnungen gibt es zwei spezielle Operatoren, div und mod. OperatorOperationEingangstypenErgebnistyp +Additionganzzahlig, reell -Subtraktionganzzahlig, reell *Multiplikationganzzahlig, reell /Divisionganzzahlig, Reellreell divDivisionGanzzahligganzzahlig modRest der DivisionGanzzahligganzzahlig Hinweis: Der Plus-Operator (+) hat für Strings noch eine eigene Bedeutung: sind beide Variablen Zeichenketten, so hängt der +Operator diese zu einem String zusammen

15 Operatoren Logische Operatoren Logische Operatoren verknüpfen eine oder zwei Eingangsvariablen nach den jeweiligen logischen Verknüpfungsregeln. Sowohl die Eingänge als auch die Ausgänge sind Boole'sche Werte (true oder false). Hinweis: Logische Operatoren lassen sich auch auf ganze Zahlen anwenden. In diesem Fall werden sämtliche Bits jeweils einzeln der logischen Verknüpfung unterworfen. OperatorOperation Nottrue Negation false AndtrueFalseLogisches and true false OrtruefalseLogisches or true falseTruefalse XOrtruefalseLogisches xor trueFalsetrue falseTruefalse

16 Operatoren Vergleichsoperatoren Mit Vergleichsoperatoren können jeweils typ-gleiche Operanden verglichen werden. Als Ergebnis wird ein logischer Wert zurückgeliefert (true oder false). Vergleichsoperatoren können nicht nur auf numerische Werte angewendet werden, sondern auch auf logische Werte und auf Zeichen und Strings. Beim Vergleich von Zeichen wird die zugrundeliegende Codierung als Basis des Vergleichs herangezogen. OperatorOperation =Gleich <>Ungleich Größer >=Größer gleich Hinweis: Die Anwendung von '=' und '<>' auf reelle Zahlen ist zwar prinzipiell erlaubt, allerdings kaum sinnvoll, da reelle Zahlen meist Rundungsfehler in der letzten signifikanten Stelle aufweisen. Dies führt dazu, dass ein Vergleich die falschen Ergebnisse liefert. So setzt das Statement test := (0.001* = 100); die boole'sche Variable test nicht auf TRUE, obwohl die beiden Werte mathematisch gesehen gleich sind (der linke Ausdruck 0.001* ergibt bei doppelter Genauigkeit ).

17 Operatoren Präzedenz (Rangfolge) von Operatoren Wenn man einen komplizierten arithmetischen oder logischen Ausdruck auswertet, hängt das Ergebnis von der Reihenfolge der Anwendung der einzelnen Operatoren ab. Die Reihenfolge kann man gezielt durch Einsatz von Klammern kontrollieren. Setzt man keine Klammern, so ergibt sich eine Default-Einstellung, die als Operator-Präzedenz bezeichnet wird. Grundsätzlich gilt hier, dass Vorzeichen und Negation vor Multiplikation und Division berechnet werden; diese kommen wiederum vor Addition und Subtraktion, und zum Schluss werden erst die Vergleichsoperatoren ausgewertet. Persönl. Anmerkung: Es ist keine Schande und kostet auch keine Rechenzeit, wenn man mehr Klammern als nötig setzt. Ich tendiere dazu, eher mehr Klammern als notwendig zu setzen; dies gilt vor allem für komplizierte logische Ausdrücke, für die ein paar Klammern mehr eventuell Stunden an Fehlersuche ersparen können.

18 Programmflusskontrolle Mit diesen fünf Konstrukten •der Anweisungsblock •zwei Entscheidungsblöcke •zwei Schleifentypen - lässt sich jedes beliebige Programm schreiben.

19 Programmflusskontrolle Anweisungsblock Der Anweisungsblock dient dazu, mehrere Statements zu einem "Verbund-Statement" zusammen zu hängen. Ein solcher Anweisungsblock wird mit begin eingeleitet und mit end; abgeschlossen. Der gesamte Anweisungsblock verhält sich wie ein einzelnes Statement und kann überall dort wo ein Statement syntaktisch erwartet wird eingegeben werden. begin ….. …. end;

20 Programmflusskontrolle Zweifachentscheidung Die Zweifachentscheidung wird immer dann eingesetzt, wenn eine Frage nur zwei sich gegenseitig ausschließende Antworten zulässt. Die entsprechenden Schlüsselworte sind if, then und else. Falls die Bedingung (z.B. ein Vergleich) erfüllt ist, wird der then-Zweig ausgeführt, andernfalls der else-Zweig. if (Bedingung = true) then begin ….. end else begin ….. end;

21 Programmflusskontrolle Mehrfachentscheidung Im Prinzip könnte man Mehrfachverzweigungen, bei denen auf eine Frage mehr als zwei Antworten möglich sind, auch durch Zweifachverzweigungen aufbauen. Allerdings führt das zu unschönen Konstruktionen, die überdies noch schlecht zu lesen sind. Abhilfe schafft hier das case-Konstrukt. case (Bedingung) of c1: begin end; c2: begin end; …. else begin end; end;

22 Programmflusskontrolle Schleifen Schleifen bestehen immer aus zwei Elementen - dem Schleifenkörper und dem Abbruchkriterium. Der Schleifenkörper ist ein Anweisungsblock. Als Abbruchkriterium muss ein Ausdruck verwendet werden, der als Ergebnis entweder true oder false liefert.

23 Programmflusskontrolle Schleife mit Abbruchkriterium am Ende Bei diesem Typ von Schleife wird der Schleifenkörper zumindest einmal ausgeführt, da das Abbruchkriterium erst am Ende der Schleife überprüft wird. Die Schleife wird mit repeat eingeleitet und wird solange wiederholt bis die Bedingung in der until-Zeile erfüllt ist. repeat …. until (bedingung = true); Hinweis:Die repeat-until-Schleife benötigt für den Schleifenkörper keinen Anweisungsblock, es können mehrere Anweisungen ohne Klammer mit begin und end; in die Schleife geschrieben werden.

24 Programmflusskontrolle Schleife mit Abbruchkriterium am Anfang Bei dieser Schleifenart wird zuerst die Überprüfung durchgeführt, ob der Schleifenkörper ausgeführt oder die Schleife verlassen werden soll. Das kann dazu führen, dass der Schleifenkörper eventuell gar nicht ausgeführt wird. while (bedingung = true) do begin …. end; Hinweis:Für den Anfänger ist es meist schwierig zu entscheiden, welcher Typ von Schleife verwendet werden soll. In den meisten Fällen kann das durch die Frage, wie oft der Schleifenkörper mindestens ausgeführt werden muss, entschieden werden. Ist die Antwort 0, so muss man eine while-Schleife einsetzen.

25 Programmflusskontrolle Schleife mit Schleifenzähler Sehr häufig tritt die Notwendigkeit auf, eine bereits zu Beginn bekannte Zahl von Schleifendurchläufen absolvieren zu müssen. Für diesen Spezialfall wurde ein spezielles Schleifenkonstrukt geschaffen, das mehrere Schritte in einem Statement durchführt. Dieses oft auch „for-Schleife“ genanntes Konstrukt erlaubt es, mit einer einzigen Zeile eine Laufvariable ("Schleifenzähler") von einem vorgegebenen Startwert bis zu einem bestimmten Endwert n-mal zu durchlaufen. Nach jedem Durchlauf wird der Schleifenzähler automatisch um 1 erhöht. Der Schleifenzähler muss eine Variable vom Ordinaltyp sein (ganzzahlig oder Aufzählungstyp). var sz: integer; ….. for sz := Startwert to Endwert do begin … end;

26 Unterprogramme - Prozeduren und Funktionen •Professionelles Programmieren bedeutet immer auch mit möglichst wenig Aufwand den maximalen Erfolg zu erzielen. Eine der Strategien, möglichst hohe Effizienz beim Programmieren zu erzielen, ist der Einsatz von wieder verwendbarem Code. •Die Idee hinter Unterprogrammen ist einfach: wenn man einen Programmteil so gestaltet, dass dieser nur über eine definierte Schnittstelle benützt werden kann und keine Nebenwirkungen auftreten, so kann dieser Programmcode in verschiedenen Situationen immer wieder aufgerufen werden.

27 Unterprogramme - Prozeduren und Funktionen Aus der Sicht des Programmierers gibt es zwei Arten von Unterprogrammen: Prozeduren und Funktionen. Der Unterschied zwischen diesen beiden Arten liegt darin, dass Funktionen einen Rückgabewert haben und Prozeduren keinen. Man kann also Funktionen in Ausdrücke syntaktisch genau so einbauen wie Konstanten. Allerdings liefern diese "Konstanten" keinen konstanten Wert sondern eben den jeweils berechneten Funktionswert. Die klare Unterscheidung von Prozeduren und Funktionen ist eine Eigenart von Pascal, andere Programmiersprachen kennen nur Funktionen.

28 Prozeduren Wie schon erwähnt, haben Prozeduren keinen Rückgabewert - das heißt aber nicht, dass man aus Prozeduren keine dort berechneten Werte zurückgeben kann, sondern nur, dass der Prozedurname nicht wie eine Konstante in den Code eingebaut werden kann. Eine Prozedur weist folgende Struktur auf: Procedure Name (Parameterliste);  Prozedurkopf var  lokale variablen ….. begin …..  Prozedurkörper end; In der Kopfzeile werden der Name der Prozedur und eventuelle Parameter deklariert. Werden keine Parameter übergeben, so lässt man die Klammer einfach weg. Die Übergabe der Parameter kann auf zweierlei Art erfolgen: Entweder als Konstante, oder als Variable. Soll ein Parameter variabel sein, so muss dies durch ein vorgestelltes var-Statement deklariert werden. In diesem Fall kann die Prozedur diesen Wert ändern und die Änderung wird nach außen auch sichtbar. Die Parameterliste entspricht syntaktisch einer normalen Variablendeklaration, es dürfen auch mehrere Variablen gleichen Typs mit Komma getrennt zusammengefasst werden. Fast jedes Unterprogramm benötigt Variablen zur Durchführung der Aufgabe. Hilfsvariablen, die nur während der Ausführung der Prozedur notwendig sind, werden als lokale Variablen deklariert. Diese werden zwischen Prozedurkopf und Prozedurkörper deklariert und sind nur während der Abarbeitung des Unterprogramms vorhanden und gültig. Lokale Variablen verlieren ihren Wert zwischen zwei Aufrufen der Prozedur.

29 Prozeduren Die folgenden drei Prozeduraufrufe zeigen drei verschiedene aber typische Einsatzfälle von Prozeduren. procedure LoadStandardPalette; Diese Prozedur lädt einen Satz von vordefinierten Farben. Parameter sind nicht nötig, daher wird die Klammer weggelassen. procedure MarkAllItems (ItemID: ItemType; ClassNumber: byte); Hier werden zwei Parameter übergeben, die dazu dienen, im Prozedurkörper die notwendigen Informationen zur Bearbeitung der Aufgabe zur Verfügung zu haben. procedure M2R (xin,yin: longint; var xout,yout: double); Bei diesem Aufruf werden nicht nur Parameter an die Prozedur übergeben, sondern es wird auch ein Ergebnis zurückgegeben. Die Parameter xout und yout haben nach dem Aufruf der Prozedur einen von der Prozedur veränderten Wert.

30 Funktionen Für Funktionen gilt im Wesentlichen dasselbe wie für Prozeduren. Zusätzlich gibt eine Funktion einen Wert zurück, der dem Namen der Funktion zugewiesen wird. Darum muss im Kopf einer Funktion der Typ des Rückgabewerts deklariert werden (vor dem abschließenden Strichpunkt, durch Doppelpunkt und Typbezeichner). Im Körper der Funktion existiert eine (undeklarierte) Variable mit dem Namen „result“. Dieser Variablen muss der Rückgabewert zugewiesen werden. function Name (Parameterliste): type;  Prozedurkopf var  lokale variablen ….. begin …..  Prozedurkörper result := Rueckgabewert; end; Hinweis: In Standartpascal hat die Rückgabevariable den gleichen Namen wie die Funktion selbst. Delphi unterstützt auch diesen Syntax noch. Allerdings ist die Benutzung des „result“ verständlicher.

31 Funktionen Beispiel: Im Folgenden ist die Deklaration und die Anwendung einer einfachen Funktion gezeigt, die immer den größeren von zwei Werten zurück liefert: function CalcMax (v1, v2: double): double; begin if v1 > v2 then result := v1 else result := v2; end;... var gewicht : double; begin... gewicht := CalcMax(gewicht, 50); … Die Zuweisung der Funktion CalcMax zur Variablen FillWeight setzt diese auf den Wert von Weight falls Weight größer als 50 ist, ansonsten wird der Wert 50 zugewiesen.

32 Funktionen Man kann jede Funktion aber auch in beliebigen Ausdrücken einsetzen: z.B.: if sqr(CalcMax(Preis1, Preis2)) > Grenzwert then... Hier wird zuerst die Funktion CalcMax aufgerufen, um das Maximum der beiden Preise Price1 und Price2 zu ermitteln, dann wird das Resultat quadriert und dann das Quadrat des größeren Preises mit dem Wert Grenzwert verglichen.

33 Eingebaute Funktionen Delphi besitzt eine ganze Menge von vordefinierten Funktionen und Prozeduren. Diese alle sind übrigens nicht einfach so vorhanden, sondern wurden wiederum in Pascal programmiert. Hier sollen einige wichtige aufgeführt werden. In einem späteren Kapitel werden Klassen und Objecte besprochen. Kurz gesagt bieten diese die Möglichkeit Variablen und Prozeduren/Funktionen zusammenzufassen. Nimmt man die „Standardfunktionen“ und die der Objekte zusammen (zumal man noch viele viele dazukaufen oder auch selber programmieren kann), so kommt man auf tausende Funktionen die uns Delphi (und auch Windows) anbietet. Kein Programmierer der Welt kann dies alles im Kopf behalten. Deshalb ist eines der wichtigsten Instrumente beim Programmieren die „Hilfe-Taste“ F1. Steht man auf einem Wort, so wird direkt zu einer Auswahl von möglichen Hilfstexten verwiesen.

34 Eingebaute Funktionen AbsAbsolutwertLengthGibt die Länge einer Zeichenkette zuück ArctanArcustangensLnLogarithmus ChrASCII-Code eines ZeichensOrdOrdnungsnummer eines Typelementes CopyKopiert einen Teil eines StringsPreVorhergehender Wert CosCosinusRandomZufallszahl DecDecrementierenRoundRundet einen Zahlenwert floattostrWandelt eine reelle Zahl in einen StringSinSinus Frac Liefert die Nachkommastellen einer reellen Zahl SqrQuadrat IncIncrementSqrtWurzel Insert Fügt einen Teilstring in einen anderen String ein SuccNächster Wert Int Liefert den ganzzahligen Teil einer reellen Zahl (durch abschneiden) StrToIntEine Zeichenkette in eine Ganzzahl wandeln inttostrWandelt eine ganzzahl in einen StringStrtoFloatEine Zeichenkette in eine reelel Zahl wandeln Die Tabelle zeigt eine klitzekleine Auswahl von wichtigen Delpi-Funktionen

35 Komplexe Datentypen - Felder Möchte man mehrere Variablen vom gleichen Typ anlegen und stehen diese Variablen ín einer Beziehung zu einander, so bieten sich dazu Felder an. Unter einem Feld versteht man die regelmäßige Anordnung von Variablen des gleichen Typ, in einer Art und Weise, dass die einzelnen Variablen über einen Index angesprochen werden können. Felder können eine oder mehrere Dimensionen aufweisen. Die Deklaration eines Feldes geht nach folgendem Schema: Name : array[Index1..Index2] of AType; Wobei Index1 und Index2 ganzzahlige Konstanten sein müssen. Der Typ AType kann beliebig sein, er muss nur bereits deklariert sein. Die beiden Punkte in der Deklaration sind nicht willkürlich, sondern sind Teil der Syntax (lies: "bis"). Mehrdimensionale Felder werden deklariert, indem man die entsprechenden Indexbereiche durch Beistriche getrennt in die eckigen Klammern schreibt: Name : array[von1..bis1, von2..bis2, von3..bis3] of AType; Um auf einzelne Werte eines Feldes zugreifen zu können, verwendet man den Variablenname gefolgt von eckigen Klammern, in denen die entsprechenden Indizes stehen. So adressiert zum Beispiel der Ausdruck MeinFeld[2,8] das Element des Feldes MeinFeld in der 2. Spalte und der 8. Zeile. Die Zahl der Indizes muss immer mit der Deklaration übereinstimmen.

36 Komplexe Datentypen - Felder Felder werden immer dann eingesetzt, wenn viele gleichartige Werte gespeichert werden müssen. So könnte man beispielsweise die Noten der Schüler einer Klasse in einem eindimensionalen Feld speichern. Durch den Einsatz eines Feldes kann man also mit nur einer Variablen (dem Feld eben) auf jede Note zugreifen. Angenommen, man möchte den Durchschnitt errechnen, so könnte man das einfach mit einem Feld und einer for-Schleife machen: const SCHUELER = 28; var Noten : array[1..SCHUELER] of integer; i : integer; durchschnitt : double; begin durchschnitt := 0; for i := 1 to SCHUELER do durchschnitt := durchschnitt + Noten[i]; durchschnitt := durchschnitt / SCHUELER; end; Diese Beispiel hat wohl keine praktische Bedeutung, zeigt aber die Syntax von und den Umgang mit Feldern auf einfache Weise.

37 Komplexe Datentypen - Records Oft steht man vor der Aufgabe Variable unterschiedlichen Typs zu einer gemeinsamen Datenstruktur zu verbinden. So könnte man zum Beispiel Schülerdaten wie Name, Geburtsdatum und Schuhgröße zusammenfassen. Für solche Zusammenfassungen verwendet man Records. Diese werden folgendermaßen deklariert: Name : record Variable1 : Typ1; Variable2 : Typ2;... end; Die einzelnen Variablen können nun einen beliebigen Typ haben. Der Zugriff auf den Inhalt eines Records erfolgt über den Punkt Operator. Dabei wird zuerst der Name des Records geschrieben und dann mit einem Punkt dazwischen der Name der betreffenden Variablen. Beispiel: Im folgenden Beispiel wird ein Record zur Speicherung von Schülerdaten deklariert: type TSchueler : record Name : string; Gewicht : double; end; var Schueler : TSchueler; begin Schueler.Name := ‚Lea März‘; // Ähnlichkeiten mit am Kurs teilnehmenden Schülern wären rein zufällig Schueler.Gewicht := 52; end;

38 TCanvas Pen •Color: Gibt die Farbe für den Pen in TColor an •Width: Gibt die Breite an, in der der Rahmen oder eine Linie gezogen wird (Mindestwert=1) •Style: Erlaubt es, Linien gestrichelt zu zeichnen. Im Allgemeinen sollte dieser Wert auf der Standarteinstellung psSolid belassen werden. Nur in dem Fall, dass man eine Figur ohne Rahmen zeichnen will, sollte man psClear benutzen, da es nichts nutzt, Width auf 0 zu setzen •Mode: TPenMode erlaubt eine Menge Einstellungen, wie denn der Pen nun genau gezeichnet werden soll. Hierbei gilt das gleiche wie bei CopyMode von TCanvas: Die Standarteinstellung der Eigenschaft (pmCopy) sollte in 99% aller Fälle beibehalten werden. Nur für spezielle grafische Effekte sollte man umschalten. Brush •Color: Diese Eigenschaft (natürlich wieder vom Typ TColor) regelt die Füllfarbe für den Hintergrund •Style: Mit Hilfe dieser Eigenschaft kann man auch den Hintergrund nicht komplett füllen lassen, sondern ein Muster verwenden. Die Standarteinstellung ist bsSolid, bei der der komplette Hintergrund gefüllt wird. Wird bsClear verwendet, wird der Hintergrund Transparent gezeichnet, ein häufig praktischer Effekt. Die anderen Füllmuster sind von wenig wichtiger Bedeutung. Das 1. Problem ist die mangelnde Anzahl an Muster, die sich aber durch das verwenden einer Bitmap (s.u.) lösen lässt. Andererseits hat man keinen direkten Einfluss auf die Hintergrundfarbe, da die 2. Farbe, die verwendet wird, immer transparent ist. Um einen Hintergrund mit 2 Farben zu verwenden, muss man also vorher füllend mit der anderen Farbe zeichnen •Bitmap: Diese Eigenschaft macht es möglich, nicht nur mit einer Farbe oder einem Vorgegebenen Muster zu füllen, sondern auch eigene Füllungen zu verwenden. Dabei sind aber einige Einschränkungen vorhanden, da das Bild genau 8*8 Pixel groß sein muss. •Abschließend muss noch die Eigenschaft Handle erwähnt werden, die häufig für die GDI-Funktionen der API benötigt wird und das Handle des Brush zurückgibt Font •Hier wird die verwendete Schriftart für die Ausgabe von Text verwendet. Font ist vom gebräuchlichen Typ TFont. Die hier eingegeben Werte wirken sich nur auf wenige Canvas-Methoden aus (TextExtent, TextHeight, TextOut, TextRect, TextWidth).

39 TCanvas Flächenmethoden •Chord Zeichnet eine Ellipse, die durch eine Gerade getrennt ist. Die 8 Parameter sind jeweils vom Typ Integer und geben Koordinaten an. Die ersten 4 sind jeweils zu Paaren die Eckpunkte des die Ellipse umschließenden Rechteckes (also der 1. Wert der x-Wert der ersten Eckpunktes, der 2. Wert der y-Wert des ersten Eckpunktes...). Die Größe der Ellipse ist durch dieses Rechteck beschränkt. Die Parameter 5-8 geben die Linie an, die die Ellipse trennt. Der fünfte und sechste Parameter sind x- und y-Wert des einen Punktes, der siebte und achte des anderen Punktes. •Ellipse Zeichnet, wie der Name schon sagt, eine Ellipse. Die Ellipse ist durch ein Rechteck beschränkt und füllt dieses Rechteck möglichst voll aus. Das Rechteck selber ist durch 4 Parameter gegeben, die 2 gegenüberliegende Eckpunkte des Rechtecks angeben. •FillRect Füllt ein Reckeck mit der Farbe, die in Brush angegeben ist. Ein Rand wird nicht gezeichnet. Das Rechteck ist durch 4 Koordinaten angegeben, die wie üblich 2 gegenüberliegende Eckpunkte des Rechtecks darstellen. Zu beachten ist, dass die beiden Begrenzungslinien (die in der Brush-Farbe gezeichnet werden), die an den ersten Punkt angrenzen, mitgezeichnet werden, die an den zweiten Punkten angrenzen, werden jedoch nicht mitgezeichnet. Bei dieser Methode gibt es nur einen Parameter vom Typ TRect, der ein Recheck darstellt. Will man trotzdem mit 4 einzelnen Koordinaten arbeiten, sollte man die Funktion Rect verwenden, die 4 Koordinaten in ein TRect umwandelt. •FrameRect Zeichnet nur den Rahmen eines Rechtecks mit der Farbe aus dem Brush (!!!). Der Rahmen ist immer genau einen Pixel breit. Die innere Fläche des Rechtecks wird transparent gezeichnet. Der das Rechteck angebende Parameter ist wieder vom Typ TRect. •Pie Zeichnet ein Kuchenstück, also den Teil einer Ellipse. Die Ellipse ist durch ein Rechteck angegeben (erste 4 Parameter). Vom Mittelpunkt der Ellipse trennen 2 Linien (Endpunkte sind die Parameter 5-8) die Ellipse. Der Bereich der im Uhrzeigersinn zwischen dem ersten und dem 2. Punkt liegt, wird nun gezeichnet. Der Rand sind die Linien, die vom Mittelpunkt der Ellipse ausgehen, und der Rand der Ellipse. •Arc Zeichnet, ähnlich wie Pie, den Ausschnitt einer Ellipse, aber keine Fläche, sondern nur einen Ausschnitt des Randes der Ellipse. Die Parameter sind die gleichen wie bei Pie. •Polygon Diese Procedure zeichnet ein Polygon. Der einzige Parameter ist ein (beliebig) großes Array von Typ TPoint. Alle Punkte werden nacheinander miteinander verbunden, die Linien mit dem Pen gezeichnet und der Raum dazwischen mit dem Brush gefüllt. •Rectangle Zeichnet ein Rechteck. Die Begrenzungslinien, wie üblich, mit Pen und die Fläche mit dem Brush. Als Parameter die 4 Integerwerte, die die Eckpunkte des Rechtecks angeben. In neueren Delphiversionen kann man die 4 Integerwerte auch durch ein TRect ersetzen. •RoundRect Zeichnet, genau wie Rectangle, ein Rechteck. Der einzige Unterschied ist, dass die Ecken leicht abgerundet sind. •Anmerkung: Hier ist häufig von Ellipsen die Rede. Sollte ein Kreis gezeichnet werden, muss das umgebende Rechteck nur ein Quadrat sein.

40 TCanvas Methoden, um Bitmaps aufzutragen oder herauszukopieren •BrushCopy Zeichnet einen Teil (3. Parameter: TRect) eines Bitmap (2. Parameter: TBitmap) auf die Zeichenfläche. Der Bereich, in den gezeichnet werden soll, ist durch den ersten Parameter (TRect) gegeben. Dabei wird gegebenenfalls die Grafik verzerrt, was aber nicht immer schön aussieht und daher vermieden werden sollte. Eine Farbe (4. Parameter: TColor) des Bitmaps wird nicht mitgezeichnet, sondern diese Pixel werden mit der Brush-Farbe des Ziels gezeichnet. Dies kann verwendet werden, um transparent zu zeichnen oder andere Effekte zu erzielen. BrushCopy ist sehr langsam (Draw und StretchDraw sind ca. 200 mal so schnell) und sollte daher nicht zum normalen zeichnen verwendet werden. •CopyRect Zeichnet in einem Bereich (1. Parameter: TRect) auf dem aktuellen Canvas einen Bereich (3. Parameter: TRect) von einem anderen Canvas (2. Parameter: TCanvas). Mit Hilfe von Einstellungen bei CopyMode lässt sich eine direkte Änderung des Bildes realisieren. Wenn beide Rechtecke nicht gleich groß sind, wird der Bereich gestretcht ausgegeben, was nicht unbedingt gut aussieht. •Draw Zeichnet eine Grafik (3. Parameter: TGraphic) an eine Stelle (1. und 2. Parameter: Integer) des aktuellen Canvas. Da alle wichtigen Grafiktypen (wie TBitmap oder TJPEGImage) von TGraphic abgeleitet sind, lässt sich praktisch jede Grafik auf den Canvas zeichnen. Dabei wird die Graphik in voller Größe (wenn sie nicht Größer als die Zeichenfläche ist) ausgegeben und kann nicht größenverändert werden. •StretchDraw Zeichnet ebenfalls eine Graphik (2. Parameter: TGraphic) auf die Zeichenfläche. Aber der komplette Bereich, in dem gezeichnet wird, ist durch den ersten Parameter (TRect) angegeben, so dass das Bild gestretcht wird, falls es nicht die exakte Größe des Rechtecks hat. •DrawFocusRect Zeichnet einen Rahmen (wie er bei fokkusierten Komponenten üblich ist) um das Rechteck, das mit dem Parameter (TRect) gegeben ist. Dabei wird eine Form des Zeichnens mit XOR verwendet, der Rahmen verschindet also bei erneutem aufrufen. Ist eigentlich nur bei der Programmierung von Komponenten von Bedeutung.

41 TCanvas Textmethoden •TextWidth Benötigt als Parameter einen String. Es wird mit dieser Funktion nichts gezeichnet, sondern ermittelt, wie viele Pixel der Übergebene Text bei den aktuellen Fonteinstellungen breit ist. Dieser Wert wird als Integer zurückgegeben. Diese wird benötigt, um evtl. andere Objekte neben dem Text anzuordnen. •TextHeight Ähnlich wie TextWidth, nur wird die Höhe des Textes zurückgegeben. •TextExtent TextHeight und TextWidth in einem. Aus dem String-Parameter wird die Höhe und Breite bei den aktuellen Font-Einstellungen ermittelt und in einem Typ TSize (Mit den Integerwerten cx und cy) zurückgegeben. Ist etwas schneller, als TextHeight und TextWidth für den gleichen Text aufzurufen. •TextOut Gibt einen Text (3. Parameter: String) an einer Position (1. und 2. Parameter: Integer) aus. Der Hintergrund wird dabei in der Brush-Farbe gezeichnet. •TextRect Gibt einen Text (4. Parameter: String) an einer Position (2. und 3. Parameter: Integer) aus. Jeglicher Text, der nicht innerhalb eines angegebenen Rechtecks (1. Parameter: TRect) liegt, wird nicht dargestellt. Die Hintergrundfarbe des Rechtecks wird mit dem Brush gezeichnet. Im Allgemeinen sollte die Position des Textes mit der linken, oberen Ecke des Rechtecks übereinstimmen. Vor allen Dingen praktisch, falls der Text eine bestimmte Größe nicht überschreiten darf (ich stelle mir einem Button vor, bei dem die Caption über den Rahmen geht).

42 TCanvas Andere Methoden •FloodFill Füllt einen Bereich mit der im Brush angegebenen Farbe. Die ersten beiden Parameter (jeweils Integer) geben den ersten Punkt an, von dem ausgehend gefüllt wird. Der 4. Parameter erlaubt 2 Einstellungen: Ob solange gefüllt wird, bis die im dritten Parameter (Typ: TColor) angegebene Farbe erreicht wird, diese also eine Grenze der Füllung bildet. Dafür muss der Parameter den Wert fsBorder haben. Soll solange gefüllt werden, bis die Farbe wechselt, muss im dritten Parameter die Farbe an der entsprechenden Position angegeben werden und im vierten Parameter der Wert fsSurface. Dies entspricht dann dem Farbfüller von Paint. •MoveTo Setzt die aktuelle Stiftposition auf den angegeben Punkt (2 Parameter: Integer). Dies ist wichtig für LineTo. Die Stiftposition lässt sich auch mit einer Zuweisung an PenPos (Typ: TPoint) regeln, und mit PenPos lässt sich die Position auslesen. •LineTo Zeichnet von der aktuellen Stiftposition (siehe MoveTo) eine Linie an die durch die beiden Integerparameter angegebene Position. Der letzte Pixel (also die bei LineTo angegebene Position) wird nicht (!!!!) mitgezeichnet. Dies ist aber auch nicht immer notwendig, da LineTo die Stiftposition auf dieses Pixel setz und man so direkt von dort eine neue Linie zeichnen kann. •PolyLine Zeichnet mehrere Linien. Der Endpunkt der ersten Linie ist der Anfangspunkt der zweiten Linie etc. Die einzelnen Punkte werden an PolyLine durch ein Array of TPoint übergeben. Wichtig bei dieser Methode: die Stiftposition wird nicht benutzt oder verändert. Mit PolyLine lässt sich außerdem ein Polygon zeichnen, wenn man der ersten und letzten Punkt als identisch angibt. Beinhaltet das Array nur einen Punkt, wird nichts gezeichnet, beinhaltet es 2 Punkte, wird eine Linie gezeichnet.


Herunterladen ppt "Delphi Informatik-AG. Übersicht •Pascal Syntax •Konstanten •Variablen •Typen •Prozeduren/Funktionen •Schleifen •Verzweigungen."

Ähnliche Präsentationen


Google-Anzeigen