Die Präsentation wird geladen. Bitte warten

Die Präsentation wird geladen. Bitte warten

Programmieren mit Prozeduren und Delphi-Komponenten Klaus Becker (2002)

Ähnliche Präsentationen


Präsentation zum Thema: "Programmieren mit Prozeduren und Delphi-Komponenten Klaus Becker (2002)"—  Präsentation transkript:

1 Programmieren mit Prozeduren und Delphi-Komponenten Klaus Becker (2002)

2 KB Programmieren mit Prozeduren und Komponenten 2 Salve Caesar PYLZFOWBN, QCY BUVN CBL GYCHY AYBYCGMWBLCZN YHNTCZZYLN! VDOYH FDHVDU!

3 KB Programmieren mit Prozeduren und Komponenten 3 Teil 1 Verarbeitung von Zeichenketten Prozedurkonzept

4 KB Programmieren mit Prozeduren und Komponenten 4 Caesar-Chiffrierung 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 Klartextalphabet Geheimtextalphabet Schlüssel: 3 Klartext: ASTERIX Geheimtext: DVWHULA

5 KB Programmieren mit Prozeduren und Komponenten 5 Problembeschreibung 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 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. -...

6 KB Programmieren mit Prozeduren und Komponenten 6 Benutzungsoberfläche EGeheimtext: TEdit EQuelltext: TEdit BEntschluesseln: TButton PTitel: TPanel ESchluessel: TEdit GBQuelltext: TGroupBox GBGeheimtext: TGroupBox GBSchluessel: TGroupBox GBChiffre: TGroupBox

7 KB Programmieren mit Prozeduren und Komponenten 7 Datenmodell / Datenverarbeitung 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 type tSchluessel = 0..25; var Quelltext : string; // z. B.: 'ASTERIX' Geheimtext : string; // z. B.: 'DVWHULA' Schluessel : tSchluessel; // z. B.: 3

8 KB Programmieren mit Prozeduren und Komponenten 8 Exkurs: Zeichen Zeichen werden in Delphi / Pascal mit Hilfe des Datentyps char beschrieben. Die zulässigen Zeichen werden durch den ASCII-Code festgelegt. CodeZeichen 0NUL... 65A 66B... 90Z... 97a 98b z... (De)Kodieroperationen: ord: char {0;...; 255} ord(´A´) 65 chr: {0;...; 255} char chr(65) ´A´

9 KB 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); // n 6

10 KB Programmieren mit Prozeduren und Komponenten 10 Verschlüsselungsalgorithmus

11 KB Programmieren mit Prozeduren und Komponenten 11 Übungen – Aufgabe 1 Ergänzen Sie zunächst das Programm zur Caesar-Chiffrierung. 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. Caesar0 – Grundprogramm Caesar1 – mit Textvorbereitung

12 KB Programmieren mit Prozeduren und Komponenten 12 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

13 KB Programmieren mit Prozeduren und Komponenten 13 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.

14 KB Programmieren mit Prozeduren und Komponenten 14 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 5 Position := Pos('Hi', 'Delphibuch') // Position 5 Position := Pos('ihi', 'Delphibuch') // Position 0

15 KB Programmieren mit Prozeduren und Komponenten 15 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'}

16 KB Programmieren mit Prozeduren und Komponenten 16 Parameter procedure Delete(var S: string; Index, Count: integer); Beispiel: {Z: ['Baumschule']} Delete(Z, 5, 6) {Z: ['Baum']} Delete var S: string Index: integer Count: integer Z 5 6 Import/Export-Situation Import-Situation

17 KB Programmieren mit Prozeduren und Komponenten 17 Parameterübergabemechanismen {Z: ['Baumschule']} Delete [ ]:S [5]:Index [6]:Count 5 6 Referenzbildung Wertübergabe Delete(Z, 5, 6) {Z: ['Baum']} Z: ['Baumschule'] Adresse Wert Delete [ ]:S [ ]:Index [ ]:Count 5 6 Z: ['Baum']

18 KB Programmieren mit Prozeduren und Komponenten 18 Parameterübergabemechanismen Delete [ ]:S [5]:Index [6]:Count 5 6 Referenzbildung Wertübergabe Z: ['Baumschule'] Adresse Wert call-by-value: Der Wert des aktuellen Parameters wird an den Werteparameter übergeben. Referenzparameter Werteparameter call-by-reference: Es wird eine Referenz zwischen dem aktuellen Parameter und dem Referenzparameter erzeugt. Delete(Z, 5, 6) Prozeduraufruf: aktuelle Parameter Übergabesituation: Übergabemechanismen:

19 KB Programmieren mit Prozeduren und Komponenten 19 Datenaustauschsituationen P xt Daten-Import:Der aktuelle Parameter kann ein Term sein. Der Wert des Terms wird durch call-by-value an den Werteparameter übergeben. P var xy Daten-Export:Der aktuelle Parameter muss eine Variable sein. Der Referenzparameter wird durch call-by-reference an den aktuellen Parameter gebunden. P var xy Daten-Transport:Der aktuelle Parameter muss eine Variable sein. Der Referenzparameter wird durch call-by-reference an den aktuellen Parameter gebunden.

20 KB Programmieren mit Prozeduren und Komponenten 20 Ü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 Stringverarbeitungs- operationen (Delete, Insert,...). Gehen Sie davon aus, dass das zu ersetzende Zeichen nicht in der neuen Zeichenkette vorkommt. Welche Schwierigkeiten könnten Sich andernfalls ergeben?

21 KB Programmieren mit Prozeduren und Komponenten 21 Ü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.

22 KB Programmieren mit Prozeduren und Komponenten 22 Aufgabe 2 - Lösungsvorschlag Ersetze c: char neu: string var Text: string 'ß' 'SS' Hilf Datenaustausch: 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']} procedure Ersetze(c: char; neu: string; var Text: string); Deklaration:

23 KB Programmieren mit Prozeduren und Komponenten 23 Aufgabe 2 - Lösungsvorschlag 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; Bemerkungen: Der Algorithmus ist ausbaufähig: c: char s: string. Er ist allerdings nur korrekt, falls c nicht in neu vorkommt.

24 KB Programmieren mit Prozeduren und Komponenten 24 Aufgabe 2 - Lösungsvorschlag 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.

25 KB Programmieren mit Prozeduren und Komponenten 25 Aufgabe 3 - Lösungsvorschlag Datenaustausch: verschluesseln QText: string S: integer var GText: string Quelltext Schluessel Geheimtext entschluesseln var QText: string S: integer GText: string Quelltext Schluessel Geheimtext Caesar1 – mit Parameterübergabe

26 KB Programmieren mit Prozeduren und Komponenten 26 Schnittstellen 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. 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.

27 KB Programmieren mit Prozeduren und Komponenten 27 Teil 2 Komponenten

28 KB Programmieren mit Prozeduren und Komponenten 28 Laufzeitfehler 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 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

29 KB Programmieren mit Prozeduren und Komponenten 29 TSpinEdit-Komponente SpEdSchluessel: TSpinEdit Attribute MinValue : 0 MaxValue : 25 Value: 3... Ereignisse OnChange: SpEdSchluesselChange... Methoden... procedure TForm1.SpEdSchluesselChange(Sender: TObject); begin Schluessel := SpEdSchluessel.Value; end; Caesar3 – Grundprogramm mit...

30 KB Programmieren mit Prozeduren und Komponenten 30 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...

31 KB Programmieren mit Prozeduren und Komponenten 31 TMemo-Komponente 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. 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.

32 KB Programmieren mit Prozeduren und Komponenten 32 Klasse TMemo TMemo Attribute property Lines: TStrings; property ScrollBars: TScrollStyle;... Ereignisse... Methoden... type TScrollStyle = (ssNone, ssHorizontal, ssVertical, ssBoth)

33 KB Programmieren mit Prozeduren und Komponenten 33 Klasse TStrings 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);...

34 KB Programmieren mit Prozeduren und Komponenten 34 Stringlisten 'Hallo Inger' 'Wie geht es Dir?' 0 1 'Ich hoffe gut.' 'Viele Grüße von...' 2 3 var L: TStrings; i: integer;... L.Strings[0] := L.Strings[0] + '!'; for i := 0 to L.Count-1 do L.Strings[i] := 'Hallo';

35 KB Programmieren mit Prozeduren und Komponenten 35 Verarbeitung von Stringlisten 'Hallo Inger' 'Wie geht es Dir?' 0 1 'Ich hoffe gut.' 'Viele Grüße von...' 2 3 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); - lädt eine Liste aus einer Datei / speichert eine Liste in eine Datei

36 KB Programmieren mit Prozeduren und Komponenten 36 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; Caesar4 – Texteingabe über Memofeld

37 KB Programmieren mit Prozeduren und Komponenten 37 Laden und Speichern Problem: Quell- und Geheimtext sollen aus einer Datei geladen bzw. in einer Datei gespeichert werden können. Problem: Quell- und Geheimtext sollen aus einer Datei geladen bzw. in einer Datei gespeichert werden können.

38 KB Programmieren mit Prozeduren und Komponenten 38 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.

39 KB Programmieren mit Prozeduren und Komponenten 39 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

40 KB Programmieren mit Prozeduren und Komponenten 40 Übungen – Aufgabe 4 Caesar4 – mit Laden und Speichern 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.

41 KB Programmieren mit Prozeduren und Komponenten 41 Ü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

42 KB Programmieren mit Prozeduren und Komponenten 42 Teil 3 Zusammenfassung: Arbeiten mit Komponenten

43 KB Programmieren mit Prozeduren und Komponenten 43 Delphi-Hilfe TLabel HierarchieEigenschaftenMethodenEreignisse 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.

44 KB Programmieren mit Prozeduren und Komponenten 44 Struktur von Komponenten TLabel Attribute... Ereignisse... Methoden... erbt von...

45 KB Programmieren mit Prozeduren und Komponenten 45 Komponentenbeschreibung TLabel Attribute property Caption: TCaption // type TCaption = string;... Ereignisse property OnClick: TNotifyEvent... Methoden procedure SetBounds(ALeft, ATop, AWidth, AHeight: Integer)...

46 KB Programmieren mit Prozeduren und Komponenten 46 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.


Herunterladen ppt "Programmieren mit Prozeduren und Delphi-Komponenten Klaus Becker (2002)"

Ähnliche Präsentationen


Google-Anzeigen