athena.gif (7242 Byte)  

 2. Grundlagen der Programmierung mit Delphi
 2.1. Die Delphi-Entwicklungsumgebung
 2.2. Das Prinzip der ereignisgesteuerten Programmierung
 2.3. Schrittfolge zur Programmerstellung mit Delphi
 2.4. Projektverwaltung unter Delphi
         2.4.1. Beispiel für die Dateistruktur eines Projektes
         2.4.2. Dateien, die in der Entwicklungsphase erzeugt werden
         2.4.3. Vom Compiler erzeugte Projektdateien
         2.4.4. Empfohlene Vorgehensweise im Unterricht - Projektsicherungsprogramm
 2.5. Struktur einer Unit

2.1. Die Delphi-Entwicklungsumgebung


Nach dem Start von Delphi werden verschiedene Fenster geöffnet, die für die visuelle Programmierarbeit notwendig sind. Diese Arbeitsfläche wird als Integrierte Entwicklungsumgebung, kurz IDE (engl. Integratet Development Enviroment) bezeichnet. Alle Fenster der IDE können frei und einzeln auf dem Bildschirm positioniert oder geschlossen werden. Durch das Schließen des Hauptfensters wird Delphi beendet.

Die nachstehende Tabelle gibt einen einführenden Überblick zu Erscheinungsbild und Funktion der wichtigsten Bestandteile der Delphi-Entwicklungsumgebung:
 
Das Formular stellt das zentrale Entwicklungsobjekt eines Delphi-Programms dar. Auf ihm werden die gewünschten Komponenten wie Schaltflächen, Menüs und Eingabefelder per Mausklick platziert und größenmäßig angepasst. Das Erscheinungsbild des Formulars entspricht dem Aussehen des Windows-Fensters, in dem das fertige Programm später ablaufen wird. 

Die Komponentenpalette ist in verschiedene Register (Standard, Zusätzlich usw.) unterteilt, und diese erlauben die Auswahl der benötigten Windows-Komponenten.

Mit Hilfe des Objektinspektors werden Darstellungsweise und Verhalten der Objekte (Komponenten) in einem Formular sowie das Aussehen des Formulars selbst festgelegt. Das Erscheinungsbild wird über die Seite "Eigenschaften", das Verhalten beim Eintritt eines Ereignisses über die Seite "Ereignisse" eingestellt.

Der Quelltexteditor wird zum Schreiben des Programmcodes in der Programmiersprache Pascal genutzt. Dabei generiert Delphi für neu in das Formular eingefügte Komponenten automatisch den Programmcode, der dann im Editor angezeigt wird. Dem Programmierer obliegt daher "nur noch" die Einarbeitung der Algorithmen zur Ereignisbehandlung.

Seitenanfang

2.2. Das Prinzip der ereignisgesteuerten Programmierung


Die Programmierung mit Delphi wird auch als ereignisgesteuerte Programmierung bezeichnet. Ein Ereignis ist eine Aktion, die den Programmablauf beeinflusst.

Was sind Ereignisse?

Reaktionen auf Ereignisse  
Als Ereignisbehandlungsroutinen werden diejenigen Anweisungen bezeichnet, die ausgeführt werden, sobald ein Ereignis eintritt.
Seitenanfang

 2.3. Schrittfolge zur Programmerstellung mit Delphi


Die nachfolgende Tabelle soll aufzeigen, wie sich der "klassische" Software-live-cycle unter den Gegebenheiten einer visuellen Programmierumgebung erweitert bzw. modifiziert. Dabei darf man sich den Durchlauf der einzelnen Schritte keinesfalls als einmalige lineare Abfolge vorstellen, vielmehr entstehen durch Rücksprünge und das mehrmalige Durchlaufen von Teilen der Schrittfolge zyklische Strukturen. Werden z.B. bei der Resultatsprüfung unter Punkt 5) Fehler festgestellt, muss wieder bei Punkt 2A) begonnen werden, indem man logische Fehler im Algorithmus beseitigt.

Und schließlich kann auch die gesamte Schrittfolge als zyklische Struktur begriffen werden: kaum ist die Version 1.0 eines Programms ausgeliefert, werden bisher unerkannte "Bugs" entdeckt und Wünsche zur Erweiterung der Funktionalität des Programms laut - also neue Problemformulierung, Problemanalyse, ... und schon existiert die Version 1.1 usw.
 
1) Problemformulierung
"Es ist ein Programm zu erstellen, das folgendes leistet: ... " 
So oder so ähnlich beginnt die Formulierung dessen, was das Programm im ganzen realisieren soll. Man wird mehr oder weniger klare Vorstellung zu notwendigen Eingabewerten, zum Erscheinungsbild des Programms, zur Art der Ergebnisausgabe, zum potentiellen Nutzerprofil etc. vorfinden.

Die nachfolgenden beiden Schritte verlaufen im Prinzip parallel - die Programmierhandlung springt zwischen algorithmischer und visueller Seite hin und her, weil der algorithmische Aufbau des Programms bestimmte Komponenten einer Nutzeroberfläche bedingt bzw. die gewünschte Oberflächenstruktur Einfluss auf die Modularisierung der Lösungsalgorithmen haben kann. 

2A) Algorithmischer Problemlösungsprozeß
                - Algorithmische Seite - 
2V) Benutzeroberfläche erstellen und 
       Eigenschaften der Objekte festlegen
                     - Visuelle Seite -
I) Problemanalyse
Das Gesamtproblem wird in überschaubare Teilprobleme zerlegt - Modularisierung und Modellierung der Problemsituation.

II) Entwurf von Lösungsalgorithmen für die Teilprobleme
strukto1.gif (1910 Byte)Die Lösungswege dazu werden zunächst in abstrakter Weise beschrieben. Je nach Komplexität kann dies in verbaler Form geschehen (Eindeutigkeit!) oder es kommen grafische Beschreibungsformen, z.B. Struktogramme oder Programmablaufpläne zum Einsatz. 
Es wird noch nicht mit konkreter Programmiersprache gearbeitet.

III) Synthese der Teillösungen 
Nunmehr werden die entwickelten Teillösungen zur Gesamtlösung verknüpft und notwendige E/A-Funktionen zwischen den einzelnen Modulen festgelegt.

Mit zunehmenden Voranschreiten im algorithmischen Problemlösungsprozeß wächst auch die Vorstellung über Beschaffenheit und Funktionalität der Benutzeroberfläche. 

Erstellt wird diese durch Anordnung aller notwendigen Komponenten (Textfelder, Optionsfelder, Eingabefelder, Schalter usw.) auf dem Formular. 

Die Auswahl der Komponenten erfolgt über die Komponentenpalette. Dabei werden mit Hilfe des Objektinspektors die Eigenschaften der Komponenten festgelegt, z.B. Größe, Farbe, Bezeichnung der Schaltflächen, Text- und Eingabefelder.

Spätestens an dieser Stelle sollte das Projekt erstmals gespeichert werden!

4) Ereignisbehandlung codieren 
     - "Hochzeit" von Algorithmus und Programmoberfläche -
Zunächst werden über den Objektinspektor diejenigen Ereignisse ausgewählt, die für den späteren Programmablauf von Bedeutung sein werden (z.B. Klicken eines Schalters).
In einer zugehörigen Ereignisbehandlungsroutine wird dann im Quelltexteditor in der Programmiersprache Pascal beschrieben, wie die jeweiligen Komponenten auf das betreffende Ereignis reagieren sollen.
Dabei werden also die unter 3A) gefundenen Lösungsalgorithmen in Programmiersprache "übersetzt" und die Ergebnisausgabe wiederum über Komponenten realisiert.
5) Test-Korrektur-Durchläufe 
     
    I) Syntaxprüfung: Vorm ersten Start sollte unbedingt die syntaktische Korrektheit der eingegebenen Pascal-Anweisungen getestet und ggf. korrigiert werden. Anschließend wird das Projekt erneut gespeichert!
    II) Resultatsprüfung: Das syntaktisch korrekte Programm wird nun compiliert und gestartet. Um die Richtigkeit seiner Resultate hinreichend abzusichern, muss es mit verschiedenen Beispieleingaben getestet werden. Treten während des Tests Fehler auf, sind die oben genannten Schritte zu wiederholen.
6) Sicherung der Dateien, Dokumentation und Nutzung des Programms 
In einem eigens dafür angelegten Verzeichnis (z.B. auf Diskette) werden abschließend alle für eine spätere Weiterbearbeitung des Programmprojektes nötigen Dateien gesichert. 
Die beim Compilieren entstandene Programmdatei kann nunmehr unabhängig von Delphi unter Windows genutzt werden.

Seitenanfang

  2.4. Projektverwaltung unter Delphi


Ein Delphi-Projekt ist eine Sammlung aller Dateien, die zusammen eine Delphi-Anwendung auf dem Entwicklungssystem ergeben. Einige dieser Dateien werden im Entwurfsmodus erzeugt, andere werden bei der Compilierung des Projekt-Quelltextes angelegt. 

Merke: Jedes Projekt sollte unbedingt in einem separaten Verzeichnis gespeichert werden.

2.4.1. Beispiel für die Dateistruktur eines Projektes

Ein Delphi-Projekt namens Projekt1 bestehe aus zwei Formularen: (Dateien sind zur Erläuterung anklickbar) 
projdat.jpg (56648 Byte)

2.4.2. Dateien, die in der Entwicklungsphase erzeugt werden:


2.4.3. Vom Compiler erzeugte Projektdateien:


2.4.4. Empfohlene Vorgehensweise im Unterricht:

Das nachfolgende Szenario geht davon aus, dass der Unterricht in einem vernetzten Computerkabinett durchgeführt wird, wobei jedem Schüler ein temporär gemapptes Serverlaufwerk (bei uns L:) zum Lesen und Schreiben zur Verfügung steht. Auf diesem Laufwerk werden zur Entwicklungszeit alle zum Delphi-Projekt gehörenden Dateien geführt.

Zum Unterrichtsende speichern die Schüler alle Projektdateien dauerhaft auf Diskette, und falls in der folgenden Stunde am Projekt weiter gearbeitet werden soll, werden die notwendigen Dateien wiederum von A: nach L: kopiert.
Ein ausschließliches Arbeiten mit Disketten hat sich als wenig praktikabel erwiesen, da das Compilieren dann jedes Mal unangenehm lange dauert und durch das dauerhafte Ablegen der relativ großen EXE-Dateien die Disketten schon nach wenigen Projekten voll sind.

projsav1.gif (2104 Byte)Um die Speicherung auf die wirklich notwendigen Projektdateien zu begrenzen, wurde (übrigens auch unter Delphi!) ein einfaches Projektsicherungsprogramm namens projsave.exe entwickelt und steht hier zum Download bereit. Eventuelle Nutzer müssten natürlich das beschriebene Szenario den Gegebenheiten in ihrem Kabinett anpassen ;-)
Wer das Programm modifizieren oder verbessern möchte, kann sich auch die Quelltexte im Zip-Format herunter laden - Mail an mich wäre nett!

Für das derzeitige Netzwerk des Lessing-Gymnasiums Plauen sieht das ganze dann so aus:


Seitenanfang

2.5. Struktur einer Unit unter Delphi

unit1.jpg (24429 Byte)Die nachfolgend aufgelistete Unit bezieht sich auf das abgebildete einfache Formular - Addition zweier Zahlen.
Bemerkenswert (und beruhigend!) ist die Tatsache, dass alle in der Unit schwarz geschriebenen Zeilen während der visuellen Formularerstellung automatisch von Delphi erzeugt werden.
Nur die wenigen rot gekennzeichneten Zeilen der Prozedur zur Realisierung der Addition sind wirklich vom Programmierer zu tippen.
Dies untersetzt die eingangs getroffene Feststellung, dass auch Programmier-Einsteiger ohne nennenswerte Vorkenntnisse unter Delphi schnell zu "greifbaren" Ergebnissen - sprich ablauffähigen Programmen - gelangen und einfache Algorithmen implementieren können. Es erscheint daher sinnvoll, erst nach einigen Projektübungen zum praktischen Teil der Programmierung die Lernenden sukzessive mit der Struktur einer Unit und der Funktion ihrer Bestandteile vertraut zu machen.

 
Strukturelemente der Beispiel-Unit
Benennung / Bedeutung
unit Utest1; Kopfzeile der Unit: enthält deren Dateinamen
interface Interface-Teil: bestimmt, was in der Unit von außen zugänglich ist
uses
SysUtils, WinTypes, WinProcs, Messages, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;
Uses-Teil: Benennung von Units (Prozedurbibliotheken), die von der aktuellen Unit verwendet werden
type
TForm1 = class(TForm)
  Edit1: TEdit;
  Edit2: TEdit;
  Edit3: TEdit;
  Label1: TLabel;
  Label2: TLabel;
  Label3: TLabel;
  Button1: TButton;
  procedure Button1Click(Sender: TObject);
end;
Typdeklaration des Formularobjektes:

enthält alle Komponenten, die auf dem Formular angeordnet sind sowie die zum Formular gehörenden Prozeduren

var
  Form1: TForm1;
Deklaration globaler Variablen
hier: Variable (Objekt) Form1 vom Typ TForm1 (Objekttyp)
implementation Implementationsteil: enthält Programmteil der Prozeduren
{$R *.DFM} Formulardatei wird an die Unit gebunden
procedure TForm1.Button1Click(Sender: TObject); Kopfzeile der Prozedur
var a, b, c: real; Deklaration lokaler Variablen:
diese gelten nur in der jeweiligen Prozedur
begin
  a := StrToFloat(Edit1.Text);
  b := StrToFloat(Edit2.Text);
  c := a+b;
  Edit3.Text := FloatToStr(c);
end;
Anweisungsteil der Prozedur

Algorithmus zur Ereignisbehandlung
hier: Zugriff auf lokale Variablen

end. Schlusszeile der Unit - Ende.