Grafische Programmierung mit dem Borland C++
Transcription
Grafische Programmierung mit dem Borland C++
Fachhochschule Wiesbaden Grafische Programmierung mit dem Borland C++-Builder 1 Vorwort Die Programmiersprache C++ ist von großer praktischer Bedeutung. In den Anfänger-Vorlesungen wird C++ fast ausschließlich als Konsolenanwendung gelehrt. Da man mit C++ auch grafische Animationen, Webseiten, Textverarbeitung, kleine Internet-Appletts, Bildverarbeitungsprogramme, grafische Benutzeroberflächen und vieles mehr erstellen kann, besteht der Bedarf für eine entsprechende Kurzeinführung. Diese Kurzeinführung richtet sich nicht nur an fortgeschrittene Programmierer, sondern auch an (relative) Anfänger. Entsprechend wurden einfache Beispiele zur Veranschaulichung gewählt. Dursun Gür Grafische Programmierung mit dem Borland C++-Builder 1 Fachhochschule Wiesbaden 2 Einleitung Es soll nun ein kleiner Einblick in die graphische Anwendung mit dem Borland C++Builder für die Windows-Plattform vermittelt werden. Hierbei soll mit Hilfe des C++Builders Übungssoftware erstellt werden, an der sich der interessierte Anwender bei graphischer Softwareentwicklung orientieren kann. Mit dem C++Builder kann man schnell und einfach Windows-Anwendungen erstellen, sowohl Win32-Konsolenanwendungen als auch Win32-Programme mit graphischer Benutzeroberläche (GUI = Graphical User Interface). Mit relativ wenigen Code-Zeilen, lassen sich graphische Anwendungen für die Windows-Plattform entwickeln. Die wichtigsten Elemente zur einfachen Bedienung sind schon im C++Builder vorgefertigt mitgeliefert. Mit ein paar Mausklicks muss man sie nur noch zusammenfügen. 3 Der bisherige Weg Um eine Windows-Anwendung zu erstellen, musste man früher viel Aufwand treiben, denn zunächst gab es nur das Windows API (Application Programming Interface), d.h. eine Schnittstelle zur Anwendungsprogrammierung. Die Windows API enthält viele Funktionen, die mit der Programmiersprache C angesprochen werden können. Zum Beispiel musste man für einen kurzen Text, den man in einem Fenster ausgeben wollte viele Programmzeilen schreiben. Je größer und umfangreicher das Programm, desto mehr Programmzeilen oder Programmseiten waren erforderlich. Grafische Programmierung mit dem Borland C++-Builder 2 Fachhochschule Wiesbaden Die Vorteile des objektorientierten Zugangs zu Windows API liegen klar auf der Hand. Fenster, Dialoge, Schaltflächen und Menüs sind vorgefertigte Objekte mit Eigenschaften wie Größe oder Farben und Methoden zum Verschieben oder Schließen. Zum besseren Überblick über die vielen notwendigen Parametervorgaben für die Bedienelemente, helfen deren Konstruktoren. Mit der RAD-Entwicklungsumgebung (RAD = Rapid Application Development), kann die Benutzeroberfläche von Programmen (zur Benutzeroberfläche gehören Menüs, Dialogfelder, Hauptfenster usw.) mit der Hilfe von Drag&Drop-Technik ausgesprochen schnell entwickelt werden. Der Entwickler kann auch mit den OCX-Steuerelementen (OCX = Auf COM basierendes Komponentensystem von Microsoft, implementiert als OLE-Klassen; programmiert unter C++ mit den MFC. Vorläufer von ActiveX) , die er in die Formulare aufnehmen kann, in relativ kurzer Zeit spezielle Programme, wie z.B. einen Web-Browser erstellen. Grafische Programmierung mit dem Borland C++-Builder 3 Fachhochschule Wiesbaden 4 Die IDE des C++Builder Abbildung: 1 Die IDE (IDE = integrierte Entwicklungsumgebung) des C++Builder besteht aus drei unterschiedlichen Teilen. Das oberste Fenster kann man als Hauptfenster betrachten. Auf der linken Seite ist die Mauspalette und auf der rechten Seite die Komponentenpalette (Komponenten = selbständige Software-Bausteine, die eine bestimmte, vordefinierte Aufgabe erfüllen, z.B. Textfelder, Editierfelder oder Listenfelder). Mit Hilfe der Mauspalette hat man einen einfachen Zugriff auf die Operationen, wie das Öffnen mit einem Mausklick, Speichern und Kompilieren von Projekten. Auf der Komponentenpalette gibt es eine Reihe von Komponenten, die man in die Grafische Programmierung mit dem Borland C++-Builder 4 Fachhochschule Wiesbaden Formulare mit aufnehmen kann (Textfelder, Eingabefelder, Listenfelder, Schaltflächen, usw.). Um die Übersicht zu wahren, sind die Komponenten in Gruppen zusammengefasst. Zum Aufnehmen einer Komponente in das Formularfeld, muss lediglich auf der Komponentenpalette die Schaltfläche der gewünschten Komponente angeklickt werden, anschließend die Position im Formular, an der die Komponente erscheinen soll. Auf der linken Seite, unterhalb der Mauspalette und der Komponentenpalette, befindet sich der Objektinspektor. Über den Objektinspektor kann man auf die Eigenschaften und Ereignisse einer Komponente Einfluss nehmen. Wer mit dem C++Builder arbeitet, wird den Objektinspektor ständig im Einsatz haben. Je nach Komponenten, zeigt der Objektinspektor ein oder zwei Registerkarten an. Die Registerkarte mit der Überschrift EIGENSCHAFTEN ist immer vorhanden. Mit den Eigenschaften einer Komponente kann man das Erscheinungsbild der Komponente festlegen. Ändert man beispielsweise die Eigenschaft Color, so ändert sich die Hintergrundfarbe der Komponente. Eigenschaften sind von Komponente zu Komponente unterschiedlich, allerdings gibt es auch einige gemeinsame Elemente wie z.B. die Breite (Width) und die Höhe (Height). Der Objektinspektor weist zusätzlich zur Registerkarte EIGENSCHAFTEN auch die Registerkarte EREIGNISSE auf. Ereignisse können beispielsweise dann auftreten, wenn der Anwender mit einer Komponente interagiert. Wird z.B. eine Komponente angeklickt, so wird ein Ereignis ausgelöst, welches Windows eine entsprechende Mitteilung macht. Man kann dazu einen Code schreiben, der auf dieses Ereignis reagiert und als Antwort Aktionen ausführt. So wie die Eigenschaften sind auch die Ereignisse von verschiedenen Komponenten unterschiedlich. Das dritte Fenster, welches sich rechts des Objektinspektors befindet, ist der Arbeitsbereich des C++Builder. Zum Anfang wird im Arbeitsbereich der Formular-Designer angezeigt. Im C++Builder wird unter einem Formular ein Grafische Programmierung mit dem Borland C++-Builder 5 Fachhochschule Wiesbaden Fenster im Programm verstanden. Es kann sich hierbei um das Hauptfenster, ein Dialogfeld oder ein anderes Fenster handeln. Der Formular-Designer dient dazu, die entsprechenden Formulare zu erstellen, die Komponenten darauf zu platzieren, diese zu verschieben oder ihre Größe zu verändern. Der Quelltexteditor liegt, als zunächst unsichtbares viertes Fenster, direkt hinter dem Formular-Designer. In diesen kann man seinen Quellcode eingeben, um einen Algorithmus zu erstellen. Quelltexteditor, Komponentenpalette, Formular-Designer und Objektinspektor arbeiten bei der Erstellung von Anwendungen als eine Einheit zusammen. Grafische Programmierung mit dem Borland C++-Builder 6 Fachhochschule Wiesbaden 5 Das Programmieren mit GUI 5.1 1. Schritt: Die Label Erstellung Wenn der C++Builder aufgerufen ist, sollte man auf ein leeres Formular (wie Abb. 1) sehen können. Das Formular wird standardmäßig Form1 bezeichnet (der Formularname hat im C++Builder eine sehr wichtige Rolle, worauf wir später zurückkommen werden). Der Objektinspektor (links des Formulars) zeigt die Eigenschaften des Formulars an. Abbilldung: 2 Grafische Programmierung mit dem Borland C++-Builder 7 Fachhochschule Wiesbaden Wenn auf die Titelleiste des Objektinspektors geklickt wird, wird die Eigenschaft Caption (Abb. 2) hervorgehoben, worauf man seine Eingabe tätigen kann. Falls die Eigenschaft Caption nicht sofort zu sehen ist, muss man unter Umständen das Objektinspektor-Fenster scrollen. Die Eigenschaften werden alphabetisch aufgelistet. Hier kann man den Namen des Formulars ändern. Wenn jetzt Test1 eingegeben wird, ändert sich auch die Überschrift des Formulars (wie Abb. 3). Abbildung: 3 Um einen Text in die Mitte des Formulars zu schreiben, muss man zunächst ein Textfeld (Label) in das Formular einfügen. Das Textfeld (Label) befindet sich in der Komponentenpalette. Wenn man auf die Seite Standard klickt, ist Grafische Programmierung mit dem Borland C++-Builder 8 Fachhochschule Wiesbaden es der vierte Button von links mit dem großen Buchstaben „A“ als Symbol (siehe Abb. 4). Abbildung 4 Fährt man die Maus auf die Schaltfläche, erscheint eine Kurzinformation mit dem Hinweis: Label. Wenn jetzt auf diese Schaltfläche geklickt wird und danach auf eine beliebige Stelle im Formular, erscheint eine LabelKomponente mit dem vorgegebenen Titel Label1 im Formular. Auf dem Objektinspektor kann man nun die Eigenschaft für Label1 ersehen (zuvor war die Eigenschaft von Form1 zu sehen). Die Eigenschaft Caption ist wieder hervorgehoben. Klickt man auf die Titelleiste des Objektinspektors oder auf die Eigenschaft Caption kann man den Text ändern. Sie können jetzt den Text „FH – Wiesbaden“ eingeben. Gleichzeitig wird in dem Label auf dem Formular ihre Eingabe angezeigt (Abb. 5). Grafische Programmierung mit dem Borland C++-Builder 9 Fachhochschule Wiesbaden Abbildung: 5 Nun können wir z.B. die Schriftgröße des Textes im Textfeld ändern. Es folgt ein Doppelklick auf die Eigenschaft Font, die daraufhin expandiert wird, um weitere Attribute für Schriftart, Farbe und Schriftschnitt zur Auswahl bereitzustellen. Für die Auswahl der Schriftgröße gehen Sie auf Font zu der Eigenschaft Size oder Größe und verändern diese von gegenwärtig 8 auf z.B. 24. Sobald die Eingabetaste gedrückt wird oder das Formular angeklickt wird, erscheint die Beschriftung in der neuen Größe (Abb. 6). Grafische Programmierung mit dem Borland C++-Builder 10 Fachhochschule Wiesbaden Abbildung: 6 Falls das Textfeld im Formular nicht zentriert ist, kann man das Textfeld verschieben. Hierfür muss man lediglich das Textfeld anklicken und an die gewünschte neue Position ziehen. Befindet sich das Textfeld an seiner neuen Position, können Sie das Programm kompilieren und starten (Abb. 7). Grafische Programmierung mit dem Borland C++-Builder 11 Fachhochschule Wiesbaden Abbildung: 7. Das Dialogfeld Kompilieren Abbildung: 8. Das Programm Test1 in der Ausführung Grafische Programmierung mit dem Borland C++-Builder 12 Fachhochschule Wiesbaden 5. 2 2. Schritt: Erstellung von Figuren Falls noch eine Anwendung im aktuellen Fenster aktiv ist, können Sie diese direkt schließen, oder Sie gehen auf dem Hauptfenster auf das Menü DATEI und klicken auf den Button NEUE ANWENDUNG. Sie werden dann aufgefordert, die Änderung in Projekt1 zu speichern, diese Option bleibt ihnen überlassen. Danach müsste die IDE wie in Abbildung 1 auf ihrem Bildschirm erscheinen. Für unser folgendes Beispiel, Zeichnen eines Kreises, gehen Sie mit der Maus auf die Komponentenpalette und klicken Sie die Seite System (Abb. 9) an. Auf der System-Seite klicken Sie dann auf den zweiten Button von links. Abbildung: 9 Wenn Sie die Maus auf die Schaltfläche halten, erscheint die Kurzinformation PaintBox. Klicken Sie auf eine Stelle im Formular. Auf dem Formular müsste eine Komponente mit einem quadratischen Rahmen erscheinen. Diesen Rahmen können Sie, wenn Sie den Rand des Rahmens anklicken, in der Größe verändern, so dass er beispielsweise bis an den Rand des Formularfensters reicht (Abb. 10). Grafische Programmierung mit dem Borland C++-Builder 13 Fachhochschule Wiesbaden Abbildung: 10 Auf dem Objektinspektor wird Ihnen die Eigenschaft Name ins Auge fallen, mit dem Titel PaintBox1 (Abb. 11) . Grafische Programmierung mit dem Borland C++-Builder 14 Fachhochschule Wiesbaden Abbildung: 11 Klicken Sie auf dem Objektinspektor auf die Registerkarte mit der Überschrift Ereignisse, hier das Ereignis OnPaint. Gleichzeitig wird die graue Fläche an dem Ereignisfeld OnPaint weiß hervorgehoben. Sobald Sie die weiße Fläche mit der Maus doppelt anklicken, wird darin die Schrift PaintBox1Paint zu sehen sein (Abb. 12), gleichzeitig wird der Quelltexteditor, welcher hinter dem Formular liegt, geöffnet. Grafische Programmierung mit dem Borland C++-Builder 15 Fachhochschule Wiesbaden Abbildung: 12 In dem Quelltexteditor erscheint eine vorgefertigter PaintBox1Paint-Routine (Funktion). Hier muss nur noch der gewünschte Code hinzugefügt werden. Bis hierher wurde noch kein Quellcode, wie wir es bei Konsolenanwendungen gewohnt sind, geschrieben. Der Unterschied zu den konsolenorientierten Programmierung liegt darin, dass keine (selbstverfasste) mainFunktion sondern ereignisgesteuerte Objektmethoden vorliegen Grafische Programmierung mit dem Borland C++-Builder 16 Fachhochschule Wiesbaden 5.2.1 Zur Erklärung der Routine Diese Funktion ist eine Elementfunktion der Klasse. Die einzige Besonderheit besteht darin, dass die C++Builder-Funktionen das Schlüsselwort __fastcall als Aufrufkonvention verwendet. Die Funktion heißt PaintBox1Paint und ist ein Element von TFORM1, hat keinen Rückgabewert (void) und besitzt einen Zeiger auf ein Tobject als Parameter. Der Sender ist ein Zeiger auf diejenige Komponente, die die Botschaft verschickt. In anderen Fällen ermöglicht der Sender-Parameter für mehrere Komponenten, ein und dieselbe Funktion zur Ereignisbearbeitung zu verwenden. Nun können wir den Code hinzufügen um einen Kreis darzustellen. Der Code für den Kreis lautet (Abb. 13): Form1->PaintBox1->Canvas->Ellipse(intX1, intY1, intX2, intY2); Abbildung: 13 Grafische Programmierung mit dem Borland C++-Builder 17 Fachhochschule Wiesbaden 5.2.2 Erläuterung Form1: Eine Form1- Komponente erlaubt die Anzeige auf einem Formular-Designer. PaintBox1: Diese Komponente stellt eine „Leinwand“ für die Eigenschaft Canvas bereit. Canvas: Diese Eigenschaft ist eine Instanz der Klasse Tcanvas In einer C++Builder- Anwendung zeichnet man mit dieser Klasse. Ellipse: Zeichnet mit dem aktuellen Stift eine Ellipse auf die Leinwand. Diesen Code beenden wir wie gewohnt mit einem Semikolon und können mit der Kompilierung beginnen. Grafische Programmierung mit dem Borland C++-Builder 18 Fachhochschule Wiesbaden Abbildung: 14 Aufgrund der Achsenparameter ist unsere „Ellipse“ ein Kreis (Abb. 14). Grafische Programmierung mit dem Borland C++-Builder 19 Fachhochschule Wiesbaden 5.3 3. Schritt: Die Button Schaltfläche Für dieses Bespiel beginnen Sie ebenfalls mit einer neuen Anwendung. Holen Sie drei Button-Komponenten aus der STANDARD-Seite der Komponentenpalette (es ist die siebte Schaltfläche von links) und platzieren Sie diese, ohne Rücksicht auf die Ränder zu nehmen, im Formular-Designer. Abbildung: 15 Zunächst sollten Sie die Schaltflächen zentrieren, weil das professioneller wirkt. Zum Zentrieren dieser drei Schaltflächen müssen Sie diese markieren. Dieses geschieht, indem Sie einen rechteckigen Rahmen mit der Maus um die Schaltflächen ziehen. Es genügt schon, wenn der Rand der Schaltfläche berührt wird (Abb. 15). Wählen Sie jetzt im Menü die Schaltfläche ANSICHT und den Befehl AUSRICHTUNGSPALETTE (Abb. 16). Grafische Programmierung mit dem Borland C++-Builder 20 Fachhochschule Wiesbaden Abbildung: 16 In der Ausrichtungspalette klicken Sie auf die Schaltfläche VERTIKAL ZENTRIERT (unten links die Zweite) und auf GLEICHER ABSTAND HORIZONTAL (oben rechts die Zweite), somit ist die Zentrierung abgeschlossen. Suchen Sie sich eine Button-Schaltfläche aus. Am besten, sie nehmen die die erste von links (anklicken). Gehen Sie mit der Maus zum Objektinspektor auf die Eigenschaft Caption und ändern den Namen von Button1 auf Beenden um (Abb. 17). Grafische Programmierung mit dem Borland C++-Builder 21 Fachhochschule Wiesbaden Abbildung: 17 Wenn Sie jetzt einen Doppelklick auf die Schaltfläche Beenden im FormularDesigner tätigen, öffnet sich der Quelltexteditor, in dem eine vorgefertigte Button1Click-Routine zum Vorschein kommt. In diese vorgefertigte Routine geben Sie ihren Code ein (Abb. 18). Der Code für die Schaltfläche Beenden lautet: Close(); Mit dem Zeilen-Code Close() wird das Beenden (Schließen) der Anwendung erreicht. Grafische Programmierung mit dem Borland C++-Builder 22 Fachhochschule Wiesbaden Abbildung: 18 Nach dem Kompilieren müssten die Schaltflächen Button2 und Button3 als funktionslose Schaltfläche auf dem Formular-Designer zu sehen sein. Man kann diese beiden Schaltflächen anklicken und es geschieht nichts. Falls Sie die Schaltfläche Beenden betätigen, schließen Sie die Funktion bzw. beenden das Programm (Abb. 19). Grafische Programmierung mit dem Borland C++-Builder 23 Fachhochschule Wiesbaden Abbildung: 19 Grafische Programmierung mit dem Borland C++-Builder 24 Fachhochschule Wiesbaden 5.4 Einblick in die VCL Die VCL (Visual-Component-Library) ist ein strukturiert aufgebautes Rahmenwerk. Wie alle anderen Klassenbibliotheken nutzt die VCL auch die Möglichkeiten der Vererbung. Im Großen und Ganzen besteht die VCL aus Klassen, welche die Komponenten repräsentieren. Die Klassenhierarchie der VCL ist zwar verwirrend, aber zum Glück nicht völlig undurchschaubar. TObjekt TPersistent nicht sichtbare Komponenten TComponent sichtbare Komponenten TTimer, u.s.w. TControl TGraphicsControl TWinControl TSpeedButton TPanel, u.s.w. Grafische Programmierung mit dem Borland C++-Builder 25 Fachhochschule Wiesbaden Oben in der VCL Klassenhierarchie befindet sich TObject, sie ist die Basis der Klassen. Die nächste Stufe bildet TPersistent, diese Klasse befähigt die Komponenten, für sich selbst Dateien oder den Speicher zu sichern. Danach folgt in der Klassenhierarchie die Basisklasse Tcomponent. Diese liefert das Fundament als grundlegende Funktion einer Komponente. Die daraus folgenden, nicht sichtbaren Komponenten werden von TComponent abgeleitet. Die sichtbaren Komponenten hingegen werden von der Klasse TControl abgeleitet, welche wiederum von TComponent abgeleitet ist. Die sichtbaren Komponenten werden zusätzlich von TControl mit weiteren Funktionen ausgestattet, woraus sich schließlich die Komponenten TGraphicControl oder TWinControl abgeleiten. Wenn Sie eine Komponente in ein Formular aufnehmen, erzeugt der C++Builder in der Klassendeklaration des Formulars einen Zeiger auf diese Komponente, so dass Sie auf die Komponente in ihrem Code zugreifen können. Der C++Builder benutzt die Name-Eigenschaft für den Klassennamen und für die Zeigervariable. Als wir weiter oben einen Schalter installierten, legte der C++Builder eine TButton* Variable zur Repräsentation des Schalters an. Bevor dies geschah, hatte der C++Builder allerdings schon eine Klasse von TForm abgeleitet und eine Instanz dieser Klasse gebildet, stellvertretend für das Formular. 5.4.1 Formular- und Anwendungsklassen Formular- und Anwendungsklassen repräsentieren Formulare und das TApplication – Objekt der VCL. Diese Klassen sind alle von TComponent abgeleitet und sind selbst Komponenten. Sie werden hier getrennt aufgeführt, um sie von den Steuerelementen, die in die Formulare aufgenommen werden, zu unterscheiden. Grafische Programmierung mit dem Borland C++-Builder 26 Fachhochschule Wiesbaden 5.4.2 TApplication Die Klasse TApplication kapselt die grundlegenden Operationen eines Windows-Programms. Sie bearbeitet das Anwendungssymbol, die Kontexthilfe und die grundlegende Botschaftsverarbeitung. In jeder C++Builder –Anwendung ist der Zeiger Application definiert, der auf das TApplication – Objekt weist. Diese Klasse wird vor allem benutzt, um Meldungsfenster aufzurufen, um die Kontexthilfe zu verwalten und um Hinweise für Schaltflächen und Text in die Statuszeile zu schreiben. TApplication hat eine Besonderheit: Einige ihrer Eigenschaften (TITEL, HILFEDATEI und SYMBOL) können auf der Seite ANWENDUNG der Projektoptionen eingestellt werden. 5.4.3 TForm Die Klasse TForm kapselt Formulare für das Hauptfenster, Dialogfenster, untergeordnete Fenster und jeden anderen Fenstertyp. TForm kennt ca. 60 Eigenschaften, 45 Methoden und etwa 20 Ereignisse. 5.4.4 Die Komponentenklassen Diese Gruppe umfasst einen weiten Bereich von Klassen, der in verschiedene Kategorien unterteilt wird. Grafische Programmierung mit dem Borland C++-Builder 27 Fachhochschule Wiesbaden 5.4.5 Die Klassen der Standardkomponenten Zu den Standardkomponenten gehören die Klassen: TButton, TEdit, TListBox, TMemo, TMainMenu, TPopupMenu, TCheckBox, TRadioButton, TRadioGroup, TGroupBox und Tpanel. Die meisten dieser Klassen kapseln Windows-Steuerelemente; die Klasse TmainMenu verwaltet das Hauptmenü einer Anwendung. Zur „Echtzeit“ gelangt man durch einen Doppelklick auf das Symbol der MainMenu–Komponente zum Menü-Designer. Mit Hilfe der Eigenschaften von TmainMenu (bzw. TmenuItem) können Sie steuern, ob ein Menüeintrag deaktiviert ist ( Enabled = false), ob vor dem Menüeintrag ein Häkchen angezeigt werden soll (Checked = true), wie der Hinweistext lautet und anderes mehr. Ein Menüeintrag kennt nur ein einziges Ereignis, OnClick, mit dem Sie einen ausgewählten Menüeintrag mit einer Funktion verbinden können. Wollen Sie z.B. für eine Anwendung eine Mauspalette erstellen, fangen Sie mit einem Bedienfeld an und setzen dann die einzelnen Mauspalettenschalter (speed buttons) in das Bedienfeld. Wenn Sie das Bedienfeld verschieben, bewegen sich die Schalter mit. Bedienfelder können für eine Vielzahl von Aufgaben eingesetzt werden, wie auch zur Einrichtung von Statuszeilen. Panels besitzen gleich mehrere Eigenschaften, über die Sie die Ränder und das Erscheinungsbild des Panels anpassen können (flach, erhöht, abgesenkt). Durch Kombination dieser Eigenschaften können Sie eine Menge unterschiedlicher 3-D-Bedienelemente kreieren. Der C++Builder definiert eine weitere Gruppe von Komponenten Diese sind auf der Seite ZUSÄTZLICH der Komponentenpalette zu finden. Zu dieser Gruppe gehören die Klassen TBitBtn, TSpeedButton, TMaskEdit, TStringGrid, TDrawGrid, TImage, TShape, TBevel und TScrollBox. Die Klasse TBitBtn repräsentiert einen Schalter, der ein Bild in seinem Feld anzeigt. TSpeedButton ist ebenfalls ein Schalter mit Bild, doch ist diese Komponente für den Einsatz in Bedienfeldern gedacht. Eigentlich ist es kein Grafische Programmierung mit dem Borland C++-Builder 28 Fachhochschule Wiesbaden echter Schalter, sondern vielmehr eine bildliche Darstellung eines Schalters. Auf diese Weise können Sie eine große Anzahl von Mauspalettenschalter verwenden, ohne für jeden einzelnen von ihnen Windows-Ressourcen zu verbrauchen. Die Image-Komponente ermöglicht es Ihnen, ein Bild aus einer Datei in ein Formular aufzunehmen. Die Bevel-Komponente wird benutzt, um Flächen und Linien zu zeichnen, die hervorgehoben (Raised) oder eingesenkt (Lowered) sind. Mit ihrer Hilfe können Formulare visuell unterteilt und ansprechend gestaltet werden. Die Klassen TSringGrid und TDrawGrid dienen der tabellarischen Darstellung von Informationen. 5.4.6 Klassen der Win32-Steuerelemente Die VCL enthält Klassen für viele der 32-Bit-Steuerelemente von Windows. Zu diesen Klassen gehören TListView, TTreeView, TProgressBar, TTabControl, TPageControl, TRichEdit, TImageList, TStatusBar, TAnimate, TToolbar, TCoolBar und einige andere. Manche dieser Steuerelemente sind kompliziert, und somit auch die zugehörigen VCL-Klassen. Insgesamt leistet die VCL einen großen Beitrag, um die Arbeit mit den Steuerelementen zu erleichtern. 5.4.7 Klassen der Datenbankkomponenten Die VCL besitzt ein Heer von Datenbankkomponenten, das sowohl sichtbare als auch nicht sichtbare Komponenten umfasst. DataSource, DataBase, Table und Query gehören zu den letzteren. Sie kapseln im Hintergrund ablaufende Datenbankoperationen. Mit den sichtbaren Komponenten kann der Benutzer interagieren. Zum Beispiel wird die DBGrid-Komponente verwendet, um dem Benutzer Zugriff auf eine Datenbanktabelle zu ermöglichen, die durch eine TableGrafische Programmierung mit dem Borland C++-Builder 29 Fachhochschule Wiesbaden Komponente repräsentiert wird. In diesem Sinne bildet DBGrid die Schnittstelle zwischen dem Anwender und der Table-Komponente. Mit DBGrid können Tabellen betrachtet und editiert werden. Die DBNavigator-Komponente besitzt Schalter, mit denen Sie sich durch eine Tabelle bewegen können. Es gibt Schalter, um zum nächsten, vorhergehenden, ersten und letzten Datensatz zu springen, sowie zum Abbrechen, Übernehmen und Rückgängigmachen einer Änderung. Andere Datenzugriffskomponenten verbinden Standard-Steuerelemente von Windows mit Datenbankfeldern. Dazu gehören unter anderem TDBText, TDBEdit, TDBListBox und TDBImage. 5.4.8 Klassen der Standard-Dialogfelder Windows stellt für bestimmte Aktionen wie das Öffnen einer Datei, Speichern einer Datei, Auswählen einer Schriftart oder Farbe Standard-Dialogfelder bereit. Die VCL kapselt die Standard-Dialogfelder in den Klassen TOpenDialog, TSaveDialog, TOpenPictureDialog, TSavePictureDialog, TFontDialog, TColorDialog, TPrintDialog und TPrinterSetupDialog. Darüber hinaus gehören zu dieser Gruppe noch die Klassen TFindDialog und TReplaceDialog. All diese Komponenten sind nicht sichtbar, haben also zur Entwurfszeit keine Schnittstelle, die man sehen kann. Zur Laufzeit können die Dialogfenster natürlich angezeigt werden. Grafische Programmierung mit dem Borland C++-Builder 30 Fachhochschule Wiesbaden 5.4.9 Klassen der Systemkomponenten Die Seite SYSTEM der Komponentenpalette enthält eine Mischung sichtbarer und nicht sichtbarer Komponenten. Mit TTimer managen Sie den Windows System-Zeitgeber. Das einzige Ereignis dieser Komponente ist OnTimer, das jedes Mal nach Ablauf einer bestimmten Zeitspanne ausgelöst wird. Diese Zeitspanne wird durch den Wert der Interval-Eigenschaft festgelegt. TTimer ist eine nicht sichtbare Komponente. In dieser Gruppe befindet sich auch die Klasse TMediaPlayer. Mit Hilfe dieser Klasse können Sie Multimedia-Dateien abspielen, beispielsweise Wave-Dateien, AVI-Videos und MIDI-Dateien. Das Medium kann abgespielt, angehalten oder vorgespult werden, u.s.w.. Diese Klasse besitzt viele Eigenschaften und Ereignisse, welche die komplexe Multimedia-Schnittstelle (MCI) sehr vereinfachen. Die Komponente TPaintBox richtet eine leere Leinwand ein, auf die Sie alles Beliebige zeichnen können. Diese Komponente hat somit einen sehr weiten Anwendungsbereich. Weiterhin gehören Klassen für OLE und den dynamischen Datenaustausch (DDE) zur SYSTEM-Gruppe. 5.4.10 GDI-Klassen Die Klassen der GDI (Graphics Device Interface) kommen charakteristischerweise in GUI-Anwendungen vielfach zum Einsatz. Diese Klassen kapseln die Benutzung von Bitmaps, Schriftarten, Gerätekontexten (DC), Pinseln und Zeichenstiften. Diese GDI-Objekte sind es, mit deren Hilfe Graphiken und Texte in Fenstern angezeigt werden. Die GDI-Klassen sind nicht mit einer besonderen Komponente verbunden, aber viele Komponenten enthalten Instanzen dieser Klassen als Grafische Programmierung mit dem Borland C++-Builder 31 Fachhochschule Wiesbaden Eigenschaften. Zum Beispiel hat ein Editierfeld eine Font-Eigenschaft, die eine Instanz der Klasse TFont ist. Windows-Programmierern ist der Begriff Gerätekontext (englisch DC = Device Context) wohl bekannt. Es ist gleichgültig, ob Sie in C programmieren oder eine der C++-Klassenbibliotheken benutzen. In der VCL allerdings ist dieser Begriff nicht weit verbreitet. Dies liegt daran, dass die VCL statt von Gerätekontexten von Leinwänden (Canvas) spricht und die WindowsGerätekontexte in der Klasse TCanvas kapselt. Eine Leinwand stellt eine Fläche zur Verfügung, in die man mit Methoden wie MoveTo(), LineTo() oder TextOut() zeichnen kann. Bitmaps können mit Draw() oder StretchDraw() auf die Leinwand projiziert werden. Die TCanvas-Klasse enthält Instanzen der anderen GDI-Klasen. Beispielsweise zeichnet die Befehlsfolge MoveTo()/LineTo() eine Linie in der aktuellen Zeichenstift-Farbe. Die Pen-Eigenschaft bestimmt die ZeichenstiftFarbe und ist eine Instanz der Klasse TPen. TPen selbst besitzt die Eigenschaften, die den Linientyp festlegen: die Breite, den Stil (durchgezogen, gestrichelt, gepunktet, u.s.w.) und den Modus. Die Klasse TBrush repräsentiert einen Pinsel. Dieser verkörpert seinerseits ein Füllmuster, das bei Leinwand-Operationen, wie FillRect(), Polygon() oder Ellipse() benutzt wird. Die Style-Eigenschaft erlaubt es Ihnen, ein Schraffurmuster für den Pinsel festzulegen. Mit Hilfe der Bitmap-Eigenschaft können Sie eine Bitmap als Füllmuster auswählen. TBitmap kapselt Bitmap-Operationen in der VCL. Eigenschaften dieser Klasse sind etwa Palette, Heigth, Width und TransparentColor. Unter den Methoden finden Sie LoadFromFile(), LoadFromResourceID() und SaveToFile(). TBitmap wird von anderen Klassen zusätzlich zu TCanvas benutzt, beispielsweise von TImage, TBitBtn und TspeedButton. Instanzen der Klasse TBitmap können auch als Speicher-Bitmaps verwendet werden. Grafische Programmierung mit dem Borland C++-Builder 32 Fachhochschule Wiesbaden Speicher-Bitmaps werden häufig in Anwendungen mit vielen Grafiken eingesetzt, um das Bildschirmflimmern zu verringern und die Grafikdarstellung zu beschleunigen. Die Klasse TFont dient zur Manipulation der Schriftart. Eigenschaften dieser Klasse sind unter anderem Color, Heigth und Style (fett, kursiv, unterstrichen und durchgestrichen). Die Klasse TFont wird von allen Komponenten verwendet, die Text anzeigen. Außer den hier angeführten GDI-Klassen, gibt es noch weitere, die entweder als Hilfsklassen fungieren oder eine Basisklasse mit zusätzlicher Funktionalität ausstatten. Grafische Programmierung mit dem Borland C++-Builder 33 Fachhochschule Wiesbaden 5.5 4. Schritt: Anzeigen der Dateien Als weiteres Beispiel soll ein Programm erstellt werden, das über einen Dialog Textdateien auswählt und anzeigt. Falls eine Anwendung aktiv ist, schließen Sie diese und gehen auf DATEI, NEUE ANWENDUNG. Ändern Sie zunächst den Namen des Formulars, indem Sie im Objektinspektor die Eigenschaft Caption „Form1“ auf „Datei“ umschreiben. Gehen Sie nun auf die Komponentenpalette und wählen Sie aus der Seite STANDARD die Komponente Memo (die sechste von links) aus. Mit einem Doppelklick bringen Sie diese auf das Formular. Auf dem Objektinspektor setzen sie die Eigenschaft align von alNone auf alTop. Jetzt müsste sich das Memo1-Feld auf dem Formular im oberen Drittel und über die gesamte Breite des Formulars ausgebreitet haben (Abb. 20). Grafische Programmierung mit dem Borland C++-Builder 34 Fachhochschule Wiesbaden Abbildung: 20 Ziehen Sie den unteren Rand des Memo1-Feld soweit nach unten, dass es etwa drei Viertel des Formulars ausfüllt. Wenn Sie auf dem Objektinspektor auf die Eigenschaft ScrollBars anklicken und die Eigenschaft von ssNone auf ssBoth ändern, erscheint dann am unteren und am rechten Rand des Memo1-Feldes jeweils ein ScrollBar (Abb. 21). Grafische Programmierung mit dem Borland C++-Builder 35 Fachhochschule Wiesbaden Abbildung: 21 Um den Eintrag im Memo1-Feld zu löschen, klicken Sie im Objektinspektor auf die Eigenschaft Lines und anschließend auf die Schaltfläche mit den drei Punkten an der rechten Seite. Nun öffnet sich der Stringlisten-Editor, in dem Sie das Wort „Memo1“ löschen können. Wenn Sie möchten, können Sie jetzt kompilieren, anschließend in das Memo1-Feld einen Text hineinschreiben, und dann probieren, ob die ScrollBars funktionieren. Auf der Komponentenpalette klicken Sie unter der STANDARD-Seite eine Button-Komponente (die siebte von links) an und platzieren diese auf dem Formular unterhalb des Memo1-Feldes. Im Objektinspektor ändern Sie die Eigenschaft des Namens in Open und die Caption –Eigenschaft in &Öffnen. Grafische Programmierung mit dem Borland C++-Builder 36 Fachhochschule Wiesbaden Ziehen Sie einen zweiten Button und ändern Sie hier die Caption-Eigenschaft und den Namen in Beenden. Gehen Sie jetzt auf der Komponentenpalette auf die Seite DIALOGE. Von dieser wählen Sie gleich die erste Komponente von links. Wenn Sie mit der Maus auf die Schaltfläche halten, müsste OpenDialog erscheinen. Auf diese Schaltfläche machen Sie einen Doppelklick und ziehen dann zwischen die beiden Button-Schaltfläche. Ihr Formular müsste jetzt aussehen wie in der Abb. 22. Abbildung: 22 Grafische Programmierung mit dem Borland C++-Builder 37 Fachhochschule Wiesbaden Wir müssen noch die Schaltflächen mit dem Quellcode einbinden, damit etwas geschieht, wenn auf die Schaltfläche gedrückt wird. Wenn Sie einen Doppelklick auf die Öffnen-Schaltfläche machen, öffnet sich der QuelltextEditor. Geben Sie den folgenden Quell-Code ein: OpenDialog1->FileName = ""; if (OpenDialog1->Execute()) { if (Memo1->Lines->Count > 0) Memo1->Clear(); Memo1->Lines->LoadFromFile (OpenDialog1->FileName); } Wenn Sie anschließend wieder auf das Formular zurück gehen und einen Doppelklick auf die Beenden-Schaltfläche tätigen, öffnet sich der QuelltextEditor für Beenden. Hier geben Sie lediglich ein: Close(); Das Programm ist nun fertig. Nachdem Sie kompiliert und auf die Schaltfläche Öffnen geklickt haben, müsste ein ähnliches Bild wie in Abb. 23 erscheinen. Grafische Programmierung mit dem Borland C++-Builder 38 Fachhochschule Wiesbaden Abbildung: 23 Grafische Programmierung mit dem Borland C++-Builder 39 Fachhochschule Wiesbaden 5.6 5. Schritt: Erstellung eines Rechners Zunächst sollten Sie eine neue Anwendung erzeugen. Als nächstes werden die benötigten Graphikobjekte in den Formular-Designer positioniert. Diese sind Edit als Eingabefeld, Label als Beschriftungsfeld und Button als Schalter (Knopf zum Drücken). Diese Objekttypen befinden sich alle auf der STANDARD-Seite der Komponentenpalette. Für den Taschenrechner positionieren wir drei Eingabefelder (Edit) untereinander im Formular-Designer und jeweils drei Beschriftungsfelder (Label), welche über die Eingabefelder positioniert werden. Nach dem wir die Objekte ausgerichtet haben, müsste der Formular-Designer wie in der Abb. 24 aussehen. Abbildung: 24 Grafische Programmierung mit dem Borland C++-Builder 40 Fachhochschule Wiesbaden Jetzt platzieren wir die Button-Felder, vier davon werden nebeneinander, zwischen dem Edit1-Eingabefeld und dem Label2-Beschriftungsfeld, und der fünfte unter dem Edit3-Eingabefeld aufgestellt (Abb. 25). Abbildung: 25 Der nächste Schritt wäre auf die Edit-Felder zu klicken und im Objektinspektor die Eigenschaft Text löschen (Abb. 26). Grafische Programmierung mit dem Borland C++-Builder 41 Fachhochschule Wiesbaden Abbildung: 26 Danach gehen wir auf die Label-Felder und ändern die Beschriftung, indem wir das jeweilige Label auf dem Formular-Designer anklicken und anschließend auf dem Objektinspektor die Eigenschaft Caption umbenennen. Label1 wird umbenannt auf 1.Zahl, Label2 auf 2.Zahl und Label3 wird umbenannt auf Ergebnis (Abb.27). Grafische Programmierung mit dem Borland C++-Builder 42 Fachhochschule Wiesbaden Abbildung: 27 Jetzt nehmen wir uns die Button-Felder vor: Hier verändern wir zunächst ebenfalls die Namen, wie zuvor bei den Label-Feldern. Button1 wird zu +, Button2 wird zu – , Button3 wird zu *, Button4 wird zu / und Button5 wird zu Beenden umbenannt, siehe Abb. 28. Grafische Programmierung mit dem Borland C++-Builder 43 Fachhochschule Wiesbaden Abbildung: 28 Nun beginnt die eigentliche Arbeit, denn jetzt kommt die Funktion der ButtonFelder zur Geltung. Noch wurde kein Quellcode, wie bei einer Konsolenanwendung geschrieben. Wie zu Anfang beschrieben, liegt der Unterschied zur konsolenorientierten Programmierung darin, das keine main-Funktion, sondern ereignisgesteuerte Objektmethoden, die automatisch aufgerufen werden, wenn bestimmte Ereignisse (z.B. wenn Button gedrückt wird) auftreten. Wenn wir jetzt einen Doppelklick auf den Button mit dem „+“Zeichen tätigen, öffnet sich der Quelltexteditor (Abb. 29). Grafische Programmierung mit dem Borland C++-Builder 44 Fachhochschule Wiesbaden Abbildung: 29 Hier wird jetzt der Quellcode für das Addieren, also für unser Button den wir mit „+“ bezeichnet haben, eingefügt. Grafische Programmierung mit dem Borland C++-Builder 45 Fachhochschule Wiesbaden Der Quellcode zum Addieren sieht folgendermaßen aus: String s1, s2; float r1, r2, erg; DecimalSeparator = '.'; // stellt Komma auf Punkt um // zum Lesen aus den Editboxen s1 = Edit1->Text; s2 = Edit2->Text; if (s1=="") s1="0.0"; if (s2=="") s2="0.0"; r1 = StrToFloat(s1); r2 = StrToFloat(s2); erg = r1 + r2; Edit3->Text = FloatToStrF(erg, ffFixed, 7, 2); Nachdem der Quellcode eingegeben worden ist, müsste es folgendermaßen im Quelltexteditor aussehen (Abb. 30). Grafische Programmierung mit dem Borland C++-Builder 46 Fachhochschule Wiesbaden Abbildung: 30 Genauso fahren wir mit den anderen Buttons fort, aber mit dem Unterschied, dass die „erg“- Zeile entsprechend modifiziert wird: erg = r1 – r2; erg = r1 * r2; erg = r1 / r2; Zuletzt wird der Button mit der Beschriftung Beenden bedient. Hier wird auch ein Doppelklick auf den Button getätigt und in den sich öffnenden Quelltexteditor wird der Zeilencode: Close(); eingefügt (Abb. 31). Grafische Programmierung mit dem Borland C++-Builder 47 Fachhochschule Wiesbaden Abbildung: 31 Fertig ist der Taschenrechner. Jetzt muss nur noch kompiliert werden. Grafische Programmierung mit dem Borland C++-Builder 48 Fachhochschule Wiesbaden 5.7 6. Schritt: Überlagerung zweier Sinus-Funktionen Bei der Überlagerung der Sinus-Funktionen werden die Frequenzen und die Amplituden über die Edit-Eingabefelder eingegeben. Die Anzeige der Grafik erfolgt automatisch. Für dieses Programm benötigen wir einige Grafikobjekte. Diese sind vier Edit-Eingabefelder, vier Label-Beschriftungsfelder, ein Button-Feld , eine PaintBox , einen Bevel-Rahmen und ein Timer. Die Objekttypen Edit, Label und Button befinden sich in der STANDARDSeite,der Bevel-Rahmen befindet sich auf der ZUSÄTZLICH-Seite (der achte von links), die PaintBox und der Timer in der SYSTEM-Seite der Komponentenpalette. Als erstes holen wir die Objekttypen Edit, Label, Button und Timer aus der Komponentenpalette und stellen diese linksbündig untereinander. Die PaintBox setzen wir auf die rechte Seite im Formular-Designer. Anschließend werden das Button- und die Label-Felder beschriftet, die PaintBox auf die entsprechende Größe gezogen und die Werte für die Frequenzen und Amplituden in die Edit-Felder eingetragen. Auf den Bevel-Rahmen kommen wir ganz zum Schluss zurück.. Ganz wichtig ist es jetzt, die Namen der Edit-Felder festzulegen, denn diese Eigenschaft legt die Namen der Objekte fest. Nur unter diesen Namen können wir später auf die Objekte zugreifen. Es ist zweckmäßig, die DefaultNamen (Edit1, Edit2, usw.) zu ändern, und dafür eigene Namen (z.B. Freq1Edit, usw.) auswählt. Die Eigenschaft Text ist wichtig für die Beschriftungen, bei Buttons und Labels ist es der Text , der in der Anwendung erscheint, bei Edit ist es der Text, der am Anfang in dem Textfeld erscheint, aber überschrieben werden kann. Grafische Programmierung mit dem Borland C++-Builder 49 Fachhochschule Wiesbaden Die Beschriftung: • Label1 = Frequenz1 (Hz) • Edit1 = 20.00 • Label2 = Amplitude2 (V) • Edit2 = 5.00 • Label3 = Frequenz2 (Hz) • Edit3 = 2.00 • Label4 = Amplitude2 (V) • Edit4 = 5.00 • Button1 = Draw • Button2 = Beenden Wir ändern jetzt den Namen Edit1 in der Eigenschaft im Objektinspektor auf Freq1Edit um, analog dazu auch die anderen Edit-Felder mit den entsprechenden Namen (Edit2 = Amp1Edit, Edit3 = Freq2Edit, Edit4 = Amp2Edit), siehe Abb. 32. Grafische Programmierung mit dem Borland C++-Builder 50 Fachhochschule Wiesbaden Abbildung: 32 Da wir ein zusätzlich Rauschen simulieren wollen, geben wir für die Amplituden den gleichen Wert ein, in unserem Beispiel geben wir für beide Amplituden 5 V ein. Für die Frequenz1 20 Hz und Frequenz2 geben wir 2 Hz ein. Das von Ihnen aufgebaute Formular müsste nun wie das in der Abb. 33 gezeigte Bild aussehen. Grafische Programmierung mit dem Borland C++-Builder 51 Fachhochschule Wiesbaden Abbildung: 33 Der nächste Schritt wäre jetzt einen Doppelklick auf den Formular-Designer, um in den Quelltexteditor zu kommen. Hier müssen wir für die mathematische Funktion die Headerdatei math.h einbinden (#include <math.h>) und die Headerdatei „Unit1.h“ in „Sinus.h“ ändern. Zusätzlich geben wir als Variablenvereinbarung double shift = 0.0; ein. Anschließend gehen wir zurück auf den Formular-Designer und klicken nur einmal auf die PaintBox. Im Objektinspektor klicken wir auf die EreignisseRegisterkarte und klicken auf das Feld OnPaint. Auf das sich öffnende Feld bei OnPaint gehen wir mit einem Doppelklick. Nun müsste die Aufschrift „PaintBox1Paint“ erscheinen und gleichzeitig sich der entsprechende Quelltexteditor, der sich im Hintergrund befand, öffnen. Grafische Programmierung mit dem Borland C++-Builder 52 Fachhochschule Wiesbaden In diesen Quelltexteditor geben Sie folgenden Quellcode ein: const double PI = 3.14159265359; const double xmax = 2*PI, ymax = 10.0; double x, y, step, freq1, freq2, amp1, amp2; int xi, yi, w, h; step = xmax / 100; // Breite und Höhe der PaintBox: w = Form1->PaintBox1->Width; h = Form1->PaintBox1->Height; // Lesen der Werte aus den Editboxen: DecimalSeparator = '.'; //Standard ist Komma! freq1 = Form1->Freq1Edit->Text.ToDouble (); freq2 = Form1->Freq2Edit->Text.ToDouble (); amp1 = Form1->Amp1Edit->Text.ToDouble (); amp2 = Form1->Amp2Edit->Text.ToDouble (); // Anfangspunkt für Graphik berechnen: x = 0.0; y = amp1 * sin (freq1 * (x - shift)) + amp2 * sin (freq2 * x); xi = w * x / xmax; // Umrechnung in Pixel yi = h/2 - (h/2) * y / ymax; // Punkt setzen: Form1->PaintBox1->Canvas->MoveTo (xi, yi); Form1->PaintBox1->Canvas->Pen->Color = clRed; Grafische Programmierung mit dem Borland C++-Builder 53 Fachhochschule Wiesbaden for (x = step; x < xmax + step; x += step) { // nächsten Punkt berechnen: y = amp1 * sin (freq1 * (x - shift)) + amp2 * sin (freq2 * x); xi = w * x / xmax; // Umrechnung in Pixel yi = h/2 - (h/2) * y / ymax; // Linie ziehen: Form1->PaintBox1->Canvas->LineTo (xi, yi); } Zurück zum Formular-Designer: Wenn Sie jetzt einen Doppelklick auf den Timer tätigen, können Sie mit dem sich hier öffnenden Quelltexteditor folgendes einfügen: shift += 0.02; // die Wiederholzeit Form1->PaintBox1->Repaint (); // Bildwiederholung Als letztes müssen Sie einen Doppelklick auf den Beenden-Button tätigen und hier im Quelltexteditor den folgenden Code einfügen: Close(); Zum Schluss fügen wir noch den Bevel-Rahmen im Formular-Designer ein und ziehen diesen Rahmen um den Rahmen der PaintBox, so dass die PaintBox sich innerhalb des Bevel-Rahmens befindet. Das fertige FormularDesigner müsste jetzt wie in der folgenden Abb.:34 erscheinen. Grafische Programmierung mit dem Borland C++-Builder 54 Fachhochschule Wiesbaden Abbildung: 34 Wenn Sie das Programm kompilieren und starten, sehen Sie eine „verrauschte“ Sinus-Funktionen (Abb. 35). Grafische Programmierung mit dem Borland C++-Builder 55 Fachhochschule Wiesbaden Abbildung: 35 Grafische Programmierung mit dem Borland C++-Builder 56 Fachhochschule Wiesbaden 5.8 7. Schritt: Die abklingende Sinus-Welle Das jetzige Beispiel ist vom Aufbau her nicht viel anders als das vorangegangene mit der Überlagerung zweier Sinus-Funktionen. Es wird lediglich die abklingende Sinus-Funktion simuliert. Für dieses Beispiel benötigen wir zwei Label-Beschriftungsfelder, zwei EditEingabefelder, einen Timer, ein Button-Feld, eine PaintBox und einen BevelRahmen. Die Beschriftung der Label- und Edit-Felder: • Label1 = Frequenz (Hz) • Edit1 = 15.00 • Label2 = Amplitude (V) • Edit2 = 7.00 Die Eigenschaft der Namenseingebung für die Edit-Felder sollte in dem Objektinspektor wie folgt geändert werden: • Edit1 = Freq1Edit • Edit2 = Amp1Edit Der von Ihnen aufgebaute Formular-Designer sollte nun wie in der Abb. 36 aussehen. Grafische Programmierung mit dem Borland C++-Builder 57 Fachhochschule Wiesbaden Abbildung: 36 Im Quellcodeeditor können wir uns an das obige Beispiel (Überlagerung zweier Sinus-Funktionen) halten. Auch hier wird die Headerdatei math.h eingebunden und Unit1.h sollte einen anderen Namen bekommen. In unserem Beispiel nennen wir die Datei Welle.h. Auch hier wird eine Variablenvereinbarung vorgenommen: double shift = 0.0; Grafische Programmierung mit dem Borland C++-Builder 58 Fachhochschule Wiesbaden Als Quellcode für die PaintBox1Paint (im Objektinspektor die Registerkarte Ereignisse, dann OnPaint-Feld doppelt anklicken) geben Sie folgenden Text ein: const double PI = 3.14159265359; const double xmax = 2*PI, ymax = 10.0; double x, y, step, freq1, freq2, amp1, amp2; int xi, yi, w, h; step = xmax / 300; // Breite und Höhe der PaintBox: w = Form1->PaintBox1->Width; h = Form1->PaintBox1->Height; // Lesen der Werte aus den Editboxen: DecimalSeparator = '.'; //Standard ist Komma! freq1 = Form1->FreqEdit1->Text.ToDouble (); freq2 = 1; //Form1->Freq2Edit->Text.ToDouble (); amp1 = Form1->AmpEdit1->Text.ToDouble (); amp2 = 0; //Form1->Amp2Edit->Text.ToDouble (); // Anfangspunkt für Graphik berechnen: x = 0.0; y = amp1 * sin (freq1 * (x-shift)) + amp2 * sin (freq2 * x); xi = w * x / xmax; // Umrechnung in Pixel yi = h/2 - (h/2) * y / ymax; // Punkt setzen: Form1->PaintBox1->Canvas->MoveTo (xi, yi); Form1->PaintBox1->Canvas->Pen->Color = clRed; Grafische Programmierung mit dem Borland C++-Builder 59 Fachhochschule Wiesbaden for (x = step; x < xmax + step; x += step) { // nächsten Punkt berechnen: y = amp1 * sin (freq1 * (x-shift)) + amp2 * sin (freq2 * x); y = y * exp (-0.5 * x); xi = w * x / xmax; // Umrechnung in Pixel yi = h/2 - (h/2) * y / ymax; // Linie ziehen: Form1->PaintBox1->Canvas->LineTo (xi, yi); Form1->PaintBox1->Canvas->Pen->Color = clRed; } Die Quellcodes für den Timer und den Beenden-Button können Sie aus dem vorherigen Beispiel entnehmen. Zuletzt den Bevel-Rahmen um den Rahmen des PaintBox ziehen und fertig ist das Programm. Nachdem Sie das fertige Programm kompiliert haben, müsste die abklingende Sinus-Welle auf dem Bildschirm zu sehen sein (Abb. 37). Grafische Programmierung mit dem Borland C++-Builder 60 Fachhochschule Wiesbaden Abbildung: 37 Grafische Programmierung mit dem Borland C++-Builder 61