Powerpoint-Präsentation

Download Report

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.