Transcript Powerpoint-Präsentation
Slide 1
Programmieren mit Prozeduren
und Delphi-Komponenten
Klaus Becker
(2002)
Slide 2
Programmieren mit Prozeduren und Komponenten
2
KB
Salve Caesar
PYLZFOWBN, QCY BUVN CBL GYCHY
AYBYCGMWBLCZN YHNTCZZYLN!
VDOYH FDHVDU!
Slide 3
Programmieren mit Prozeduren und Komponenten
3
KB
Teil 1
Verarbeitung von Zeichenketten
Prozedurkonzept
Slide 4
Caesar-Chiffrierung
Programmieren mit Prozeduren und Komponenten
4
KB
Klartextalphabet
A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
D E F G H I J K L M N O P Q R S T U V W X Y Z A B C
Geheimtextalphabet
Klartext:
ASTERIX
Schlüssel: 3
Geheimtext:
DVWHULA
Slide 5
Problembeschreibung
Programmieren mit Prozeduren und Komponenten
5
KB
Zielsetzung:
Mit Hilfe des zu entwickelnden Programms soll der Benutzer
kurze Texte mit der Caesar-Methode verschlüsseln und wieder
entschlüsseln können.
Anforderungen an das System:
- Der Benutzer kann (kurze) Texte selbst eingeben.
- Der Benutzer kann den Schlüssel (0..25) einstellen.
- Das Programm bereitet den Text geeignet vor (enttfernt Leerzeichen;
wandelt Umlaute um).
- Der verschlüsselte Text wird angezeigt und kann auch wieder entschlüsselt
werden.
- ...
Slide 6
Programmieren mit Prozeduren und Komponenten
6
KB
Benutzungsoberfläche
PTitel:
TPanel
GBQuelltext:
TGroupBox
BEntschluesseln:
TButton
EQuelltext:
TEdit
GBSchluessel:
TGroupBox
ESchluessel:
TEdit
GBChiffre:
TGroupBox
EGeheimtext:
TEdit
GBGeheimtext:
TGroupBox
BEntschluesseln:
TButton
Slide 7
Programmieren mit Prozeduren und Komponenten
7
KB
Datenmodell / Datenverarbeitung
type
tSchluessel = 0..25;
var
Quelltext : string;
Geheimtext : string;
Schluessel : tSchluessel;
// z. B.: 'ASTERIX'
// z. B.: 'DVWHULA'
// z. B.: 3
procedure verschluesseln
erzeugt bei gegebenem Quelltext und Schlüssel den zugehörigen Geheimtext
nach der Caesar-Methode (Voraussetzung: Der Quelltext besteht nur aus den
Großbuchstaben A ... Z.)
procedure entschluesseln
erzeugt bei gegebenem Geheimtext und Schlüssel den zugehörigen Quelltext
nach der Caesar-Methode
Slide 8
Exkurs: Zeichen
Programmieren mit Prozeduren und Komponenten
8
KB
Zeichen werden in Delphi / Pascal mit Hilfe des Datentyps char beschrieben.
Die zulässigen Zeichen werden durch den ASCII-Code festgelegt.
Code
0
65
66
90
97
98
...
122
Zeichen
(De)Kodieroperationen:
NUL
...
A
ord: char {0; ...; 255}
...
...
...
B
ord(´A´) 65
Z
chr: {0; ...; 255} char
a
b
chr(65) ´A´
z
Slide 9
Programmieren mit Prozeduren und Komponenten
9
Exkurs: Zeichenketten
Zeichenketten werden in Delphi / Pascal mit Hilfe des Datentyps string
beschrieben. Ein Delphi-String kann (je nach Compilereinstellung) max. 255
Zeichen enthalten.
Ein String wird in Delphi / Pascal in Apostrophe eingeschlossen (Bsp.:
'Hallo!'). Auch ein leere String '' ohne Zeichen ist möglich.
Im Programmtext darf ein String nur in einer Zeile stehen.
Zugriff auf einzelne Zeichen:
Auf einzelne Zeichen kann man über einen Index zugreifen.
Quelltext := 'Hallo!';
c := Quelltext[1];
// c 'H'
Länge einer Zeichenkette:
Die Länge einer Zeichenkette bestimmt man mit der length-Funktion.
Quelltext := 'Hallo!';
n := length(Quelltext);
KB
// n 6
Slide 10
Programmieren mit Prozeduren und Komponenten
10
KB
Verschlüsselungsalgorithmus
Verschluesseln
Geheimtext := ''
FÜR i VON 1 BIS length(Quelltext)
c := Quelltext[i]
n := ord(c)
n := n + Schlüssel
n > 90
ja
nein
n := n-26
c := chr(n)
Geheimtext := Geheimtext + c
Slide 11
Programmieren mit Prozeduren und Komponenten
11
KB
Übungen – Aufgabe 1
Ergänzen Sie zunächst das Programm zur Caesar-Chiffrierung.
Caesar0 – Grundprogramm
Das Programm soll anschließend wie folgt verbessert werden:
- Im Quelltext sollen alle Leerzeichen entfernt werden.
- Im Quelltext sollen alle Kleinbuchstaben in Großbuchstaben umgewandelt
werden.
- Im Quelltext sollen alle Umlaute durch Vokalkombinationen ersetzt werden.
Beispiel: Ich würde gerne dösen. ICHWUERDEGERNEDOESEN
Überlegen Sie sich zunächst, wie Sie die Benutzungsoberfläche ergänzen wollen.
Entwickeln und implementieren Sie anschließend einen passenden Algorithmus
zur Umwandlung des Quelltextes.
Caesar1 – mit Textvorbereitung
Slide 12
Programmieren mit Prozeduren und Komponenten
12
KB
Aufgabe 1 - Lösungsvorschlag
Hilfstext := '';
for i := 1 to length(Quelltext) do
begin c := Quelltext[i];
case c of
'A'..'Z': Hilfstext := Hilfstext + c;
'a'..'z': Hilfstext := Hilfstext + chr(ord(c)-32);
'ß': Hilfstext := Hilfstext + 'SS';
'ä': Hilfstext := Hilfstext + 'AE';
'ö': Hilfstext := Hilfstext + 'OE';
'ü': Hilfstext := Hilfstext + 'UE';
'Ä': Hilfstext := Hilfstext + 'AE';
'Ö': Hilfstext := Hilfstext + 'OE';
'Ü': Hilfstext := Hilfstext + 'UE';
end;
end;
Geheimtext := Hilfstext;
Caesar1 – mit Textvorbereitung
Slide 13
Programmieren mit Prozeduren und Komponenten
13
KB
Stringverarbeitung
Zielsetzung:
Es soll eine alternative Methode zur Vorbereitung des
Quelltextes mit Hilfe von String-Operationen (Length, Pos,
Delete, Insert) vorgestellt werden. Im Vordergrund steht
hierbei die Wiederholung des Parameterkonzepts.
Slide 14
Programmieren mit Prozeduren und Komponenten
14
KB
String-Verarbeitung
function Length(S: string): integer;
Beschreibung:
Length gibt die Anzahl der im angegebenen String vorhandenen Zeichen zurück.
Beispiel:
Anzahl := Length('Delphi') // Anzahl 6
function Pos(Substr: string; S: string): integer;
Beschreibung:
Pos sucht in dem String S nach dem Teilstring Substr. Wird der Teilstring
gefunden, gibt Pos den Integer-Index des ersten Zeichens von Substr in S
zurück. Die Groß/Kleinschreibung wird von Pos nicht berücksichtigt. Ist Substr
nicht vorhanden, wird der Wert 0 zurückgegeben.
Beispiele:
Position := Pos('hi', 'Delphibuch')
Position := Pos('Hi', 'Delphibuch')
Position := Pos('ihi', 'Delphibuch')
// Position 5
// Position 5
// Position 0
Slide 15
Programmieren mit Prozeduren und Komponenten
15
KB
String-Verarbeitung
procedure Delete(var S: string; Index, Count: integer)
Beschreibung:
Delete entfernt, beginnend mit S[Index], Count Zeichen aus dem String S. Ist
der Wert von Index größer als die Länge von S, werden keine Zeichen gelöscht.
Werden mit Count mehr Zeichen angegeben, als beginnend bei S[Index] im
String vorhanden sind, wird der Rest des Strings gelöscht.
Beispiel:
{Wort: 'Delphibuch'}
Delete(Wort, 4, 3);
{Wort: 'Delbuch'}
procedure Insert(Source: string; var S: string; i: integer)
Beschreibung:
Insert fügt Source in S an der Position S[i] ein.
Beispiel:
{Wort: 'Delbuch'}
Insert('phi', Wort, 4);
{Wort: 'Delphibuch'}
Slide 16
Parameter
Programmieren mit Prozeduren und Komponenten
16
KB
procedure Delete(var S: string; Index, Count: integer);
Beispiel:
{Z: ['Baumschule']}
Delete(Z, 5, 6)
{Z: ['Baum']}
Delete
Z
var S: string
Import/Export-Situation
5
Index: integer
Import-Situation
6
Count: integer
Import-Situation
Slide 17
Parameterübergabemechanismen
Programmieren mit Prozeduren und Komponenten
17
KB
{Z: ['Baumschule']}
Delete(Z, 5, 6)
Delete
Z: ['Baumschule']
5
6
Adresse
Wert
Wert
[ ]:S
Referenzbildung
[5]:Index
Wertübergabe
[6]:Count
Wertübergabe
Delete
Z: ['Baum']
[ ]:S
5
[ ]:Index
6
[ ]:Count
{Z: ['Baum']}
Slide 18
Parameterübergabemechanismen
Programmieren mit Prozeduren und Komponenten
18
KB
Prozeduraufruf:
Delete(Z, 5, 6)
aktuelle Parameter
Übergabesituation:
Z: ['Baumschule']
5
6
Delete
Adresse
Wert
Wert
Referenzparameter
[ ]:S
Referenzbildung
[5]:Index
Wertübergabe
[6]:Count
Wertübergabe
Werteparameter
Übergabemechanismen:
call-by-value:
Der Wert des aktuellen Parameters wird an den Werteparameter übergeben.
call-by-reference:
Es wird eine Referenz zwischen dem aktuellen Parameter und dem
Referenzparameter erzeugt.
Slide 19
Programmieren mit Prozeduren und Komponenten
19
KB
Datenaustauschsituationen
Daten-Import:
P
t
Daten-Export:
x
P
y
Daten-Transport:
var x
P
y
var x
Der aktuelle Parameter kann ein
Term sein. Der Wert des Terms
wird durch call-by-value an den
Werteparameter übergeben.
Der aktuelle Parameter muss
eine Variable sein. Der
Referenzparameter wird durch
call-by-reference an den
aktuellen Parameter gebunden.
Der aktuelle Parameter muss
eine Variable sein. Der
Referenzparameter wird durch
call-by-reference an den
aktuellen Parameter gebunden.
Slide 20
Programmieren mit Prozeduren und Komponenten
20
KB
Übungen – Aufgabe 2
Erstellen Sie eine Prozedur, mit der man innerhalb einer Zeichenkette ein Zeichen
durch eine neue Zeichenkette ersetzen kann.
Bsp.: Ersetze `ä` durch `AE` innerhalb von `Juha Vätäänen‘
Spezifizieren Sie zunächst den Datenaustausch / die Parameter der Prozedur.
Erstellen Sie dann einen Algorithmus mit Hilfe der Stringverarbeitungsoperationen (Delete, Insert, ...). Gehen Sie davon aus, dass das zu ersetzende
Zeichen nicht in der neuen Zeichenkette vorkommt. Welche Schwierigkeiten
könnten Sich andernfalls ergeben?
Slide 21
Programmieren mit Prozeduren und Komponenten
21
KB
Übungen – Aufgabe 3
Die Prozeduren zum Ver- und Entschlüsseln von Texten sollen so modifiziert
werden, dass der Datenaustausch transparent wird.
Spezifizieren Sie zunächst den Datenaustausch (Black-box-Diagramm).
Ändern Sie anschließend die Prozedurdeklarationen und die Prozeduraufrufe
geeignet ab.
Slide 22
Programmieren mit Prozeduren und Komponenten
22
KB
Aufgabe 2 - Lösungsvorschlag
Datenaustausch:
Ersetze
'ß'
c: char
'SS'
neu: string
Hilf
var Text: string
Deklaration:
procedure Ersetze(c: char; neu: string; var Text: string);
Verhaltensbeschreibung:
Die Prozedur „Ersetze“ ersetzt innerhalb der Zeichenkette „Text“ das Zeichen
„c“ durch die neue Zeichenkette „neu“.
Beispiel:
{hilf: ['Juha Vätäänen']}
Ersetze('ä', 'AE', hilf);
{hilf: ['Juha VAEtAEAEnen']}
Slide 23
Aufgabe 2 - Lösungsvorschlag
Programmieren mit Prozeduren und Komponenten
23
KB
Implementierung 1:
procedure Ersetze(c: char; neu: string; var Text: string);
var stelle: integer;
begin
stelle := pos(c, Text);
while stelle > 0 do
begin
Delete(Text, stelle, length(c));
Insert(neu, Text, stelle);
stelle := pos(c, Text);
end;
end;
Bemerkungen:
Der Algorithmus ist ausbaufähig: c: char s: string.
Er ist allerdings nur korrekt, falls c nicht in neu vorkommt.
Slide 24
Aufgabe 2 - Lösungsvorschlag
Programmieren mit Prozeduren und Komponenten
24
KB
Implementierung 2:
procedure Ersetze(c: char; neu: string; var Text: string);
var i: integer;
Hilfstext: string;
begin
Hilfstext := '';
for i := 1 to length(Text) do
if Text[i] = c then
Hilfstext := Hilfstext + neu
else
Hilfstext := Hilfstext + Text[i];
Text := Hilfstext;
end;
Bemerkungen:
Der Algorithmus ist effizienter als der in Implementierung 1.
Slide 25
Programmieren mit Prozeduren und Komponenten
25
KB
Aufgabe 3 - Lösungsvorschlag
Datenaustausch:
verschluesseln
Quelltext
QText: string
Schluessel
S: integer
Geheimtext
var GText: string
entschluesseln
Quelltext
var QText: string
Schluessel
S: integer
Geheimtext
GText: string
Caesar1 – mit Parameterübergabe
Slide 26
Schnittstellen
Programmieren mit Prozeduren und Komponenten
26
KB
Ersetze
c: char
neu: string
Text: string
Signatur:
procedure Ersetze (
char;
string;
string)
Verhaltensbeschreibung:
Die Prozedur „Ersetze“ ersetzt innerhalb der Zeichenkette „Text“ das Zeichen
„c“ durch die neue Zeichenkette „neu“.
Für die Benutzung einer Prozedur muss man nur die Signatur und das
Verhalten der Prozedur kennen.
Diese legen die sog. Schnittstelle der Prozedur fest.
Slide 27
Programmieren mit Prozeduren und Komponenten
27
KB
Teil 2
Komponenten
Slide 28
Laufzeitfehler
Programmieren mit Prozeduren und Komponenten
28
KB
Problem:
Bei der Eingabe des Schlüssels muss der
Benutzer darauf achten, eine ganze Zahl
einzutippen. Ansonsten kommt es bei der
Ereignisbearbeitung zu einem
Laufzeitfehler.
Ziel:
Vermeidung solcher Laufzeitfehler
Slide 29
TSpinEdit-Komponente
Programmieren mit Prozeduren und Komponenten
29
KB
SpEdSchluessel: TSpinEdit
Attribute
MinValue : 0
MaxValue : 25
Value
:3
...
Ereignisse
OnChange: SpEdSchluesselChange
...
Methoden
...
Caesar3 – Grundprogramm mit ...
procedure TForm1.SpEdSchluesselChange(Sender: TObject);
begin
Schluessel := SpEdSchluessel.Value;
end;
Slide 30
Programmieren mit Prozeduren und Komponenten
30
KB
Alternative: try-except-Anweisung
Syntax:
try [Anweisung] except [Fehleranweisung] end
Semantik:
Delphi versucht zunächst, die Anweisung durchzuführen. Führt dies zu
einem Fehler, so bricht Delphi diese Ausführung ab und führt stattdessen
die Fehleranweisung durch.
Voraussetzung:
Bei Delphi-Exceptions stoppen []
Beispiel:
try
Schluessel := StrToInt(ESchluessel.Text);
except
Schluessel := 0;
end;
Caesar2 – Grundprogramm mit ...
Slide 31
TMemo-Komponente
Programmieren mit Prozeduren und Komponenten
31
KB
Problem:
Bisher bestand die
Eingabe nur aus einer
Zeichenkettenzeile. Zur
Darstellung und
Bearbeitung längerer
Texte wäre es
zweckmäßig, ein
mehrzeiliges
Eingabefeld zu
benutzen.
Slide 32
Klasse TMemo
Programmieren mit Prozeduren und Komponenten
32
KB
TMemo
Attribute
property Lines: TStrings;
property ScrollBars: TScrollStyle;
...
Ereignisse
...
Methoden
...
type TScrollStyle =
(ssNone, ssHorizontal, ssVertical, ssBoth)
Slide 33
Klasse TStrings
Programmieren mit Prozeduren und Komponenten
33
TStrings
Attribute
property Strings[Index: Integer]: string;
property Count: Integer;
...
Ereignisse
...
Methoden
procedure Add(S: string);
procedure Clear;
procedure Delete(Index: Integer);
procedure Insert(Index: Integer; S: string);
procedure LoadFromFile(FileName: string);
procedure SaveToFile(FileName: string);
...
KB
Slide 34
Stringlisten
Programmieren mit Prozeduren und Komponenten
34
KB
0
'Hallo Inger'
1
'Wie geht es Dir?'
2
'Ich hoffe gut.'
3
'Viele Grüße von ...'
var L: TStrings;
i: integer;
...
L.Strings[0] := L.Strings[0] + '!';
for i := 0 to L.Count-1 do
L.Strings[i] := 'Hallo';
Slide 35
Programmieren mit Prozeduren und Komponenten
35
Verarbeitung von Stringlisten
0
'Hallo Inger'
1
'Wie geht es Dir?'
2
'Ich hoffe gut.'
3
'Viele Grüße von ...'
procedure Add(S: string);
- fügt die Zeichenkette S am Ende der Liste an
procedure Clear;
- löscht die gesamte Liste
procedure Delete(Index: Integer);
- löscht nur den Eintrag mit dem übegebenen Index
procedure Insert(Index: Integer; S: string);
- fügt die Zeichenkette S an die durch Index beschriebenen Zeile in der Liste ein
procedure LoadFromFile(FileName: string);
procedure SaveToFile(FileName: string);
KB
- lädt eine Liste aus einer Datei / speichert eine Liste in eine Datei
Slide 36
Programmieren mit Prozeduren und Komponenten
36
KB
Verarbeitung von Memo-Komponenten
MQuelltext, MGeheimText: TMemo;
...
begin
MGeheimtext.Lines.Clear;
for i := 0 to MQuelltext.Lines.Count-1 do
begin
Quelltext := MQuelltext.Lines.Strings[i];
verschluesseln(Quelltext, Schluessel, Geheimtext);
MGeheimtext.Lines.Add(Geheimtext);
end;
end;
Caesar4 – Texteingabe über Memofeld
Slide 37
Laden und Speichern
Programmieren mit Prozeduren und Komponenten
37
KB
Problem:
Quell- und Geheimtext
sollen aus einer Datei
geladen bzw. in einer
Datei gespeichert
werden können.
Slide 38
Programmieren mit Prozeduren und Komponenten
38
KB
Komponente: TOpenDialog
TOpenDialog
Attribute
property FileName: TFileName;
...
Ereignisse
...
Methoden
function Execute: Boolean;
...
Execute öffnet das Dialogfeld zur Auswahl von Dateien und gibt True zurück,
wenn der Benutzer eine Datei ausgewählt und auf OK geklickt hat. Klickt der
Benutzer auf Abbrechen, liefert Execute False zurück.
Slide 39
Programmieren mit Prozeduren und Komponenten
39
KB
Memo-Stringliste laden
TOpenDialog
Attribute
property FileName: TFileName;
...
Ereignisse
...
Methoden
function Execute: Boolean;
...
procedure TForm1.BLadenQClick(Sender: TObject);
begin
if OpenDialog1.Execute then
MQuelltext.Lines.LoadFromFile(OpenDialog1.Filename);
end;
Caesar4 – mit Laden und Speichern
Slide 40
Programmieren mit Prozeduren und Komponenten
40
KB
Übungen – Aufgabe 4
Bauen Sie das Grundprogramm zur Caesar-Verschlüsselung schrittweise aus:
- Schlüsseleingabe über eine SpinEdit-Komponente
- Textein- und Ausgabe über Memofelder
- Vorbereitung des eingegebenen Textes (Sonderzeichen; Umlaute)
- Laden und Speichern von Texten.
Caesar4 – mit Laden und Speichern
Slide 41
Programmieren mit Prozeduren und Komponenten
41
KB
Übungen – Aufgabe 5
Um einen mit der Caesar-Methode kodierten Text zu entschlüsseln, kann man
auch wie folgt vorgehen: Man ermittelt, welcher Buchstabe im Geheimtext am
häufigsten vorkommt. Dieser Buchstabe ist mit großer Wahrscheinlichkeit die
Kodierung von ‚E‘.
Erweitern Sie das Caesar-Programm um die Möglichkeit, im Geheimtext die
Buchstabenhäufigkeiten zu bestimmen.
Caesar5 – mit Statistik
Slide 42
Programmieren mit Prozeduren und Komponenten
42
KB
Teil 3
Zusammenfassung:
Arbeiten mit Komponenten
Slide 43
Delphi-Hilfe
Programmieren mit Prozeduren und Komponenten
43
KB
TLabel
Hierarchie
Eigenschaften
Methoden
Ereignisse
TLabel ist ein nicht fensterorientiertes Steuerelement, mit dem Text in einem
Formular angezeigt werden kann. Sie können diesen Text als Beschriftung für
ein anderes Steuerelement verwenden und den Fokus an dieses Steuerelement
übergeben, sobald der Benutzer ein im Text enthaltenes Tastenkürzel eingibt.
Unit stdctrls
Beschreibung
Da die Komponente TLabel kein Nachkomme von TWinControl ist, besitzt sie
kein eigenes Fenster und kann keine direkten Eingaben von der Tastatur
empfangen. Wenn Sie in einem Formular ein Objekt benötigen, das nicht nur
aufgrund der Eingabe eines Tastenkürzels den Fokus an ein anderes
Steuerelement übergibt, sondern selbst auf Tastatureingaben antworten kann,
müssen Sie TStaticText verwenden.
Soll der Benutzer in einem Textanzeigeobjekt einen Bildlauf durchführen und
Änderungen vornehmen können, verwenden Sie eine TEdit-Komponente.
Slide 44
Programmieren mit Prozeduren und Komponenten
44
KB
Struktur von Komponenten
erbt von ...
TLabel
Attribute
...
Ereignisse
...
Methoden
...
Slide 45
Komponentenbeschreibung
Programmieren mit Prozeduren und Komponenten
45
KB
TLabel
Attribute
property Caption: TCaption // type TCaption = string;
...
Ereignisse
property OnClick: TNotifyEvent
...
Methoden
procedure SetBounds(ALeft, ATop, AWidth, AHeight: Integer)
...
Slide 46
Programmieren mit Prozeduren und Komponenten
46
KB
Schnittstellenbeschreibung
TControl.SetBounds
Die Methode SetBounds setzt die Eigenschaften Left, Top, Width und Height
gleichzeitig.
procedure SetBounds(ALeft, ATop, AWidth, AHeight: Integer); virtual;
Beschreibung
Mit der Methode SetBounds können Sie alle Eigenschaften des umgebenden
Rechtecks der Komponente gleichzeitig ändern. Sie können dazu auch die
Eigenschaften Left, Top, Width und Height einzeln setzen. Jedoch ist durch
SetBounds sichergestellt, daß das Steuerelement nicht nach jeder Wertzuweisung
neu gezeichnet werden muß.
Die Werte für die Eigenschaften Left, Top, Width und Height werden in den
Parametern ALeft, ATop, AWidth und AHeight übergeben.
Durch den Aufruf von SetBounds erhalten die Eigenschaften Left, Top, Width und
Height nicht notwendigerweise die angegebenen Werte. Die neuen Werte können
vor der Zuweisung durch AutoSize oder Constraints eingeschränkt und durch eine
Ereignisbehandlungsroutine für OnCanResize (oder OnConstrainedResize)
angepaßt werden. Nachdem die Eigenschaften Left, Top, Width und Height des
Steuerelements geändert wurden, generiert SetBounds ein OnResize-Ereignis.
Programmieren mit Prozeduren
und Delphi-Komponenten
Klaus Becker
(2002)
Slide 2
Programmieren mit Prozeduren und Komponenten
2
KB
Salve Caesar
PYLZFOWBN, QCY BUVN CBL GYCHY
AYBYCGMWBLCZN YHNTCZZYLN!
VDOYH FDHVDU!
Slide 3
Programmieren mit Prozeduren und Komponenten
3
KB
Teil 1
Verarbeitung von Zeichenketten
Prozedurkonzept
Slide 4
Caesar-Chiffrierung
Programmieren mit Prozeduren und Komponenten
4
KB
Klartextalphabet
A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
D E F G H I J K L M N O P Q R S T U V W X Y Z A B C
Geheimtextalphabet
Klartext:
ASTERIX
Schlüssel: 3
Geheimtext:
DVWHULA
Slide 5
Problembeschreibung
Programmieren mit Prozeduren und Komponenten
5
KB
Zielsetzung:
Mit Hilfe des zu entwickelnden Programms soll der Benutzer
kurze Texte mit der Caesar-Methode verschlüsseln und wieder
entschlüsseln können.
Anforderungen an das System:
- Der Benutzer kann (kurze) Texte selbst eingeben.
- Der Benutzer kann den Schlüssel (0..25) einstellen.
- Das Programm bereitet den Text geeignet vor (enttfernt Leerzeichen;
wandelt Umlaute um).
- Der verschlüsselte Text wird angezeigt und kann auch wieder entschlüsselt
werden.
- ...
Slide 6
Programmieren mit Prozeduren und Komponenten
6
KB
Benutzungsoberfläche
PTitel:
TPanel
GBQuelltext:
TGroupBox
BEntschluesseln:
TButton
EQuelltext:
TEdit
GBSchluessel:
TGroupBox
ESchluessel:
TEdit
GBChiffre:
TGroupBox
EGeheimtext:
TEdit
GBGeheimtext:
TGroupBox
BEntschluesseln:
TButton
Slide 7
Programmieren mit Prozeduren und Komponenten
7
KB
Datenmodell / Datenverarbeitung
type
tSchluessel = 0..25;
var
Quelltext : string;
Geheimtext : string;
Schluessel : tSchluessel;
// z. B.: 'ASTERIX'
// z. B.: 'DVWHULA'
// z. B.: 3
procedure verschluesseln
erzeugt bei gegebenem Quelltext und Schlüssel den zugehörigen Geheimtext
nach der Caesar-Methode (Voraussetzung: Der Quelltext besteht nur aus den
Großbuchstaben A ... Z.)
procedure entschluesseln
erzeugt bei gegebenem Geheimtext und Schlüssel den zugehörigen Quelltext
nach der Caesar-Methode
Slide 8
Exkurs: Zeichen
Programmieren mit Prozeduren und Komponenten
8
KB
Zeichen werden in Delphi / Pascal mit Hilfe des Datentyps char beschrieben.
Die zulässigen Zeichen werden durch den ASCII-Code festgelegt.
Code
0
65
66
90
97
98
...
122
Zeichen
(De)Kodieroperationen:
NUL
...
A
ord: char {0; ...; 255}
...
...
...
B
ord(´A´) 65
Z
chr: {0; ...; 255} char
a
b
chr(65) ´A´
z
Slide 9
Programmieren mit Prozeduren und Komponenten
9
Exkurs: Zeichenketten
Zeichenketten werden in Delphi / Pascal mit Hilfe des Datentyps string
beschrieben. Ein Delphi-String kann (je nach Compilereinstellung) max. 255
Zeichen enthalten.
Ein String wird in Delphi / Pascal in Apostrophe eingeschlossen (Bsp.:
'Hallo!'). Auch ein leere String '' ohne Zeichen ist möglich.
Im Programmtext darf ein String nur in einer Zeile stehen.
Zugriff auf einzelne Zeichen:
Auf einzelne Zeichen kann man über einen Index zugreifen.
Quelltext := 'Hallo!';
c := Quelltext[1];
// c 'H'
Länge einer Zeichenkette:
Die Länge einer Zeichenkette bestimmt man mit der length-Funktion.
Quelltext := 'Hallo!';
n := length(Quelltext);
KB
// n 6
Slide 10
Programmieren mit Prozeduren und Komponenten
10
KB
Verschlüsselungsalgorithmus
Verschluesseln
Geheimtext := ''
FÜR i VON 1 BIS length(Quelltext)
c := Quelltext[i]
n := ord(c)
n := n + Schlüssel
n > 90
ja
nein
n := n-26
c := chr(n)
Geheimtext := Geheimtext + c
Slide 11
Programmieren mit Prozeduren und Komponenten
11
KB
Übungen – Aufgabe 1
Ergänzen Sie zunächst das Programm zur Caesar-Chiffrierung.
Caesar0 – Grundprogramm
Das Programm soll anschließend wie folgt verbessert werden:
- Im Quelltext sollen alle Leerzeichen entfernt werden.
- Im Quelltext sollen alle Kleinbuchstaben in Großbuchstaben umgewandelt
werden.
- Im Quelltext sollen alle Umlaute durch Vokalkombinationen ersetzt werden.
Beispiel: Ich würde gerne dösen. ICHWUERDEGERNEDOESEN
Überlegen Sie sich zunächst, wie Sie die Benutzungsoberfläche ergänzen wollen.
Entwickeln und implementieren Sie anschließend einen passenden Algorithmus
zur Umwandlung des Quelltextes.
Caesar1 – mit Textvorbereitung
Slide 12
Programmieren mit Prozeduren und Komponenten
12
KB
Aufgabe 1 - Lösungsvorschlag
Hilfstext := '';
for i := 1 to length(Quelltext) do
begin c := Quelltext[i];
case c of
'A'..'Z': Hilfstext := Hilfstext + c;
'a'..'z': Hilfstext := Hilfstext + chr(ord(c)-32);
'ß': Hilfstext := Hilfstext + 'SS';
'ä': Hilfstext := Hilfstext + 'AE';
'ö': Hilfstext := Hilfstext + 'OE';
'ü': Hilfstext := Hilfstext + 'UE';
'Ä': Hilfstext := Hilfstext + 'AE';
'Ö': Hilfstext := Hilfstext + 'OE';
'Ü': Hilfstext := Hilfstext + 'UE';
end;
end;
Geheimtext := Hilfstext;
Caesar1 – mit Textvorbereitung
Slide 13
Programmieren mit Prozeduren und Komponenten
13
KB
Stringverarbeitung
Zielsetzung:
Es soll eine alternative Methode zur Vorbereitung des
Quelltextes mit Hilfe von String-Operationen (Length, Pos,
Delete, Insert) vorgestellt werden. Im Vordergrund steht
hierbei die Wiederholung des Parameterkonzepts.
Slide 14
Programmieren mit Prozeduren und Komponenten
14
KB
String-Verarbeitung
function Length(S: string): integer;
Beschreibung:
Length gibt die Anzahl der im angegebenen String vorhandenen Zeichen zurück.
Beispiel:
Anzahl := Length('Delphi') // Anzahl 6
function Pos(Substr: string; S: string): integer;
Beschreibung:
Pos sucht in dem String S nach dem Teilstring Substr. Wird der Teilstring
gefunden, gibt Pos den Integer-Index des ersten Zeichens von Substr in S
zurück. Die Groß/Kleinschreibung wird von Pos nicht berücksichtigt. Ist Substr
nicht vorhanden, wird der Wert 0 zurückgegeben.
Beispiele:
Position := Pos('hi', 'Delphibuch')
Position := Pos('Hi', 'Delphibuch')
Position := Pos('ihi', 'Delphibuch')
// Position 5
// Position 5
// Position 0
Slide 15
Programmieren mit Prozeduren und Komponenten
15
KB
String-Verarbeitung
procedure Delete(var S: string; Index, Count: integer)
Beschreibung:
Delete entfernt, beginnend mit S[Index], Count Zeichen aus dem String S. Ist
der Wert von Index größer als die Länge von S, werden keine Zeichen gelöscht.
Werden mit Count mehr Zeichen angegeben, als beginnend bei S[Index] im
String vorhanden sind, wird der Rest des Strings gelöscht.
Beispiel:
{Wort: 'Delphibuch'}
Delete(Wort, 4, 3);
{Wort: 'Delbuch'}
procedure Insert(Source: string; var S: string; i: integer)
Beschreibung:
Insert fügt Source in S an der Position S[i] ein.
Beispiel:
{Wort: 'Delbuch'}
Insert('phi', Wort, 4);
{Wort: 'Delphibuch'}
Slide 16
Parameter
Programmieren mit Prozeduren und Komponenten
16
KB
procedure Delete(var S: string; Index, Count: integer);
Beispiel:
{Z: ['Baumschule']}
Delete(Z, 5, 6)
{Z: ['Baum']}
Delete
Z
var S: string
Import/Export-Situation
5
Index: integer
Import-Situation
6
Count: integer
Import-Situation
Slide 17
Parameterübergabemechanismen
Programmieren mit Prozeduren und Komponenten
17
KB
{Z: ['Baumschule']}
Delete(Z, 5, 6)
Delete
Z: ['Baumschule']
5
6
Adresse
Wert
Wert
[ ]:S
Referenzbildung
[5]:Index
Wertübergabe
[6]:Count
Wertübergabe
Delete
Z: ['Baum']
[ ]:S
5
[ ]:Index
6
[ ]:Count
{Z: ['Baum']}
Slide 18
Parameterübergabemechanismen
Programmieren mit Prozeduren und Komponenten
18
KB
Prozeduraufruf:
Delete(Z, 5, 6)
aktuelle Parameter
Übergabesituation:
Z: ['Baumschule']
5
6
Delete
Adresse
Wert
Wert
Referenzparameter
[ ]:S
Referenzbildung
[5]:Index
Wertübergabe
[6]:Count
Wertübergabe
Werteparameter
Übergabemechanismen:
call-by-value:
Der Wert des aktuellen Parameters wird an den Werteparameter übergeben.
call-by-reference:
Es wird eine Referenz zwischen dem aktuellen Parameter und dem
Referenzparameter erzeugt.
Slide 19
Programmieren mit Prozeduren und Komponenten
19
KB
Datenaustauschsituationen
Daten-Import:
P
t
Daten-Export:
x
P
y
Daten-Transport:
var x
P
y
var x
Der aktuelle Parameter kann ein
Term sein. Der Wert des Terms
wird durch call-by-value an den
Werteparameter übergeben.
Der aktuelle Parameter muss
eine Variable sein. Der
Referenzparameter wird durch
call-by-reference an den
aktuellen Parameter gebunden.
Der aktuelle Parameter muss
eine Variable sein. Der
Referenzparameter wird durch
call-by-reference an den
aktuellen Parameter gebunden.
Slide 20
Programmieren mit Prozeduren und Komponenten
20
KB
Übungen – Aufgabe 2
Erstellen Sie eine Prozedur, mit der man innerhalb einer Zeichenkette ein Zeichen
durch eine neue Zeichenkette ersetzen kann.
Bsp.: Ersetze `ä` durch `AE` innerhalb von `Juha Vätäänen‘
Spezifizieren Sie zunächst den Datenaustausch / die Parameter der Prozedur.
Erstellen Sie dann einen Algorithmus mit Hilfe der Stringverarbeitungsoperationen (Delete, Insert, ...). Gehen Sie davon aus, dass das zu ersetzende
Zeichen nicht in der neuen Zeichenkette vorkommt. Welche Schwierigkeiten
könnten Sich andernfalls ergeben?
Slide 21
Programmieren mit Prozeduren und Komponenten
21
KB
Übungen – Aufgabe 3
Die Prozeduren zum Ver- und Entschlüsseln von Texten sollen so modifiziert
werden, dass der Datenaustausch transparent wird.
Spezifizieren Sie zunächst den Datenaustausch (Black-box-Diagramm).
Ändern Sie anschließend die Prozedurdeklarationen und die Prozeduraufrufe
geeignet ab.
Slide 22
Programmieren mit Prozeduren und Komponenten
22
KB
Aufgabe 2 - Lösungsvorschlag
Datenaustausch:
Ersetze
'ß'
c: char
'SS'
neu: string
Hilf
var Text: string
Deklaration:
procedure Ersetze(c: char; neu: string; var Text: string);
Verhaltensbeschreibung:
Die Prozedur „Ersetze“ ersetzt innerhalb der Zeichenkette „Text“ das Zeichen
„c“ durch die neue Zeichenkette „neu“.
Beispiel:
{hilf: ['Juha Vätäänen']}
Ersetze('ä', 'AE', hilf);
{hilf: ['Juha VAEtAEAEnen']}
Slide 23
Aufgabe 2 - Lösungsvorschlag
Programmieren mit Prozeduren und Komponenten
23
KB
Implementierung 1:
procedure Ersetze(c: char; neu: string; var Text: string);
var stelle: integer;
begin
stelle := pos(c, Text);
while stelle > 0 do
begin
Delete(Text, stelle, length(c));
Insert(neu, Text, stelle);
stelle := pos(c, Text);
end;
end;
Bemerkungen:
Der Algorithmus ist ausbaufähig: c: char s: string.
Er ist allerdings nur korrekt, falls c nicht in neu vorkommt.
Slide 24
Aufgabe 2 - Lösungsvorschlag
Programmieren mit Prozeduren und Komponenten
24
KB
Implementierung 2:
procedure Ersetze(c: char; neu: string; var Text: string);
var i: integer;
Hilfstext: string;
begin
Hilfstext := '';
for i := 1 to length(Text) do
if Text[i] = c then
Hilfstext := Hilfstext + neu
else
Hilfstext := Hilfstext + Text[i];
Text := Hilfstext;
end;
Bemerkungen:
Der Algorithmus ist effizienter als der in Implementierung 1.
Slide 25
Programmieren mit Prozeduren und Komponenten
25
KB
Aufgabe 3 - Lösungsvorschlag
Datenaustausch:
verschluesseln
Quelltext
QText: string
Schluessel
S: integer
Geheimtext
var GText: string
entschluesseln
Quelltext
var QText: string
Schluessel
S: integer
Geheimtext
GText: string
Caesar1 – mit Parameterübergabe
Slide 26
Schnittstellen
Programmieren mit Prozeduren und Komponenten
26
KB
Ersetze
c: char
neu: string
Text: string
Signatur:
procedure Ersetze (
char;
string;
string)
Verhaltensbeschreibung:
Die Prozedur „Ersetze“ ersetzt innerhalb der Zeichenkette „Text“ das Zeichen
„c“ durch die neue Zeichenkette „neu“.
Für die Benutzung einer Prozedur muss man nur die Signatur und das
Verhalten der Prozedur kennen.
Diese legen die sog. Schnittstelle der Prozedur fest.
Slide 27
Programmieren mit Prozeduren und Komponenten
27
KB
Teil 2
Komponenten
Slide 28
Laufzeitfehler
Programmieren mit Prozeduren und Komponenten
28
KB
Problem:
Bei der Eingabe des Schlüssels muss der
Benutzer darauf achten, eine ganze Zahl
einzutippen. Ansonsten kommt es bei der
Ereignisbearbeitung zu einem
Laufzeitfehler.
Ziel:
Vermeidung solcher Laufzeitfehler
Slide 29
TSpinEdit-Komponente
Programmieren mit Prozeduren und Komponenten
29
KB
SpEdSchluessel: TSpinEdit
Attribute
MinValue : 0
MaxValue : 25
Value
:3
...
Ereignisse
OnChange: SpEdSchluesselChange
...
Methoden
...
Caesar3 – Grundprogramm mit ...
procedure TForm1.SpEdSchluesselChange(Sender: TObject);
begin
Schluessel := SpEdSchluessel.Value;
end;
Slide 30
Programmieren mit Prozeduren und Komponenten
30
KB
Alternative: try-except-Anweisung
Syntax:
try [Anweisung] except [Fehleranweisung] end
Semantik:
Delphi versucht zunächst, die Anweisung durchzuführen. Führt dies zu
einem Fehler, so bricht Delphi diese Ausführung ab und führt stattdessen
die Fehleranweisung durch.
Voraussetzung:
Bei Delphi-Exceptions stoppen []
Beispiel:
try
Schluessel := StrToInt(ESchluessel.Text);
except
Schluessel := 0;
end;
Caesar2 – Grundprogramm mit ...
Slide 31
TMemo-Komponente
Programmieren mit Prozeduren und Komponenten
31
KB
Problem:
Bisher bestand die
Eingabe nur aus einer
Zeichenkettenzeile. Zur
Darstellung und
Bearbeitung längerer
Texte wäre es
zweckmäßig, ein
mehrzeiliges
Eingabefeld zu
benutzen.
Slide 32
Klasse TMemo
Programmieren mit Prozeduren und Komponenten
32
KB
TMemo
Attribute
property Lines: TStrings;
property ScrollBars: TScrollStyle;
...
Ereignisse
...
Methoden
...
type TScrollStyle =
(ssNone, ssHorizontal, ssVertical, ssBoth)
Slide 33
Klasse TStrings
Programmieren mit Prozeduren und Komponenten
33
TStrings
Attribute
property Strings[Index: Integer]: string;
property Count: Integer;
...
Ereignisse
...
Methoden
procedure Add(S: string);
procedure Clear;
procedure Delete(Index: Integer);
procedure Insert(Index: Integer; S: string);
procedure LoadFromFile(FileName: string);
procedure SaveToFile(FileName: string);
...
KB
Slide 34
Stringlisten
Programmieren mit Prozeduren und Komponenten
34
KB
0
'Hallo Inger'
1
'Wie geht es Dir?'
2
'Ich hoffe gut.'
3
'Viele Grüße von ...'
var L: TStrings;
i: integer;
...
L.Strings[0] := L.Strings[0] + '!';
for i := 0 to L.Count-1 do
L.Strings[i] := 'Hallo';
Slide 35
Programmieren mit Prozeduren und Komponenten
35
Verarbeitung von Stringlisten
0
'Hallo Inger'
1
'Wie geht es Dir?'
2
'Ich hoffe gut.'
3
'Viele Grüße von ...'
procedure Add(S: string);
- fügt die Zeichenkette S am Ende der Liste an
procedure Clear;
- löscht die gesamte Liste
procedure Delete(Index: Integer);
- löscht nur den Eintrag mit dem übegebenen Index
procedure Insert(Index: Integer; S: string);
- fügt die Zeichenkette S an die durch Index beschriebenen Zeile in der Liste ein
procedure LoadFromFile(FileName: string);
procedure SaveToFile(FileName: string);
KB
- lädt eine Liste aus einer Datei / speichert eine Liste in eine Datei
Slide 36
Programmieren mit Prozeduren und Komponenten
36
KB
Verarbeitung von Memo-Komponenten
MQuelltext, MGeheimText: TMemo;
...
begin
MGeheimtext.Lines.Clear;
for i := 0 to MQuelltext.Lines.Count-1 do
begin
Quelltext := MQuelltext.Lines.Strings[i];
verschluesseln(Quelltext, Schluessel, Geheimtext);
MGeheimtext.Lines.Add(Geheimtext);
end;
end;
Caesar4 – Texteingabe über Memofeld
Slide 37
Laden und Speichern
Programmieren mit Prozeduren und Komponenten
37
KB
Problem:
Quell- und Geheimtext
sollen aus einer Datei
geladen bzw. in einer
Datei gespeichert
werden können.
Slide 38
Programmieren mit Prozeduren und Komponenten
38
KB
Komponente: TOpenDialog
TOpenDialog
Attribute
property FileName: TFileName;
...
Ereignisse
...
Methoden
function Execute: Boolean;
...
Execute öffnet das Dialogfeld zur Auswahl von Dateien und gibt True zurück,
wenn der Benutzer eine Datei ausgewählt und auf OK geklickt hat. Klickt der
Benutzer auf Abbrechen, liefert Execute False zurück.
Slide 39
Programmieren mit Prozeduren und Komponenten
39
KB
Memo-Stringliste laden
TOpenDialog
Attribute
property FileName: TFileName;
...
Ereignisse
...
Methoden
function Execute: Boolean;
...
procedure TForm1.BLadenQClick(Sender: TObject);
begin
if OpenDialog1.Execute then
MQuelltext.Lines.LoadFromFile(OpenDialog1.Filename);
end;
Caesar4 – mit Laden und Speichern
Slide 40
Programmieren mit Prozeduren und Komponenten
40
KB
Übungen – Aufgabe 4
Bauen Sie das Grundprogramm zur Caesar-Verschlüsselung schrittweise aus:
- Schlüsseleingabe über eine SpinEdit-Komponente
- Textein- und Ausgabe über Memofelder
- Vorbereitung des eingegebenen Textes (Sonderzeichen; Umlaute)
- Laden und Speichern von Texten.
Caesar4 – mit Laden und Speichern
Slide 41
Programmieren mit Prozeduren und Komponenten
41
KB
Übungen – Aufgabe 5
Um einen mit der Caesar-Methode kodierten Text zu entschlüsseln, kann man
auch wie folgt vorgehen: Man ermittelt, welcher Buchstabe im Geheimtext am
häufigsten vorkommt. Dieser Buchstabe ist mit großer Wahrscheinlichkeit die
Kodierung von ‚E‘.
Erweitern Sie das Caesar-Programm um die Möglichkeit, im Geheimtext die
Buchstabenhäufigkeiten zu bestimmen.
Caesar5 – mit Statistik
Slide 42
Programmieren mit Prozeduren und Komponenten
42
KB
Teil 3
Zusammenfassung:
Arbeiten mit Komponenten
Slide 43
Delphi-Hilfe
Programmieren mit Prozeduren und Komponenten
43
KB
TLabel
Hierarchie
Eigenschaften
Methoden
Ereignisse
TLabel ist ein nicht fensterorientiertes Steuerelement, mit dem Text in einem
Formular angezeigt werden kann. Sie können diesen Text als Beschriftung für
ein anderes Steuerelement verwenden und den Fokus an dieses Steuerelement
übergeben, sobald der Benutzer ein im Text enthaltenes Tastenkürzel eingibt.
Unit stdctrls
Beschreibung
Da die Komponente TLabel kein Nachkomme von TWinControl ist, besitzt sie
kein eigenes Fenster und kann keine direkten Eingaben von der Tastatur
empfangen. Wenn Sie in einem Formular ein Objekt benötigen, das nicht nur
aufgrund der Eingabe eines Tastenkürzels den Fokus an ein anderes
Steuerelement übergibt, sondern selbst auf Tastatureingaben antworten kann,
müssen Sie TStaticText verwenden.
Soll der Benutzer in einem Textanzeigeobjekt einen Bildlauf durchführen und
Änderungen vornehmen können, verwenden Sie eine TEdit-Komponente.
Slide 44
Programmieren mit Prozeduren und Komponenten
44
KB
Struktur von Komponenten
erbt von ...
TLabel
Attribute
...
Ereignisse
...
Methoden
...
Slide 45
Komponentenbeschreibung
Programmieren mit Prozeduren und Komponenten
45
KB
TLabel
Attribute
property Caption: TCaption // type TCaption = string;
...
Ereignisse
property OnClick: TNotifyEvent
...
Methoden
procedure SetBounds(ALeft, ATop, AWidth, AHeight: Integer)
...
Slide 46
Programmieren mit Prozeduren und Komponenten
46
KB
Schnittstellenbeschreibung
TControl.SetBounds
Die Methode SetBounds setzt die Eigenschaften Left, Top, Width und Height
gleichzeitig.
procedure SetBounds(ALeft, ATop, AWidth, AHeight: Integer); virtual;
Beschreibung
Mit der Methode SetBounds können Sie alle Eigenschaften des umgebenden
Rechtecks der Komponente gleichzeitig ändern. Sie können dazu auch die
Eigenschaften Left, Top, Width und Height einzeln setzen. Jedoch ist durch
SetBounds sichergestellt, daß das Steuerelement nicht nach jeder Wertzuweisung
neu gezeichnet werden muß.
Die Werte für die Eigenschaften Left, Top, Width und Height werden in den
Parametern ALeft, ATop, AWidth und AHeight übergeben.
Durch den Aufruf von SetBounds erhalten die Eigenschaften Left, Top, Width und
Height nicht notwendigerweise die angegebenen Werte. Die neuen Werte können
vor der Zuweisung durch AutoSize oder Constraints eingeschränkt und durch eine
Ereignisbehandlungsroutine für OnCanResize (oder OnConstrainedResize)
angepaßt werden. Nachdem die Eigenschaften Left, Top, Width und Height des
Steuerelements geändert wurden, generiert SetBounds ein OnResize-Ereignis.