Struktur einer Unit unter Delphi
Im Folgenden wollen wir einen etwas genaueren Blick auf die Struktur eines Delphi-Programms machen. Wir benützen dazu das Programm ColorMix. Wie jedes Delphi-Programm besteht es aus einem Hauptprogramm, dem Delphi-Projekt ColorMix.dpr und (in diesem Fall) einer einzigen Unit, nämlich MainFrm. Delphi legt für jedes Formular eine eigene Unit an, so dass die Zahl der Units eines Programms mindestens so groß ist (oft aber größer), wie die Zahl der Formulare.
Betrachten wir nun den Code einer Unit, der ein Formular zugrunde liegt (z.B. die Unit MainFrm), so sehen wir, dass Delphi bereits relativ viel Code selbständig erzeugt hat. Der von Delphi erzeugte Code bezieht sich auf die Komponenten des Formulars.
Der Programmierer hat bei diesem Beispiel nur wenige Zeilen zu tippen (siehe unten, in blauer Farbe markiert). Dadurch, dass Delphi sich um den Code für die visuell erzeugten und konfigurierten Komponenten kümmert, können auch Anfänger schnell zu herzeigbaren Ergebnissen kommen. |
Persönl. Anmerkung: |
Meine Erfahrung bzgl. der automatischen Erzeugung von Code ist die, dass Anfänger durch dieses Feature oft stark verunsichert werden (besonders dann, wenn sie unabsichtlich Code, der von Delphi erzeugt wurde, löschen oder verändern). Es gibt im Umgang mit Delphi eine goldene Regel, die man unbedingt einhalten sollte: für Code-Teile, die von Delphi erzeugt worden sind, ist einzig und allein Delphi zuständig; für Code den man selber erzeugt, ist man selber zuständig. Hält man sich an diese "Gewaltenteilung", so gibt es praktisch nie Probleme mit automatisch erzeugtem Code. Hält man sich nicht an diese Regel, so kommt man als Anfänger sehr schnell in Teufels Küche, da einem meist das nötige Systemwissen fehlt, um die damit verbundenen Probleme zu lösen. |
Strukturelemente der Unit |
Benennung / Bedeutung |
unit mainfrm; |
Kopfzeile der Unit: enthält deren Dateinamen, Bezeichnung der Unit und der Dateiname müssen übereinstimmen. |
interface |
Dieses Schlüsselwort leitet den Interface-Teil ein. Alle Statements, die im Interface-Teil stehen sind von außen zugänglich (d.h. zum Beispiel von einer anderen Unit aus aufrufbar). |
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ExtCtrls, StdCtrls; |
Das uses-Statement dient zum Einbinden anderer Units. In diesem Fall werden die wichtigsten Units zur Anbindung an das Windows-API spezifiziert. So enthält z.B. die Unit Forms den Code für das Formular. |
type
TForm1 = class(TForm)
SBarRed: TScrollBar;
SBarGreen: TScrollBar;
SBarBlue: TScrollBar;
LblRed: TLabel;
LblGreen: TLabel;
LblBlue: TLabel;
PnlRed: TPanel;
PnlGreen: TPanel;
PnlBlue: TPanel;
PnlMix: TPanel;
procedure SBarRedChange(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end; |
Die Typdeklaration des Formularobjekts enthält alle Komponenten, die auf dem Formular angeordnet sind und die Routinen (z.B. der Event SBarRedChange), die zum Formular gehören.
Die beiden Statements private und public dienen zur Erweiterung des Formularobjekts durch den Programmierer. |
var Form1: TForm1; |
Als Nächstes folgt die Deklaration der globalen Variablen. In unserem einfachen Beispiel ist das nur das Objekt Form1, das vom Typ TForm1 ist. Details dazu finden sich bei der objektorientierten Programmierung (LINK). |
implementation |
Der Interface-Teil ist bis zum Schlüsselwort implementation gültig. Ab dann ist der Code von außen nicht mehr zugänglich. Man spricht auch von der Implementation Section der Unit. |
{$R *.DFM} |
Dieser Kommentar hat eine spezielle Funktion: Da Pascal keine Statements zur Einbindung von externen Anweisungen kennt, bedient sich Delphi eines Tricks, indem es spezielle Kommentare erzeugt, die zwar syntaktisch ein Kommentar sind, aber durch ihre spezielle Struktur von Delphi erkannt werden und eigentlich eine Anweisung für den Compiler bzw. Linker enthalten. Solche Kommentare beginnen immer mit der Zeichenkombination "{$" . In diesem Fall bindet der Kommentar die Formulardaten ein. |
procedure TForm1.SBarRedChange(Sender: TObject); |
Kopfzeile des OnChange Events des Scrollbars SBarRed |
{var
i: integer;} |
An dieser Stelle würde die Deklaration lokaler Variablen stehen. Da unser Beispiel aber keine lokalen Variablen benötigt, ist das Statement als Kommentar eingefügt (nur um zu zeigen, wo lokale Variablen deklariert werden müssen). Lokale Variablen gelten nur für den Bereich des nun folgenden Anweisungsteils einer Prozedur. |
begin
PnlMix.Color := 65536*SBarBlue.Position + 256*SBarGreen.Position + SBarRed.Position;
PnlRed.Color := SBarRed.Position;
PnlGreen.Color := 256*SBarGreen.Position;
PnlBlue.Color := 65536*SBarBlue.Position;
end; |
Anweisungsteil des OnChange-Events. Die blauen Zeilen muss der Programmierer erzeugen. |
end. |
end. markiert immer das Ende einer Unit. Alle Statements nach end. werden vom Compiler ignoriert. |
|