delphaufg

Werbung
Ü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;
...
Herunterladen