Übungsaufgaben zu Delphi von M. Hühr einige Aufgaben zur Übung von Algorithmen leicht 1.1 Schreiben Sie ein Programm , mit dem man die Summe der Zahlen von 1 bis zu dem eingegebenen Wert erhält. 1.2 Schreiben Sie ein Programm ,mit dem man die Summe von geraden bzw. ungeraden Werten bis zu einem eingegebenen Wert berechnen kann. 1.3 Schreiben Sie ein Programm, bei dem man eine vorgegebene Anzahl von Werten eingibt, und das Proramm die Anzahl der Werte zählt ,die größer bzw. kleiner als einer sind ,als Schranke eingegebenen Wert. 1.4 Schreiben Sie ein Programm zur Zinseszinsrechnung, das den Endbetrag ausrechnet,wenn man die Einzahlung die am Anfang getätigt wird, den Zinssatz und die Laufzeit eingibt. mittel 2.1 Schreiben Sie ein Programm, mit dem man Werte der Größe nach sortiert ausgeben kann. 2.2 Schreiben Sie ein Programm, mit dem man die Primzahlen ausgeben kann. 2.3 Schreiben Sie ein Programm, bei dem man eine bestimmte Anzahl von Zahlen eingibt und von diesen den Durchschnitt berechnet und außerdem Minimum und Maximum ausgeben kann. schwerer 3.1 Schreiben sie ein Programm, bei dem man das Alter einer Person errechnen kann, indem man das Geburtsdatum eingibt. 3.2 Entwickeln Sie einen ganz einfachen Texteditor für Textdateien. Tip: für Rückgängigbutton folgenden Quelltext einfügen.(nur 1 Schritt möglich) with RichEdit1 do if HandleAllocated then SendMessage(Handle, EM_UNDO, 0, 0); unit Unit1; {Lösung zu Aufgabe 1.1} interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) Edit1: TEdit; Button1: TButton; Edit2: TEdit; Label1: TLabel; Label2: TLabel; Button2: TButton; procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); private { Private-Deklarationen } public { Public-Deklarationen } end; var Form1: TForm1; implementation {$R *.DFM} procedure TForm1.Button1Click(Sender: TObject); var i,eingabe,wert,code:integer; begin edit2.text:=''; val(edit1.text,eingabe,code); if code=0 then begin wert:=0; for i:=1 to eingabe do begin wert:=wert+i; edit2.text:=inttostr(wert); end; end else begin showmessage(edit1.text+' ist keine Zahl'); edit1.text:=''; edit1.setfocus; end; end; procedure TForm1.Button2Click(Sender: TObject); begin edit1.text:=''; edit2.text:=''; edit1.setfocus; end; end. unit Unit1; {Lösung zu Aufgabe 1.2} interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) Edit1: TEdit; Edit2: TEdit; Button1: TButton; Label1: TLabel; Edit3: TEdit; Label2: TLabel; Label3: TLabel; Button2: TButton; procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); private { Private-Deklarationen } public { Public-Deklarationen } end; var Form1: TForm1; implementation {$R *.DFM} procedure TForm1.Button1Click(Sender: TObject); var i,uwert,gwert,eingabe,code:integer; begin val(edit1.text,eingabe,code); if code<>0 then begin showmessage(edit1.text+' ist keine Zahl'); edit1.text:=''; edit1.setfocus; end; if code=0 then begin uwert:=0; gwert:=0; for i:=1 to eingabe do begin if (i mod 2)=0 then gwert:=gwert+i; if (i mod 2)<>0 then uwert:=uwert+i; edit2.text:=inttostr(gwert); edit3.text:=inttostr(uwert); end; end; end; procedure TForm1.Button2Click(Sender: TObject); begin edit1.text:=''; edit2.text:=''; edit3.text:=''; edit1.setfocus; end; end. unit Unit1; {mögliche Lösung zu Übung 2.2- mittels Einzelzahlprüfung} interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) Edit1: TEdit; Button1: TButton; Label1: TLabel; procedure Button1Click(Sender: TObject); procedure FormPaint(Sender: TObject); private { Private-Deklarationen } public { Public-Deklarationen } end; var Form1: TForm1; i,j:integer; a,b,code:integer; Zahl:integer; implementation {$R *.DFM} procedure TForm1.Button1Click(Sender: TObject); begin val(edit1.text,zahl,code); b:=0; if code=0 then if zahl>0 then begin begin for i:=zahl downto 1 do begin a:=zahl mod i; if a=0 then b:=b+1; end; if b<=2 then showmessage(edit1.text+ ' ist eine Primzahl') else showmessage(edit1.text+ ' ist keine Primzahl'); edit1.text:=''; edit1.setfocus; end; end else {code >0} showmessage(edit1.text+' ist keine natürliche Zahl, oder <= 0 '); edit1.text:=''; edit1.setfocus; end; procedure TForm1.FormPaint(Sender: TObject); begin edit1.setfocus; end; end. Beispiele Übungsaufgabe 1 - Digitaluhr Zuerst plaziert man einen Timer und ein Label auf das Fenster. Dann klickt man den Timer an und fügt im Quelltext folgendes ein. Label1.caption:=timetostr(time); Man kann dann noch das Aussehen ändern. Um eine optimale Schrifthöhe und Ausrichtung des Labels zu erreichen, wählt man im Objektmanager Label1 aus oder aktiviert es durch Anklicken im Entwurf. Den Wert für Caption ändert man in 00.00.00 . Den Wert für Font kann man jetzt besser bestimmen. Wenn ein Plus vor einer Eigenschaft steht kann man durch Anklicken des Pluszeichens die einzelnen Eigenschaften dieser Eigenschaft anzeigen lassen. Man ändert die Größe der Schrift durch Verändern vom Wert Size. Um der Anwendung einen eigenen Namen zu geben, ändert man die Eigenschaft von Form1.caption.Um zu erreichen, daß das Fenster die Größe behält und nicht maximiert werden soll, verändert man die Eigenschaft BorderIcons.bimaximeze auf false. Ein eigenes Icon für das Fenster kann man mit der Eigenschaft Icon laden. Nach dem Starten des Programms erscheint solch ein Fenster. Übungsaufgabe 2 : Videoplayer benötigte Elemente Zuerst werden die benötigten Objekte auf dem Formular plaziert. Bei MainMenu und OpenDialog ist die Lage auf dem Formular nicht wichtig , da sie bei der Laufzeit nicht zu sehen sind. Dann klickt man den MainMenu1-Button an. Es erscheint ein weiteres Formular. Man verändert im Objektmanager die Eigenschaft von MenuItem1.Caption zu &Datei. Das & -Zeichen bewirkt, daß der nachfolgende Buchstabe unterstrichen wird und man mit ALT + dem unterstrichenen Buchstaben die Funktion zur Laufzeit aufrufen kann. Genauso verfährt man mit den darunterliegenden Feldern. Klickt man das Feld von Beenden an erscheint der Quelltexteditor. An der Stelle wird folgender Quelltext eingefügt: procedure Tform1.Beenden1Click(Sender:Tobject); begin close; end; end. Für das Öffnen der Datei fügt man folgenden Quelltext ein ProcedureTForm1.Videooffnen1click(sender:TObject); begin if OpenDialog1.Execute then begin MediaPlayer1.DeviceType:=dtAutoSelect; MediaPlayer1.Filename:=OpenDialog1.FileName; MediaPlayer1.open; end; end; Anschließend verändert man die Eigenschaften der Objekte im Objektmanager: Form1: Caption: Videoplayer Dies bewirkt ,daß das Fenster einen eigenen Namen bekommt. Panel1: Caption: (einfach den Inhalt im Objektmanager löschen) Panel1 soll als Abspielfläche dienen , da stört ein Name. Mediaplayer1: Display : Label1 Man klickt auf das Pluszeichen vor VisibleButton und das Menu wird erweitert. btRecord : false btEject : false Opendialog1: Wenn man auf Filter klickt erscheint nebenstehender Dialog. In die erste Spalte schreibt man die Bezeichnung der Dateiart und in die zweite die Dateiextension. In unserem Programm ist es *.AVI. Um das Programm zu vervollständigen , öffnet man im Menu Projekt|Projektoptionen und lädt sich ein Icon für die Anwendung. Man vergibt auch einen Namen für die Anwendung. Es können selbständig noch weitere Änderungen gemacht werden. Wenn das Programm richtig erstellt wurde, sieht es so aus: Übungsaufgabe 3:Fileviewer 1. Schritt: Zuerst plaziert man ein Panel auf dem Formular und stellt die Eigenschaft Align auf alTop. Dann plaziert man ein weiteres Panel und stellt die Eigenschaft Align auf alBottom. Anschließend ein Memofeld in die Mitte gesetzt mit der Eigenschaft Align - alClient. Ein Button wird auf dem oberen Panel plaziert und die Eigenschaft von Caption auf Öffnen geändert. Einen Opendialog braucht man auch ,sowie eine Listbox, die man auf die untere Panel setzt und dann die Eigenschaft auf alClient ändert. 2. Schritt: Man klickt dann auf den Button und der Quelltexteditor erscheint. Dort ergänzt man die Prozedure so: procedure TForm1.Button1Click(Sender: TObject); begin if opendialog1.execute then begin if opendialog1.filename<>''then begin memo1.lines.loadfromfile(opendialog1.filename); listbox1.items.add(opendialog1.filename); end; end; end; Das klickt man die Listbox und schreibt folgende Prozedur : procedure TForm1.ListBox1Click(Sender: TObject); begin memo1.lines.loadfromfile(listbox1.items[listbox1.itemindex]); end; Um das Memofeld zu leeren , drückt man im Quelltexteditor beim Object ListBox1bei Lines auf die 3 Punkte hinter Tstrings. Dadurch wird der Stringlisteneditor gestartet. Dort löscht man Memo1. Dann löscht man die Eigenschaft Caption der oberen Panel. Mit dem Opendialogfilter verfährt man so wie in Übung 2 beschrieben. Die Überschrift und weitere Eigenschaften ,die man haben möchte kann man jetzt noch verändern. Wenn man auf einen Eintrag in der Listbox anklickt, wird die früher schon einmal geladene Datei angezeigt. Übungsaufgabe 4: BMP-Bildbetrachter 1. Schritt Am Anfang plaziert man einen Panel auf die linke Seite ,löscht den Wert von Caption und stellt Allign auf alLeft. Darauf platziert man eine DriveCombobox, eine DirectoryListBox und eine Filelistbox. Rechts platziert wird eine Image-Komponente und stellt die Eigenschat Allign auf alClient ,Autosize auf True und Center auch auf True. 2. Schritt Dann klickt man im Objektinspektor bei DriveComboBox1 den Eintrag DirList an und wählt DirectoryListbox1. Bei der DirectoryListBox1 wählt man für FileList den Eintrag FileListBox1aus. Bei der FileListBox1 verändert man den Eintrag bei Mask auf *.bmp (es werden dann nur Bitmaps angezeigt). Der einzige Programmcode lautet für die FileListbox nur: procedure TForm1.FileListBox1Change(Sender: TObject); begin if filelistbox1.filename<>''then image1.picture.loadfromfile(filelistbox1.filename); end; Man kann das Programm nach eigenem Geschmack weiter gestalten. Übungsaufgabe 5 - Laufwerkseigenschaften Zuerst plaziert man 3 Labels auf dem Formular. Dann nimmt man eine Gauge ,die sich bei Delphi 2 auf der Beispiele-Seite befindet und plaziert sie auf dem Formular. Anschließend verändert man die Eigenschaften der Gauge Backcolor auf clGreen und Forecolor auf clRed. Um die Form der Gauge zu verändern , stellt man die Eigenschaft von Kind auf gkPie. Wenn man das getan hat ,schreibt man folgende Prozedur : procedure TForm1.FormCreate(Sender: TObject); var groesse:integer; Frei:integer; belegt:integer; begin groesse:=disksize(3)div 1024; frei:=diskfree(3)div 1024; belegt:=groesse-frei; gauge1.progress:=round(belegt/groesse*100); label1.caption:='Laufwerkskapazität : '+inttostr(groesse div 1024)+' Mb'; label2.caption:='belegter Speicherplatz : '+inttostr(belegt div 1024)+' Mb = '+inttostr(round(belegt/groesse*100))+'%'; label3.caption:='freier Speicherplatz : '+inttostr(frei div 1024)+' Mb = '+inttostr(100-round(belegt/groesse*100))+'%'; end; Anschließend kann man noch die Eigenschaft von Form1 verändern ,um das Aussehen des Programms zu verbessern. Sollte Gauge nicht installiert sein ,nimmt man eine andere Komponente,die eine graphische Darstellung ermöglicht. Übungsaufgabe 6 - Komponenten zur Laufzeit erstellen Diese Prozedur ist ein Beispiel für das Erstellen von Komponenten zur Laufzeit. Man schreibt folgenden Quelltext für die Create-Prozedure von Form1; procedure TForm1.FormCreate(Sender: TObject); begin with tlabel.create(self) do begin height:=25; width:=75; name:='label1'; top:=30; left:=20; caption:='Geben sie ein Wort ein :'; parent:=form1; end; with tedit.create(self)do begin top:=30; left:=150; name:='edit1'; parent:=form1; text:=''; end; with tbutton.create(self) do begin top:=30; left:=300; parent:=form1; caption:='OK'; end; end; Um die Komponenten zu entfernen nimmt man FREE. Bsp: Button1.Free; Button1.Destroy würde auch gehen ,Button1.Free ist aber besser. Übungsaufgabe 7 - Graphische Darstellung Dies ist ein Beispiel für das Erzeugen von graphischen Objekten. Hierbei wird die Eigenschaft Canvas benutzt, die bei einigen Objekten vorhanden ist. Bei TImage ist es auch möglich ,das erzeugte Bild als Datei abzuspeichern oder zu kopieren. Um graphische Objekte anzuzeigen, plaziert man zuerst ein Timage auf dem Formular und stellt dessen Eigenschaft auf alclient: Um Objekte bei der Erzeugung des Fensters zu erzeugen, schreibt man folgenden Quelltext für die Prozedur Formcreate ,um verschiedene Objekte zu erstellen: procedure TForm1.FormCreate(Sender: TObject); Als erstes definiert man die Varialble Ecken ,die für die Ecken des Polygons da ist. var ecken:array[1..5]of Tpoint; begin Zuerst wird ein Fünfeck definiert: with image1.canvas do begin Wir nehmen als Füllfarbe einen hellen Blauton: brush.color:=claqua; Jetzt werden die Ecken des Fünfecks erzeugt: ecken[1].x:=10; ecken[1].y:=10; ecken[2].x:=10; ecken[2].y:=100; ecken[3].x:=60; ecken[3].y:=100; ecken[4].x:=200; ecken[4].y:=70; ecken[5].x:=10; ecken[5].y:=10; Und zum Schluß wird das Fünfeck gezeichnet: polygon(ecken); end; Als nächstes malen wir eine Linie auf das Image: with image1.canvas do begin Die Breite der Linie wird vergrößert: pen.width:=4; Die Farbe der Linie wird auf blau geändert: pen.color:=clblue; Der Startpunk der Linie wird definiert: moveto(20,200); Die Linie wird gezeichnet: lineto(100,100); end; Als nächstes wird ein Rechteck erzeugt: with image1.canvas do begin pen.width:=1; Das Rechteck erhält keinen Rand und wird rot gefüllt: pen.color:=clnone; brush.color:=clred; Um das Rechteck zu erzeugen ,definiert man den Punkt oben links mit den ersten beiden Zahlen und den Punkt unten rechts mit den letzten beiden Zahlen.. rectangle(110,120,130,140); end; Als letztes wird ein Kreis erzeugt. Kreise werden in Quadraten definiert, deren Breite und Höhe den Radius darstellen . Wenn man ein Rechteck dazu nimmt, kann man eine Elypse erzeugen. with image1.canvas do begin pen.color:=clblack; brush.color:=clblue; Definieren der Eckpunkte des Quadrates in dem der Kreis erzeugt wird: ellipse(200,200,250,250); end; end; Diese Objekte werden mit vorangehendem Quelltext selbstständig erzeugt: Beispiel zum Benutzen eines Canvas Wenn man auf ein Image eine Freihandlinie mittels Cursorposition zeichnen will, kann dazu folgedendes Beispiel verwenden: Man muß erst eine globale Variable deklarieren. In diesem Fall heißt sie Malen und der zugewiesene Wert zeigt an, ob man auf das Image (namens Bild) zeichnen kann. ... var malen:boolean; ... Die erste Prozedur setzt Malen auf True ,das heißt , daß man zeichnen kann. Der Anfang der Freihandlinie ist die aktuelle Position. ... procedure Tblatt.bildMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin with bild.canvas do begin moveto(x,y); malen:=true; end; end; ... Wenn man jetzt den Cursor mit gedrückter Maustaste über das Image verschiebt, wird eine Freihandlinie erzeugt. ... procedure Tblatt.bildMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); begin with bild.canvas do begin if malen=true then lineto(x,y); end; end; ... Wenn man die Maustaste losläßt, wird Malen auf False gesetzt ,so daß nicht mehr gezeichnet werden kann. ... procedure Tblatt.bildMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin malen:=false; end; ...