Programmierkurs: Delphi: Erstellung einer grafischen Oberfläche Grundlagen

Aus Wikibooks

Grundsätze[Bearbeiten]

Um eine neue Anwendung mit grafischer Benutzeroberfläche zu erstellen, wählen Sie aus dem Menü Datei/Neu/VCL-Formularanwendung. Daraufhin wird Ihnen im Designer ein leeres Fenster mit dem Titel „Form1“ angezeigt. Der dazugehörige Code sieht folgendermaßen aus:

Code:

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs;

type
  TForm1 = class(TForm)
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

end.

Um zwischen dem Formdesigner und dem Code-Editor zu wechseln, benutzen Sie die Taste F12.

Eine grafische Oberfläche wird mittels Drag&Drop erstellt: In der Komponentenpalette wählt man die Komponente durch einen einfachen Klick aus und bewegt dann die Maus an die Stelle, wo die linke obere Ecke der Komponente sein soll. Dann zieht man mit der Maus nach rechts unten, bis die gewünschte Position erreicht ist. Wenn man nur auf das Formular klickt, wird die Komponente in einer Standardgröße, die veränderlich ist, erstellt.

Anschließend kann man im Objektinspektor die Eigenschaften der Komponente ändern, wie z.B. die Aufschrift (Caption), den Inhalt (Text, Lines oder Items), Schriftart, -größe, -farbe etc. (Font) und komponentenspezifische Eigenschaften.

Um ein Ereignis zu programmieren, das bei einer bestimmten Aktion geschehen soll, wählt man im Objektinspektor die Registerseite „Ereignisse“ und wählt das entsprechende Ereignis durch Doppelklick auf das leere Feld hinter dem Namen der Methode aus (OnClick für einen Klick, OnDblClick für einen Doppelklick, OnMouseDown für ein Runterdrücken einer Maustaste, OnMouseMove für ein Drüberfahren mit der Maus, OnKeyDown für das Drücken einer Taste, usw.). Im Code-Editor kann man allerdings auch jede Eigenschaft ohne Objektinspektor regeln. Dabei wird das Ereignis OnCreate des Formulars gewählt (wird durch Doppelklick auf das Formular erstellt):

Code:

procedure TForm1.FormCreate(Sender: TObject);
begin
  Button1.Font.Name := 'Courier New';
end;

Dies bewirkt, dass Button1 die Schriftart „Courier New“ verwendet.

Kompiliert wird das Ganze wie bei einer Konsolenanwendung mit F9 oder Start / Start.

Weitergabe[Bearbeiten]

Einem Formular steht genau eine Unit zu. Beim Abspeichern des Projekts über Datei / Alles speichern ... gelten folgende Regeln:

  • Die Projektdatei fasst alle Formulare / Units zusammen. In ihr kann auch der Programmablauf verändert werden, beispielsweise wenn ein Info-Fenster am Anfang erstellt werden soll. Sie hat die Dateiendung „.dpr“ für Delphi Project.
  • Die einzelnen Units bekommen die Dateiendung „.pas“ für Pascal. Sie beinhalten entweder den Code einer Komponente, den eines Formulars oder Funktionen. Keine Unit darf denselben Namen wie die Projektdatei haben.
  • Die Formulare bekommen in Delphi (wie im C++ Builder) die Endung „.dfm“ für Delphi Formular. Sie haben denselben Namen wie die dazugehörige Unit, bloß eine andere Endung. Delphi- und C++ Builder-Formulare sind zueinander kompatibel.
  • Hinzu kommen weitere Konfigurations- und Projektdateien (.cfg, .bdsproj, .dsk und ggf. weitere)

Bei allen Dateinamen sind Leerzeichen oder Zahlen am Anfang verboten, auch wenn das Windows theoretisch zulassen würde. Weiterhin werden folgende Dateien beim Kompilieren erzeugt:

  • Die Anwendung bekommt denselben Namen wie das Projekt, bloß mit der Endung „.exe“ für Executable. Sie ist das fertige Programm und ist (neben eventuellen Ressourcen oder Datenbanken, Grafiken, ...) die einzige Datei, die zur Ausführung relevant ist. Demnach muss man auch nur sie für eine Weitergabe als Nicht-OpenSource / Freeware mit Source weitergeben.
  • Alle Units werden kompiliert. Die kompilierte Unit ist binär und bekommt die Endung „.dcu“ für Delphi Compiled Unit. Eine DCU-Datei ist nur mit der Delphi-Version, mit der sie erstellt wurde, kompatibel. Höhere Delphi-Versionen bieten es einem an, eine DCU-Datei eines älteren Formats zu konvertieren. Andersherum ist das logischerweise nicht möglich.
  • Eine Ressourcendatei (*.res) wird ebenfalls erstellt. Diese Datei enthält das Programmsymbol und weitere Informationen, die Sie in den Eigenschaften der EXE-Datei im Windows-Explorer angezeigt bekommen. Diese Datei wird in die EXE-Datei gelinkt und muss nicht einzeln weitergegeben werden.

Für OpenSource-Projekte müssen folgende Dateien mitgeliefert werden:

  • die Projektdateien (.dpr und .bdsproj, falls vorhanden)
  • die Units (.pas)
  • die Formulare (.dfm)
  • wenn ein Anwendungsicon erstellt wurde, die Ressourcendatei (.res)
  • die Konfigurationsdatei (.cfg)

Mehrere Formulare erstellen[Bearbeiten]

Mehrere Formulare können erstellt werden, um z.B. einen Dialog oder ein Info-Fenster zu integrieren. Dies kann über Datei / Neu / Formular geschehen.

Beim Aufruf eines Formulars gibt es zwei Möglichkeiten. Nachdem die Unit des Formulars (z. B. Unit2 für Form2) in die Uses-Klausel aufgenommen wurden, kann man das Formular aufrufen:

  • Form2.Show;
  • Form2.ShowModal;

Mit Show wird das Fenster angezeigt, ohne dass das Hauptfenster blockiert wird. Der Anwender kann also in beiden Fenstern gleichzeitig arbeiten. ShowModal erlaubt es dem Anwender, nur das neue Fenster zu verwenden und blockiert alle Eingaben in andere Fenster. Erst, wenn dieses Fenster geschlossen wird, werden alle anderen wieder freigegeben. Man kennt das z.B. vom Infofenster der meisten Anwendungen.

Wenn man einen Dialog hat, kann man Buttons unterbringen und denen einen anderen ModalResult-Wert zuweisen (mrOk für OK, mrCancel für Abbrechen, ...). Beim Klick auf einen Button mit einem ModalResult-Wert ungleich mrNone wird das Fenster automatisch geschlossen. Nun ist Show eine Prozedur und ShowModal eine Funktion. ShowModal gibt den gedrückten Button (bzw. dessen ModalResult) zurück. Damit kann man feststellen, mit welcher Schaltfläche der Diaglog geschlossen wurde:

Code:

if Form2.ShowModal = mrOk then
  ShowMessage('Sie haben OK geklickt');

Bei mehreren Möglichkeiten sollte man die Fallunterscheidung verwenden:

Code:

case Form2.ShowModal of
  mrOk:
    ShowMessage('Sie haben OK geklickt');
  mrCancel:
    ShowMessage('Aktion wurde abgebrochen.');
end;

Die vordefinierten ModalResult-Werte haben folgende Bedeutung:

Konstante Bedeutung
mrNone Kein Wert. Wird als Vorgabewert verwendet, bevor der Benutzer das Dialogfeld verlässt.
mrOk Der Benutzer verlässt das Dialogfeld mit der Schaltfläche OK.
mrCancel Der Benutzer verlässt das Dialogfeld mit der Schaltfläche Abbrechen.
mrAbort Der Benutzer verlässt das Dialogfeld mit der Schaltfläche Abbruch.
mrRetry Der Benutzer verlässt das Dialogfeld mit der Schaltfläche Wiederholen.
mrIgnore Der Benutzer verlässt das Dialogfeld mit der Schaltfläche Ignorieren.
mrYes Der Benutzer verlässt das Dialogfeld mit der Schaltfläche Ja.
mrNo Der Benutzer verlässt das Dialogfeld mit der Schaltfläche Nein.
mrAll Der Benutzer verlässt das Dialogfeld mit der Schaltfläche Alle.
mrNoToAll Der Benutzer verlässt das Dialogfeld mit der Schaltfläche Nein für alle.
mrYesToAll Der Benutzer verlässt das Dialogfeld mit der Schaltfläche Ja für alle.

Quelle: Delphi 2006-Hilfe

Komponenten dynamisch erstellen[Bearbeiten]

Alle Objekte und Komponenten können dynamisch, also während der Laufzeit erstellt werden. Dazu sind einige Eigenschaften wichtig, um sie sichtbar zu machen. Hier beschreiben wir kurz mit Beispielcode, wie man ein Image dynamisch erstellt:

Code:

var
  myimage: TImage;
begin
  try
    myimage          := TImage.Create(Self);
    myimage.Parent   := Form1;    // Image soll auf Form1 angezeigt werden
    myimage.Left     := 100;
    myimage.Top      := 100;
    myimage.AutoSize := True;
    myimage.Picture.LoadFromFile(ExtractFilePath(Application.ExeName) + 'bild.bmp');
    myimage.Visible  := True;
    myimage.Name     := 'DynamicImage';
  finally
    myimage.Free;    // Hier wird die Komponente sofort wieder gelöscht.
  end;
end;

Benötigt werden immer die Eigenschaften Parent, Left, Top und Visible, um eine Komponente anzuzeigen. Falls Sie nicht die Standardgröße verwenden wollen, setzen Sie zusätzlich die Werte für Width und/oder Height (bzw. in diesem spezielle Falle AutoSize). Name muss nicht angegeben werden. Dies dient dazu, falls Sie eine Komponente mittels FindComponent suchen möchten.

Wenn das Image weiterhin sichtbar bleiben soll, verlagern Sie myimage.Free in den OnClose-Teil des Formulars. Dazu muss myimage als Feld der Klasse TForm1 vereinbart werden.


Der Debugger Inhaltsverzeichnis Erstellung einer grafischen Oberfläche Fortgeschrittene Themen