C++ - Fachbereich Maschinenbau - FH

Werbung
Fachhochschule Stralsund
Fachbereich Maschinenbau
Prof. Dr.-Ing. Ch. Wahmkow
Arbeitsblätter zur Vorlesung
C++
Diese Arbeitsblätter stellen eine sehr kurze Übersicht der in der Lehrveranstaltung
behandelten C++- Elemente dar.
Gliederung
1.
Die Oberfläche des Embarcadero C++ Builder ..................................................... 2
1.1
Anlegen eines neuen C++-Projektes ................................................................ 2
1.2
Die Entwicklungsoberfläche IDE ....................................................................... 3
1.3
Die Struktur eines C++ Projektes im Embarcadero C++ Builder .............. 4
1.4
Ereignisse, Methoden, Aktionen und Eigenschaften .................................. 5
2.
Grundlagen der Programmiersprache C++ ............................................................ 6
2.1
Fundamentale skalare Datentypen .................................................................. 6
2.2
Variablendeklaration ............................................................................................ 7
2.3
Funktionen für die Eingabe und Ausgabe ...................................................... 8
2.4
Zeichenkettenfunktionen..................................................................................... 8
2.5
Felder (Arrays) und StringGrids ....................................................................... 9
2.6
Externe Dateien .................................................................................................... 10
3.
Funktionen, Prozeduren, Eigenschaften und Methoden .................................. 12
3.1
Funktion oder Prozedur? .................................................................................. 12
3.2
wichtige Anweisungen....................................................................................... 12
4.
Nützliches ...................................................................................................................... 13
4.1
Tastencodes abfragen ....................................................................................... 13
4.2
OpenDialog, SaveDialog, PrintDialog ............................................................ 14
4.3
Try ... catch ............................................................................................................ 15
Literatur:
Kaiser, Richard
C++ mit dem Borland C++ Builder
Springer Verlag 2002
ISBN 3-540-62994-7
Schumann, Hans-Georg
C++ leicht & verständlich
Verlag: Knowware 1. Auflage 2005
ISBN 87-91364-56-6
1
1. Die Oberfläche des Embarcadero C++ Builder
1.1 Anlegen eines neuen C++-Projektes
Zur Entwicklung eines jeden C++ - Programmes erstellt der Embarcadero C++
Builder ein Projekt. Zu einem Projekt gehören mehrere Dateien. Zu Ihrer eigenen
Übersicht sollten Sie jedes neue C++-Programm in einem neuen Verzeichnis
ablegen.
Erstellen Sie vor dem Start des C++- Builders ein neues Verzeichnis mittels Windows
Explorer. (z.B. test)
Öffnen Sie danach den Embarcadero C++ Builder!
Da wir Windows-Anwendungen programmieren wollen, wählen Sie:
Menü Datei Neu…
VCL Formularanwendung C++ Builder
VCL ist die Abkürzung für Visual Component Library, einem Satz visueller und
nicht visueller Komponenten für die beschleunigte Erstellung von WindowsAnwendungen.
Diese Komponenten stehen uns in der Tool-Palette zur Verfügung.
Speichern Sie danach alles erst einmal ab! (Sie werden gleich sehen, wie viel
Dateien schon entstanden sind):
Menü Datei alles speichern…..
Wählen Sie als Speicherort jetzt das neue Verzeichnis (test)!
Zuerst wird der C++-Quelltext (cpp) abgelegt. Geben Sie hier einen logischen
Namen, der Ihrer Anwendung entspricht. (z.B. test)
Danach wird die Projektdatei (cbproj) abgelegt. Geben Sie hier auch einen logischen
Namen beginnend mit „P“ für Projekt (z.B. ptest).
Starten Sie jetzt Ihr Programm:
Entweder Menü Start oder
2
Sehen Sie sich anschließend in Ihrem Verzeichnis um. Sie werden staunen, wie viel
schon drin ist:
Die exe- ist das eigentliche Ziel unserer Arbeit. Die können Sie jetzt autark
verwenden, ohne die übrigen Dateien zu nutzen. Alles andere ist „lediglich“ für die
Entwicklung mittels C++ Builder erforderlich.
1.2 Die Entwicklungsoberfläche IDE
In dieser Ansicht sind wichtige Bestandteile des C++ Builders dargestellt.
Symbolleiste
Default Layout
Struktur,
alle
Objekte
des
Formulars
Formular als
Windowsoberfläche, sichtbar
in der Designansicht
Objektinspektor
Toolpalette
Registerleiste
Aufpassen, dass nicht zu viele Fenster aktiv sind, man verliert sonst schnell den
Überblick. Stellen Sie das Default Layout ein! Die Projektverwaltung können Sie
schließen.
In der Registerleiste kann man zum C++-Quelltext wechseln (test.cpp), und man
befindet sich im Quelltexteditor.
Auf das Formular werden alle sichtbaren und unsichtbaren Objekte (Komponenten)
aus der Toolpalette platziert. Auf einem Windowsformular können nur Texte ein- bzw.
ausgegeben werden.
3
Die Toolpalette bietet eine Unmenge von Komponenten an, die nach Kategorien
geordnet sind.
Mittels Objektinspektor können Sie sehr viele wesentliche Eigenschaften von
Objekten einstellen. Probieren Sie hier viel selbst aus!
In der Struktur sehen Sie alle Ihre auf dem Formular platzierten Objekte. Das ist
wichtig für deren Schreibweise. Sie sehen diese aber nur in der Designansicht.
Wechseln Sie in der Registerleiste durch Auswahl des cpp- Registers zum
Quelltexteditor:
Hier hinterlegen Sie all Ihre geistigen Ergüsse! Das ist das Fenster zum
Programmieren.
1.3 Die Struktur eines C++ Projektes im Embarcadero C++ Builder
Projektdatei
.cbproj
- Aufruf durch den C++-Builder
- beinhaltet den Aufruf sämtlicher
Bestandteile
Hauptprogramm des Projektes .cpp
- Quelltext
Formular1
Quelltext
des
Formulars
.cpp unit
Formularbeschreibung .dfm
Header
des Form.
.h
Ressourcen
des Projektes
.res
Ausführbare
Datei
.exe
Compiliertes
Hauptprogramm
.obj
Formular2
.
.
.
…
Symboldatei
für den
Debugger
.tds
Compilierte
Formulare
.obj
4
In der Projektverwaltung sieht man diese
Einteilung ähnlich als Baumstruktur:
In der Headerdatei (.h) eines Formulars werden die notwendigen Bibliotheken
eingebunden (z. B. #include <Controls.hpp>)und das Formular als neue Klasse mit
sämtlichen Eigenschaften eines Windowsfensters an das Hauptprogramm gebunden.
Hier kann man zusätzliche Bibliotheken einbinden.
Wird im Formular eine neue Komponente aus der Toolpalette aufgezogen, wird diese
hier aufgenommen.
Ereignisse werden hier ebenfalls deklariert. (automatisch)
Achtung!
Will man ein Ereignis löschen, so muss man es an dieser Stelle tun!
Die unit beinhaltet den Quelltext eines Formulars (.cpp) und ist die eigentliche
Datei, die für uns als Programmierer wichtig ist.
Borland hat schon wichtige Komponenten eingefügt:
- die VCL.h – die visuelle Komponentenpalette
- die Headerdatei unseres Formulars (.h)
- die Formularbeschreibung (.dfm)
- einen Zeiger auf die Klasse Formular (*Form1;) und dessen
Konstructor
Von uns werden jetzt sämtliche Ereignisse hier beschrieben (implementiert).
Der C++Builder gibt die Überschrift vor. Alles andere ist unsere Sache!!
1.4 Ereignisse, Methoden, Aktionen und Eigenschaften
Windows arbeitet ereignisorientiert. Es wartet also ständig, dass irgend etwas
passiert. Mausklicks, Buttonklicks, Tastatureingaben usw. Das sind Ereignisse.
Was passiert bei einem Ereignis? Das ist in den Methoden beschrieben
(programmiert). Der Ausdruck Methode kommt aus der objektorientierten
Programmierung.
Eine Methode ist also die programmierte Aktion auf ein Ereignis.
Über die Embarcadero C++-Oberfläche lassen sich die Ereignisse (nur
Standardereignisse) einfach in den Quelltexteditor hinein klicken. Das sieht dann
ungefähr so aus:
void __fastcall TForm1::Button1Click(TObject *Sender)
{
….hier steht die Action
}
void ist der Typ der Methode.
___fastcall kommt vom c++-Builder und ist eine Anweisung an den Compiler
5
TForm1 ist der Name des Objektes, auf dem ein Button platziert ist, der ein Ereignis
auslöst.
Button1Click ist der Name des Ereignisses.
Der doppelte Doppelpunkt verknüpft Klasse und Methode.
Werden vordefinierten Objekten Eigenschaften oder Methoden zugewiesen,
wird in C++ die Pfeilnnotation verwendet:
Edit1->SetFocus;
Label1->Caption=“Hallo“;
Man kann einigen Eigenschaften wieder Eigenschaften zuweisen:
Label1->Font->Name="Arial";
Label1->Font->Color=clRed;
Label1->Font->Size=14;
Label1->Font->Height=34;
Memo1->Lines->Add(“Eine neue Zeile”);
Label1->Font->Style=TFontStyles()<<fsBold;
Bei selbst definierten Objekten ist das Trennzeichen zwischen Objekt und Methode
bzw. Eigenschaft der Punkt.
Zusammenfassung
Trennzeichen zwischen
Objekt und Methode
::
->
Anwendung
verknüpft Klasse und
Methode
verknüpft Objekt und
Methode (eine Anweisung wird
Beispiel
TForm1::Button1Click
Edit1->Text
Timer1->Enabled
gegeben)
.
Verknüpft Objekte und
Methoden ohne Zeiger
String s
int i=s.Length();
2.
Grundlagen der Programmiersprache C++
In diesem Abschnitt sollen wesentliche Teile der Programmiersprache beschrieben
werden, die für die Lehrveranstaltung wichtig sind.
Ich weise darauf hin, dass wir hier nur einen kleinen Bruchteil der Mächtigkeit der
Sprache behandeln können. In den Lehrveranstaltungen können lediglich
Anregungen gegeben werden.
Probieren Sie selbst viel aus und testen Neues!
C++ unterscheidet streng zwischen Groß- und Kleinschreibung!!!!
2.1
Fundamentale skalare Datentypen
Jede Variable muss vereinbart werden. Die Stelle der Vereinbarung ist egal, auf
jeden Fall vor dem ersten Aufruf.
6
Am besten, Sie gewöhnen sich an, alle Variablen am Anfang eines Formulars oder
einer Prozedur zu vereinbaren.
Bei der Variablenvereinbarung werden einer Variablen der Speicherplatz in
entsprechender Größe und der Name zugewiesen.
Die Größe des Speicherplatzes hängt vom Datentyp der Variablen ab.
Jedem Datentyp kann man einen bestimmten Wertebereich zuordnen.
Folgende grundlegende skalare Datentypen gibt es (Auszug):
Datentyp
int
Größe
[Byte]
4
unsigned int
bool
char
unsigned char
short
4
1
1
1
2
unsigned short
long
2
4
long long
8
unsigned long
float
double
Extended
wchar_t
4
4
8
10
2
AnsiString
string
1-n Byte
0 - n-1 Byte
Andere Namen
signed,
signed int
unsigned
signed char
none
short int,
signed short int
unsigned short int
long int,
signed long int
unsigned long int
none
none
__wchar_t
Wertebereich
–2,147,483,648 to 2,147,483,647
0 bis 65535
false or true
–128 bis 127
0 bis 255
–32768 bis 32767
0 bis 65535
–2 147 483 648 bis 2 147 483 647
–9 223 372 036 854 775 808 bis
9 223 372 036 854 775 807
0 bis 4 294 967 295
3.4E +/- 38 (7 digits)
1.7E +/- 308 (15 digits)
-3,6 x 10^4951 .. 1,1 x 10^4932
0 bis 65 535
Bis zu 2 GB groß; wird nach Bedarf
reserviert
Bis zu 2 GB groß; wird nach Bedarf
reserviert
2.2
Variablendeklaration
Allgemeine Form: Datentyp Variablenname;
z.B.
int i; // hier werden 4 Byte Speicherplatz für eine ganze Zahl reserviert.
float x,y; //hier werden für die beiden reellen Zahlen x und y je 4 Byte reserviert.
AnsiString zk; //hier wird ein leerer String zur Verfügung gestellt
Man kann während der Deklaration auch gleich die Variable initialisieren, d.h. einen
Wert zuweisen.
int i=0;
7
float x=1,y;
AnsiString zk=”C++”;
lokale und globale Variable:
Lokale Variable gelten nur in den Prozeduren, wo sie deklariert sind.
Globale Variable gelten für das gesamte Formular.
Wird eine Variable in mehreren Prozeduren verwendet, so muss sie global vereinbart
werden.
Globale Variablen werden beim Deklarieren gleich mit initialisiert, lokale nicht!
Zeichenketten werden immer als leere Zeichenketten angelegt und damit initialisiert.
private oder public:
Alle Elemente, die unter privat deklariert wurden, sind nur in dieser Klasse gültig und
verwendbar. Elemente, die im gesamten Projekt verwendet werden sollen, sind als
public zu vereinbaren. Die Vereinbarung erfolgt in der Headerdatei.
2.3
Funktionen für die Eingabe und Ausgabe
Eine Eingabe ist in einem Windowsprogramm das Auslesen eines
Windowssteuerelementes und die Wertzuweisung auf eine Variable.
Die Ausgabe ist in einem Windowsprogramm die Umwandlung des Wertes einer
Variablen in eine Zeichenkette und deren Ausgabe auf ein
Windowssteuerelement.
Funktionen zur Eingabe:
StrToInt - k=StrToInt(Edit1->Text);
StrToFloat a=StrToFloat(Edit1->Text);
TryStrToInt -Versuch der Wertzuweisung; Fehler ist abfangbar!!
z.B.:
int a;
bool s;
s=TryStrToInt(Edit1->Text,a);
if (s)
{
Label1->Caption=IntToStr(a+1);
}
else
{
Label1->Caption="Fehler";
}
Funktionen zur Ausgabe:
IntToStr - Edit1->Text=IntToStr(i);
FloatToStr - Edit2->Text=FloatToStr(a); //Gibt 8 bzw.15 Stellen Genauigkeit aus
FormatFloat - Edit3->Text=FormatFloat(“0.00”,b);//gibt das reelle b mit 2 Stellen Genauigkeit aus
FloatToStrF Edit4->Text=FloatToStrF(b,ffNumber,8,2); // --“--, insgesamt 8 Stellen
2.4
Zeichenkettenfunktionen
Strings oder strings sind Klassen, d.h. man kann davon Objekte (Instanzen)
definieren, denen man Eigenschaften und Methoden zuweisen kann.
Bei den fundamentalen Datentypen (z.B. int oder float) kann man das nicht.
Vereinbarung:
AnsiString zk;
8
Zeichenkettenfunktion
MidStr(zk,Pos.,Anzahl)
SubString(Pos.,Anzahl) (substr)
Delete(Pos.,Anzahl) (erase)
Insert(neuezk,Pos.)
Pos(tzk) (find)
Length(zk)
Funktion, Prozedur oder
Methode
Funktion
Methode (Proz.)
Methode (Proz.)
Methode (Proz.)
Methode (Funktion)
Methode (Funktion)
Beispiel
tzk=MidStr(zk,i,1);
zk.SubString(2,3);
zk.Delete(3,2);
zk.Insert(„abc“,2);
i=zk.Pos(„ab“);
int n=zk.Length();
Man kann auch den Datentyp string verwenden.
Dann werden die Funktionsnamen einfach klein geschrieben bzw. es gelten die in
Klammern klein gedruckten Funktionsnamen.
Variable vom Typ AnsiString kann man nicht einfach auf Variablen vom Typ
string zuweisen.
z.B.
string s;
AnsiString a;
s=a; //Führt zum Fehler;
a=s; //Führt auch zum Fehler
So kann man eine Stringart in die andere überführen:
s=a.c_str() // s erhält den Wert von a
a=s.c_str() // a erhält den Wert von s
Achtung!!
Zeichenkettenfunktionen sind in der Unit StrUtils vereinbart. Diese muss man als
Includedatei in der Headerdatei hinzufügen:
#include <StrUtils.hpp>
2.5
Felder (Arrays) und StringGrids
Felder sind strukturierte Datentypen. Man unterscheidet sie von den fundamentalen,
skalaren Datentypen.
Ein Feld ist eine Zusammenfassung von Elementen desselben Datentyps unter
einem einzigen Namen.
Deklaration von Feldern:
Allgemein:
Datentyp Feldname[Anzahl der FE];
Das 1. Feldelement hat den Index 0, das letzte den Index Anzahl-1.
z.B.
int a[10]; // Dieses Feld a hat 10 Feldelemente von a[0] bis a[9]
int max=100;
float b[max];
9
double d[20];
String name[3];
int x[2]={0}; // x[0]=0=x[1]=0 zum Initialisieren eines Feldes
int z[10] [20]; ein 2-dimensionales Feld mit 10 Spalten und 20 Zeilen
Bei der Definition eines Feldes muss darauf geachtet werden, dass seine Grenze in
den zulässigen Speichergrenzen liegt.
Für lokale Definitionen liegt die Obergrenze bei 1 MB. Unter Projekt/Optionen/Linker
kann man diese Voreinstellung ändern.
Für global definierte Felder liegt die Obergrenze bei 2 GB.
Wird die Obergrenze überschritten, führt das zu einem Laufzeitfehler. Der Compiler
gibt nicht unbedingt eine Fehlermeldung oder Warnung aus.
Verarbeitung von Feldern:
Ein Feld wird immer über die einzelnen Elemente des Feldes angesprochen.
Ein Feldelement besteht aus dem Namen des Feldes und dem Index.
Der Index kann für ein Feldelement verschieden gewählt werden.
So kann innerhalb eines Programms ein Element a[i] gleich a[j] sein.
Der Index kann auch ein Ausdruck sein: z.B. a[i+1]
Die Eingabe und Ausgabe von Feldern passiert meist über die Komponente
StringGrid.
Ein StringGrid ist ein vordefiniertes Windowssteuerelement. Es hat die Form einer
Tabelle und ist damit ein 2-dimensionales Feld.
Die einzelnen Zellen können über deren Spalten – und Zeilenindex angesprochen
werden. Bei beiden Indizes beginnt die Zählung bei 0.
Eine Zelle wird definiert über: StringGrid1->Cells[Spalte][Zeile]
StringGrid1->Cells[0][0]
Da Stringgrids oft für die Ein- oder Ausgabe von Feldern
genutzt werden, spricht man die einzelnen Feldelemente
iterativ an.
z.B.: Eingabe: Hier wird die erste Spalte des
Stringgrids auf Feld a gelesen!
z.B.: Ausgabe: Hier wird in die 0. Zeile
der aktuelle Wert von i ausgegeben.
int a[10];
for (int i=1; i<=5;i++ )
{
a[i]=StrToInt(StringGrid1->Cells[1][i]);
}
for (int i=0;i<=3 ;i++ )
{
StringGrid1->Cells[i][0]=IntToStr(i);
}
2.6
Externe Dateien
Man unterscheidet zwischen Textdateien und formatierten Dateien.
10
In Textdateien steht zeilenweise nur Text drin. Diese Dateien sind auch nur
zeilenweise zu lesen. Zu vergleichen sind diese Dateien mit tatsächlichen Texten.
(siehe Word)
Eine Textdatei kann sehr einfach in ein Memofenster gelesen werden oder von da
geschrieben werden.
Memo1->Lines->LoadFromFile("text.txt"); //Lesen und Ausgabe ins Memofenster
Memo1->Lines->SaveToFile("text.txt"); // Schreiben des Inhalts vom Memofenster in Datei
Nichts weiter muss vereinbart werden. Eine zu lesende Datei muss im Verzeichnis
Debug_Build stehen, eine neue Datei wird da angelegt.
Bei formatierten Dateien ist die Struktur der einzelnen Datensätze bekannt. In der
Regel ist es ein Tabellenaufbau.
In einer Zeile können also verschiedene Daten unterschiedlichster Typen stehen.
Beispiel einer formatierten Datei:
Formatierte Dateien werden
auch als Stream bezeichnet.
Für deren Verarbeitung muss
man die Include-Datei
#include <fstream>
in die Quelle einfügen.
Deklaration:
Die Datei wird als Stream vereinbart und bekommt einen Namen ( hier f):
fstream f;
Öffnen der Datei zum Lesen
f.open(Filename,ios::in);
z.B.: f.open(OpenDialog1->FileName.c_str(),ios::in);
Öffnen der Datei zum Schreiben:
f.open(Filename,ios::out);
Einlesen der Datensätze:
f>>a[i]>>b[i]>>c[i]>>d[i]; //aus einer Zeile werden 4 Parameter gelesen
Schreiben der Datensätze auf Datei:
f<<a[i]<<b[i]<<c[i]<<d[i]; // 4 Parameter warden als eine Zeile in die Datei geschrieben
Schließen der Datei:
f.close();
11
3.
3.1
Funktionen, Prozeduren, Eigenschaften und Methoden
Funktion oder Prozedur?
In C++ sind eigentlich alle Unterprogramme Funktionen. Man unterscheidet aber
nach so genannten void- Funktionen und Funktionen mit Rückgabewert.
In der contextbasierten Hilfe findet man auch den Unterschied. Hier ist void oder der
Datentyp der Funktion ausgewiesen.
Eine void-Funktion wird wie eine Prozedur verwendet. Man fügt deren Namen
einfach in den eigenen Qelltext ein, führt eine eventuelle Parameterliste mit und ist
fertig.
z.B. Edit1->SetFocus();
also:
void Name()
{
Anweisungen
}
Funktionen mit Rückgabewert sind immer in einem Ausdruck zu verwenden. Hier
muss man darauf achten, welchen Datentyp der Rückgabewert hat.
Entweder ist ein Wert zuzuweisen (Label1->Visible=true;)
oder die Funktion ist einer Variablen zuzuweisen (int i=zk.Length();)
also:
Datentyp Name()
{
Anweisungen
Return Ergebnis
}
3.2
wichtige Anweisungen
- Edit- Fenster, Labels, Buttons, StringGrid…
Edit1->Clear(); //Löscht ein Editfenster
Edit1->SetFocus(); //Setzt den Fokus
Label1->Visible=false;
//Label wird unsichtbar
Button1->Enabled=false // Button nicht verfügbar aber sichtbar!
Timer1->Enabled=true; //Timer beginnt zu „laufen“
Label1->Caption=“Hallo“;
StringGrid1->Cells[1][2]=IntToStr(a); // Ausgabe
A=StrToInt(StringGrid1->Cells[1][2]; // Eingabe
Man kann einigen Eigenschaften wieder Eigenschaften zuweisen:
Label1->Font->Name="Arial";
12
Label1->Font->Color=clRed;
Label1->Font->Size=14;
Label1->Font->Height=34;
Memo1->Lines->Add(“Eine neue Zeile”);
Label1->Font->Style=TFontStyles()<<fsBold;
- Meldungsfenster
ShowMessage(„Fehlerhafte Eingabe!“);
- Zeit- und Datumsfunktionen
jetzt, heute,zeit vom Typ TDateTime
jetzt=Now(); //Das aktuelle Datum und Uhrzeit wird auf die Variable jetzt gelesen
heute=Date(); //aktuelles Datum wird auf heute zugewiesen
zeit=Time(); // aktuelle Zeit wird auf zeit zugewiesen
DecodeDate(jetzt,jahr, monat,tag);
DecodeTime(jetzt,stunde,minute,sekunde,msek);
- Zufallszahlen
Randomize(); //generiert den Zufallszahlengenerator
float z=Random(); // zufällige Zahl z zwischen 0 und 1
int a=Random(Grenze) zufällige ganze Zahl a; 0<=a< Grenze
- Abbruch
Close(); //schließt das aktuelle Fenster
Abort(); // verlässt die aktuellle Prozedur
exit(0);
// schließt die aktuelle Anwendung
break; // verlässt die aktuelle Struktur
- neues Fenster zeigen
2. Formular anlegen, dann deren Headerdatei im Quelltext des 1. Formulars
einbinden:
#include "Unit2.h" // entweder manuell oder über Menü Datei | unit verwenden…
an beliebiger Stelle:
Form2->Show();
4.
4.1
Nützliches
Tastencodes abfragen
Man kann nicht darstellbare Zeichen abfragen, z.B. die Enter-Taste oder ESC oder
die F-Tasten.
Man verwendet dazu die dezimale Verschlüsselung des Zeichens nach dem ASCIICode.
13
Meist wird eine Tast im Ereignis Keypressed abgefragt:
void __fastcall TForm1::Edit1KeyPress(TObject *Sender, char &Key)
{
if(Key==13)Button1->Click();//hier wird die Enter-Taste abgefragt und das Click-Ereignis für den
Button aufgerufen
}
if (Key=='a') Button1->SetFocus();
//hier wird die a-Taste abgefragt
Beachte die Hochkommas, da char!
if (Key==97) Button1->SetFocus();
//hier wird die a-Taste abgefragt
if (Key==8) Key = 8;
//backspace aktiviert
einige Tastencodes:
Enter
ESC
Del
Tab
Backspace
13
27
127
9
8
4.2 OpenDialog, SaveDialog, PrintDialog
Mit diesen Komponenten kann man die üblichen Fenster zum Öffnen, Speichern oder
Drucken einer Datei aufrufen.
void __fastcall TForm1::Button1Click(TObject *Sender)
{
String Dateiname;
if (OpenDialog1->Execute()==true) Dateiname=OpenDialog1->FileName;
}
if (OpenDialog1->Execute()) f.open(OpenDialog1->FileName.c_str(),ios::in);
void __fastcall TForm1::Button1Click(TObject *Sender)
{
String Dateiname;
if (SaveDialog1->Execute()==true) Dateiname=SaveDialog1->FileName;
}
void __fastcall TForm1::Button1Click(TObject *Sender)
{
if (PrintDialog1->Execute()==true) Form1->Print(); //Das Formular wird ausgedruckt, nicht der
Quelltext!!!
}
14
4.3 Try ... catch
Mit dem try….catch-Block kann man sehr elegant Laufzeitfehler abfangen.
Das heißt, versucht man irgendetwas in einem Programm umzusetzen (try) und es
klappt, ist alles in Ordnung.
Kommt es aber zu einem Laufzeitfehler, so kann man den abfangen (catch).
Achtung!
Sind Sie sich dessen bewusst, dass Sie dann die Fehlerkontrolle selbst in die
Hand nehmen. Normalerweise macht das das Betriebssystem.
Folgende Voreinstellung ist
dazu wichtig:
Menü: Tools| Optionen…|
Debugger-Optionen|
Sprachexceptions
Deaktivieren von: Bei
Sprach- Exceptions
benachrichtigen
Syntax:
try
Anweisungsblock
catch (...)
Anweisungsblock
z.B.
void __fastcall TForm1::Button1Click(TObject *Sender)
{
try
{
int k=StrToInt(Edit1->Text);
Label1->Caption=IntToStr(k+1);
}
catch(...)
{ShowMessage("Fehler!");}
}
15
Herunterladen