Dreistein
Hilfe zur Programmierung mit Delphi im Informatikunterricht
if-Bedingungen
Posted on 21.02.2006 at 14:10 - 0 Kommentare - Link
Ok, nun gehts weiter mit einer elementaren Funktion, den Bedingungen. Und es gibt nur eine echte, wahre, die if. Man nimmt sie, um bestimmte Fälle zu überprüfen. Die Bedingung wird mit einem if eingeleitet. Anschließen schreibt man seine Bedingung. Sie kann a = 5 oder b > 6 lauten, ABER es ist immer besser, wenn man die Zeichen > und < verwendet, da durch Rundungsfehler eventuell Fälle eintreten können, die dann einfach abweichen. Nach der Bedingung erfolgt ein then und nun kann man aufschreiben, was passieren soll. Hat man mehr als eine Anweisung, klammert man das ganze in einem begin end.
Zum Beispiel
...
if Bedinung 1 then Anweisung 1; //Formal
...
...
if a > 5 then a := 0; //Beispiel
...
Weitere Fälle
Möchte man eine Bedingung von mehreren Fällen abhängig machen, setzt man die Einzelbedingungen in Klammern und verbindet sie mit einem and.
Zum Beispiel
...
if (Bedingung 1) and (Bedingung 2) then Anweisung1;
...
Hat man 2 Bedingungen und es muss nur eine eintreffen, klammert man wieder dieEinzelbedingungen und verbindet diesmal mit einem or.
Zum Beispiel
...
if (Bedingung 1) or (Bedingung 2) then Anweisung1;
...
Als letztes noch erwähne ich <> was ungleich heißt, also alles außer dem, was dahinter steht.
Erstellen einer einfachen Datenbankanwendung
Posted on 3.02.2006 at 13:10 - 0 Kommentare - Link
Dieser Abschnitt zeigt, wie man auf die imUnterricht bearbeitete Weise Zugriff auf eine Datenbank hat. (Es musseine Datenbank im Programmverzeichnis vorhanden sein).
1. Zuerst fügt man aus dem Menü Datenzugriff einen Table ein. (Dieser ist nur ein kleines Quadrat mit einem Symbol drin, das aber später nicht zu sehen ist).
2. Man klickt auf den gerade erstellten Table. In den Einstellungen wählt man bei "TableName" den Namen der Datenbank
und bei "Active" den Wert "true" aus.
3. Nun erstellt man ebenfalls aus dem Menü Datenzugriff eine DataSource. (Auch nur ein kleines Feld).
4. In den Einstellungen der DataSource wählt man bei "DataSet" den Namen des gerade erstellten Tables aus.
5. Um die Daten nun auszulesen und zu ändern erstellt man aus dem Menü Datensteuerung ein DBEdit aus und positioniert es an der gewünschten Stelle. In den Einstellungen des DBEdit wählt man für DataSource den Namen der vorher erstellten Datasource aus. Im Einstellungsfeld DataField wählt man den Name des entsprechenden Datenfeldes in der Datenbank aus.
6. Punkt 5 für alle Daten in der Datenbank wiederholen.
7. Um nun von Datensatz zu Datensatz zu springen, muss man aus dem Menü Datensteuerung noch einen DBNavigator einfügen. In den Einstellungen des Navigator wählt man nun noch unter DataSource die oben ertstellte DataSource aus.
Nun sollte eure Datenbank funktioniereb, wobei wir manchmal eine Menge Probleme beim öffnen der Datenbank hatten.
Bedingungen
Posted on 24.01.2006 at 13:26 - 0 Kommentare - Link
Jaja, diesen Artikel erst jetzt? Ich schäm mich auch^^
So, hier wird ein sehr wichtiger Teil beschrieben, den ohne die Bedingungen läuft gar nix. Keine Rekursion würde sich schließen, das Programm könnte durch falsche Tasteneingabe abstürzen, alles möglich könnte passieren, wenn man keine Möglichkeit hat, etwas zu überprüfen.
Deshalb werden jetzt die 2 wichtigsten vorgestellt.
Einführung Datenbank
Posted on 23.01.2006 at 21:45 - 0 Kommentare - Link
Kurze Begriffserklärung
DB - DataBase - Datenbank
Sammlung von Daten die zusammenhängen und langzeitfristig existieen
DBMS - DataBankManagementSystem - Datenbankmanagementsystem
Sammeln von Daten zur einheitlichen Definition und Effizienten benutzen von Datenbanken.
BDE - BorlandDatabaseEngine
ODBC - OpenDatabaseConnectivity - Offene Datenbank-Verbindungsfähigkeit)
Externes Datenmodul
aus der Sicht des Anwenders
Konzeptionelles Datenmodul
aus der Sicht des Administrators
Internes Datenmodul
aus der Sicht des Computers
Architektur eines DBMS
- Jede Anwednung kennt nur einen Teil der Daten (logische Datenunabhängigkeit)
- Physikalische Speicherung spielt für die Anwendung keine Rolle (physikalische Datenunabhängigkeit)
- Mehrbenutzerbetrieb
- Datenschutz (Anwender können nur entsprechend ihren Zugriffsberechtigungen Daten sehen und ändern)
Relationale Datenbank
- eine Relation ist eine zweidimensionelle Tabelle
- eine Zeile (Datensatz) enthält Felder
- die Reihenfolge der Zeileninhalte innerhalb der Tabele hat keine Bedeutung
- eine relationelle Datenbank besteht aus mehreren Tabellen
- jedes Datenfeld (Spalte) kann als Suchbegriff benutzt werden
Lösung: Die Rubel
Posted on 20.01.2006 at 11:48 - 0 Kommentare - Link
Dies ist eines meiner ersten Programme, deshalb muss die Lösung nicht optimal sein. Aber es läuft einwandfrei, wie man feststellt, gibt es aber noch keinen Abfang für negative Zahlen. Aber das wird demnächst nachgeholt. Textformatierung wird demnächst auch irgendwann mal kommen^^
Quelltext
procedure TForm1.Button1Click(Sender: TObject); var a, b, d, g:Integer; begin g := strtoint(edit1.Text); b := 0; d := g div 13; a := g mod 13; if a = 0 then edit2.text := Inttostr(d) else repeat if a >= 8 then begin b := b+1; a := a-8; end; if a >= 8 then begin b := b+1; a := a-8; end; if (d*13+b*8) < g then begin d := d-1; a := a + 13; end; until (d*13+b*8 = g); edit2.text := Inttostr(d); edit3.text := Inttostr(b); end;
Die Türme von Hanoi
Posted on 20.01.2006 at 11:33 - 0 Kommentare - Link
Die Türme von Hanoi sind eine Rätselaufgabe, bei denen es darum geht, von einem Stapel die darauf befindlich Scheiben auf einen anderen umzuschichten. Dazu darf man immer nur eine Scheibe bewegen und es darf auch immer nur eine kleinere auf einer größeren liegen. Dieses Problem lässt sich auf 2 Arten lösen. Der rekursive Ansatz wird hier beschrieben, für die iterative Möglichkeit (es geht!!) hab ich noch keinen Quelltext geschrieben. Da man diese Aufgabe unterschiedlich lösen kann, werde ich jetzt erstmal zwei mögliche Lösungen vorstellen:
Quelltext für Textausgabe
procedure TForm1.Button1Click(Sender: TObject); procedure hanoi(anzahl, a, b, c:Integer); begin if(anzahl = 1) then begin ListBox1.Items.Add('Scheibe vom Turm' + inttostr(a) + ' nach Turm ' + inttostr(b)); end else begin hanoi(anzahl - 1, a, c, b); ListBox1.Items.Add('Scheibe vom Turm' + inttostr(a) + ' nach Turm ' + inttostr(b)); hanoi(anzahl - 1, c, b, a); end; end;
begin Listbox1.clear; hanoi(strtoint(edit1.Text),1,3,2); Label1.caption := inttostr(listbox1.Items.count); end;
--------------------------------------------------------------------------------------------------------
Quelltext optische Anzeige in Listboxen
procedure TForm1.Button1Click(Sender: TObject); // Erstellt den ersten Turm var i: Integer; begin Listbox1.Clear; Listbox2.Clear; Listbox3.Clear; Listbox4.Clear; for i := 1 to strtoint(edit1.text) do begin Listbox1.Items.Add(inttostr(i)); end; end;
procedure TForm1.Button2Click(Sender: TObject); procedure verschieben(a,b:Integer); // von LB a nach b var temp :String; begin // lesen case a of 1: begin temp := Listbox1.Items[0]; Listbox1.Items.Delete(0); end; 2: begin temp := Listbox2.Items[0]; Listbox2.Items.Delete(0); end; 3: begin temp := Listbox3.Items[0]; Listbox3.Items.Delete(0); end; end; // schreiben case b of 1: begin Listbox1.Items.Insert(0,temp); end; 2: begin Listbox2.Items.Insert(0,temp); end; 3: begin Listbox3.Items.Insert(0,temp); end; end; // Ausgabe der Aktion in LB4 ListBox4.Items.Add('Scheibe ' + temp + ' von ' + inttostr(a) + ' --> ' + inttostr(b)); end;
function laenge(a:Integer):Integer; // Abfrage der Laenge begin case a of 1: Result := Listbox1.Items.Count; 2: Result := Listbox2.Items.Count; 3: Result := Listbox3.Items.Count; end; end;
procedure hanoi(anzahl, a, b, c:Integer); // Anzahl, Ausgangspos. / Zielpos. / Hilfsstab begin if(anzahl = 1) then begin verschieben(a, b); end else begin hanoi(anzahl - 1, a, c, b); verschieben(a, b); hanoi(anzahl - 1, c, b, a); end; end; begin if(laenge(1) > 0) then hanoi(laenge(1), 1, 3, 2) else ShowMessage('Fehler: Auf dem linken Stab liegen keine Scheiben!!); Label1.Caption := inttostr(Listbox4.Items.Count) + ' Züge'; end;
Primzahlenklick
Posted on 18.01.2006 at 20:43 - 0 Kommentare - Link
So, ich zeige euch jetzt mal meine Lösung, es muss nicht die Beste sein, kann es aber^^
Das schöne daran ist, das man nichts auf die Form packen muss, für alle, die aber den Quelltext rein abschreiben werden, wird es eine Fehlermeldung geben. Unter uses wird StdCtrls fehlen, einfach dahin schreiben oder irgendeine Komponente auf die Form packen und das Projekt starten, dann steht es auch da...
Quelltext
var Form1: TForm1; F: Tedit;
implementation
{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject); var i, j, h: Integer; begin h := 0; for j := 0 to 19 do for i := 0 to 19 do begin inc(h); f := Tedit.create(self); f.parent:= self; f.Name := 'f'+inttostr(h); f.readonly := true; f.SetBounds(10+i*25,10+j*20,30,10); f.Text := inttostr(h); f.onclick := click; end; end;
procedure TForm1.click(sender: Tobject); var i, j: Integer; begin f := Tedit(sender); i := strtoint(f.Text); if i <> 1 then begin j := i; while j < 400 do begin j := j+i; f.Color := clred; if j <= 400 then begin TEdit(findcomponent('f'+inttostr(j))).enabled := false; TEdit(findcomponent('f'+inttostr(j))).color := clbtnface; end; end; end else TEdit(findcomponent('f1')).color := clred; end;
Der Quellcode spricht denk ich für sich selbst
Rekursiv Zeichnen
Posted on 11.01.2006 at 15:00 - 0 Kommentare - Link
Mit Hilfe von Rekursionen kann man sehr interessante Figuren zeichnen.
Das folgende Programm kann verschiedene Rekursive Bilder zeichnen.
Folgende Bilder sind möglich:
Die Funktionen findet man teilweise auch auf Dreistein unter den Rekursionen.
Außerdem hat das Programm Knöpfe um die Turtle an und aus zu schalten oder diese an eine andere Position zu setzen. Eine Trackbar ermöglich das Einstellen der Liniendicke und zwei weitere Schaltflächen dienen zum verändern der Zeichen- sowie der Hintergrundfarbe.
Download des Programms als zip-Datei
Aufgabe: Die Rubel
Posted on 11.01.2006 at 12:03 - 0 Kommentare - Link
Schreibe ein Programm mit
-
3 Editfeldern
-
3 Labeln und
-
1 Button
wo man einen beliebigen positiven Geldbetrag in Edit1 eingibt und man in den anderen beiden Editfeldern die Zahlmethode erhält. Dabei ist zu beachten, dass man nur 8 und 13 Rubelstücke zur Verfügung hat. Mit anderen Worten: Schreibe ein Programm, das jede beliebige Zahl aus einer Summe von 8 und 13 bildet. Es geht!!!
(Man kann auch negative Zahlen addieren)
Viel Spass
Farn
Posted on 11.01.2006 at 11:40 - 0 Kommentare - Link
Eine sehr hübsche Rekursion, die ihrem Namen diesmal auch gerecht wird. Als erstes erstmal ein Bildchen davon:

Größe 45, Winkel 45, Tiefe 0,5
Sieht doch agnz echt aus, oder? Doch nun erstmal den Quelltext...
Quelltext
procedure TForm1.Button1Click(Sender: TObject); procedure farn(laenge, winkel, tiefe: Real); begin if laenge > tiefe then with turtle1 do begin fd(laenge/10); lt(winkel); farn(laenge * 0.35, -winkel, tiefe); rt(winkel+180); fd(laenge - (laenge/10)); rt(winkel); farn(laenge * 0.27,winkel, tiefe); lt(180 + winkel + winkel/20); farn(laenge*0.85, winkel, tiefe); rt(winkel/20); fd(laenge) end else turtle1.rt(180); end; begin turtle1.ht; turtle1.cs; turtle1.home; farn(strtoint(edit1.text),strtoint(edit2.text),strtofloat(edit3.text)); end;
Datenbanken
Posted on 9.01.2006 at 20:27 - 0 Kommentare - Link
So, nun wollen wir uns mal mit den Datenbanken beschäftigen. Jeder kennt sie, ich stell sie trotzdem nochmal vor.
Eine Datenbank sammelt Daten. Wer hätte das gedacht. Dabei erstellt der Informatiker ein Grundriss, der User braucht dann nur noch bequem seine Daen einzutippen, den Rest haben wir ihm abgenommen. Sind wir nicht nett? Dazu wird es jetzt einige Unterpunkte geben, die die einzelnen Komponenten einmal vorstellt, zum Schluss sollte man genug wissen, um eine kleine, einfache Datenbank zu programmieren.
Ich hoffe, ich schreib es nicht zu kompliziert...
Aufgabe: Rechteck
Posted on 9.01.2006 at 17:39 - 0 Kommentare - Link
Mal eine leichte Aufgabe, um ein ganz klein wenig mit Canvas zu spielen und den Umgang mit Functionen und Proceduren zu verdeutlichen.
Erstelle eine Form mit
-
2 Editfelder
-
2 Panels
-
1 Button und
-
4 Labels
Die Aufgabe ist es, dass der Benutzer in die Editfelder die Breite und Höhe des Rechtecks eingeben darf, anschließend wird dieses gezeichnet. Die oben-links-Koordinate ist dabei die der Form. Außerdem sollen auf den Panels der Umfang und die Fläche angezeigt werden. Die Labels sind zum beschriften.
Es sollen 2 Functionen und 2 Proceduren verwendet werden.
Zusatz
Erstelle einen Button, der die Zeichnung löscht.
Drache
Posted on 9.01.2006 at 16:44 - 0 Kommentare - Link
Nun, hiermit beschäftigen wir uns mit einem recht einfacher Rekursion, dem Drachen. Auch wenn er nicht unbedingt so aussieht.
Quelltext
procedure TForm1.Button1Click(Sender: TObject); procedure Drache(a: Real); begin turtle1.LT(45); if a > 2 then drache(a*0.707) else turtle1.FD(a); turtle1.RT(90); if a > 2 then drache(a*0.707) else turtle1.FD(a); turtle1.LT(45); end; begin
turtle1.rt(90); drache(strtoint(edit1.Text)); end;
Einige Beispiele:

Abbruchbedingung: 2

Abbruchbedingung: 5

Abbruchbedingung: 10
Lösungen
Posted on 13.12.2005 at 21:56 - 0 Kommentare - Link
Hier werden die gesamten Lösungen zu den Aufgaben stehen, dabei werde ich jede Zeile es so geut es geht kommentieren, damit es auch verständlich ist.
Aufgabe: Primzahlenklick
Posted on 13.12.2005 at 21:56 - 0 Kommentare - Link
Die Aufgabe ist es, das der Benutzer 400 Felder mit Zahlen (von 1 bis 400, in einem 20x20 Block geordnet) vor sich hat . Wenn er auf ein Feld klickt, sollen alle Folgefelder, die ein Teiler dieses Feldes sind, verschwinden. Desweiteren soll das angeklickte Feld rot gefärbt werden. Wird nachträglich ein rotes Feld gelöscht, so ist es zu entfärben. Außerdem sollen alle Felder, die entfernt werden, nicht mehr anklickbar sein und zur besseren optischen Wahrnehmung die Farbe des Hintergrundes bekommen.
Aufgaben
Posted on 13.12.2005 at 21:56 - 0 Kommentare - Link
Hier werden exakte Aufgabenstellungen zu finden werden, die dann zu lösen sind. Anschließend kann man unter Lösungen sich meine Variante anschauen oder die eigenen Fehler suchen. Dabei ist nicht gesagt, das die von mir geschriebene Lösung optimal ist, ich geb mir allerdings große Mühe, das dem so ist. Außerdem werden die einzelnen Zeilen dokumentiert.
Boolean
Posted on 13.12.2005 at 10:07 - 0 Kommentare - Link
Ein Boolean lässt sich am Besten mit einem Schalter vergleichen. Er kann entweder An oder Aus sein, true oder false. Damit lassen sich sehr gut Zustände überprüfen, da man nicht erst eine große Variable definieren muss, was bei großen Programmen enormer Speichervorteil bedeutet. Ansonsten ist nichts weiter zu beachten, man kann einer Boolean nur true oder false zuweisen.
Tips für die Verwendung von Boolean:
Bei einer if-Abfrage muss man nur
if (bool) then
und nicht
if(bool = true)
eingeben. In diesem Fall wird die If-Anweisung ausgeführt, wenn bool "wahr" (true) ist.
Will man es ausführen wenn bool "falsch" (false) ist kann man auch folgendes verwenden:
if(not(bool)) then
Will man eine Boolean z.B. durch drücken eines Knopfes von wahr zu falsch und umgekehrt ändern ist folgender Code kurz und elegant:
bool := not(bool);
Profil
Posted on 12.12.2005 at 23:07 - 0 Kommentare - Link
So, wir müssen uns ja auch mal Vorstellen^^ Wir bestehen aus einem Zweierteam, das unermüdlich versucht, diese Seite auf dem neuesten Stand zu halten (in den Ferien natürlich nicht so oft) um dem Informatikkurs zu helfen. Wir sind hochmotiviert und geben unser Bestes zu jeder Zeit. Deshalb: Habt Spass!!! Hmmm, das war jetzt keine Wirkliche Vorstellung, denkt euch halt was aus.   Matthias Dyballa und Markus Breunig
Pfeilspitze
Posted on 12.12.2005 at 11:27 - 0 Kommentare - Link
Erklärung
Ab 6 für Tiefe kann man schon die Struktur des Pascalschen Dreiecks erkennen.
Laenge gibt an, wie breit, bzw hoch das Gebilde sein soll.
Tiefe ist die Rekursionsstufe, das heißt, wie oft es aufgerufen wird.
Und Richtung ist ein Faktor, der entscheidet, ob das Gebilde rechts oder linksrumgedreht wird.
Quelltext
procedure TForm1.Button1Click(Sender: TObject); procedure Pfeil(laenge: real; tiefe, richtung: integer); begin if tiefe <= 0 then turtle1.fd(laenge) else begin turtle1.lt(60 * richtung); Pfeil(laenge / 2, tiefe - 1, richtung * -1); turtle1.rt(60 * richtung); Pfeil(laenge / 2, tiefe - 1, richtung); turtle1.rt(60 * richtung); Pfeil(laenge / 2, tiefe - 1, richtung * -1); turtle1.lt(60 * richtung); end; end; begin Pfeil(strtoint(edit1.Text),strtoint(edit2.Text),1); end;
Beispielbild

(Laenge 250, Tiefe 7)
Massenanzeige
Posted on 9.12.2005 at 12:05 - 0 Kommentare - Link
Hiermit soll es möglich sein, Objekt auf der Form zu erzeugen. Möchte man zum Beispiel 100 Editfelder erzeugen, so wäre es ziemlich mühselig, diese alle einzeln auf der Form zu plazieren. dies kann mit einer kleinen schleife abgenommen werden, ebenso wie man in der Schleife die Position und den Namen angeben kann.
1.) Man definiert die Komponente global, die man erstellen möchte. Dazu denkt man sich einen Namen aus, die der Typ ist dabei der Name der Komponente mit einem T davor. Möchte man zum Beispiel Editfelder erzeugen, schreibt man
Felder: TEdit;
2.) Im nächsten Schritt erzeugt man schon mal Editfelder. Der richtige Code lautet
Felder := TEdit.Create(self);
3.) Anschließend wird darunter parent dem Feld per self zugewieden.
Felder.Parent := Self;
4.) Nun denken wir uns einen Namen für die ganzen erstellt Editfelder aus. Da wird am besten in einer Schleife arbeiten, nehmen wir die Schleifenvariable. Außerdem muss man mindestens noch einen Buchstaben vornewegschreiben, der einfachhalber nehmen wir Felder.
Felder.Name := 'Felder'+Inttostr(i);
5.) Nun haben wir schon das Feld erstellt, nur fehlt sowohl die Größe als auch die Position, was in einem einzigen Befehl erledigt wird.
Felder.SetBounds(Abstand zum linken Rand, Abstand zum oberen Rand, Breite der Komponente, Höhe der Komponente: Integer);
6.) Zum Schluss weisen wir noch einen Wert in das Editfeld, damit es nicht leer auf der Form erscheint.
Felder.Text := '0';
Damit lassen sich ganz schnell beliebige Mengen an Komponenten auf der Form erzeugen.
RippleSort
Posted on 9.12.2005 at 11:51 - 0 Kommentare - Link
Erklärung
RippleSort ist sehr gut, wenn man nur einige Elemente in eine schon vorsortierte Menge integrieren möchte. Ansonsten ähnelt es stark BubbleSort.
Quelltext
procedure TForm1.Button1Click(Sender: TObject); var n,K: Integer; Abbruch: Boolean; begin n := Listbox1.items.count-1; repeat abbruch := true; k := 1; while k <= n do begin if listbox1.items[k-1] > listbox2.items[k] then begin listbox1.items.exchange(k-1,k); abbruch := false; end; inc(k); end; until abbruch = true; end;
Bewertung
Stabil: Ja Geschwindigkeit: Sehr schnell (bei vorsortierten), langsam (bei unsortierten Mengen) Bei vorsortieren Zahlen: sehr schnell Sortiermenge: alles Ergebnis (7 von 10)
QuickSort
Posted on 9.12.2005 at 11:43 - 0 Kommentare - Link
Erklärung
QuickSort war lange Zeit eine der schnellsten Sorttieralgorithmen, die man kannte. Durch den rekursiven Aufruf wird die Listbox schon teilweise vorsortiert, QuickSort ordnet anschließend die einzelnen Blöcke.
Quelltext
...
type
procedure QuickSort(l,r: Integer);
private { Private-Deklarationen }
...
procedure TForm1.QuickSort(l,r: Integer); var i, j: Integer; mitte: String; begin
i := l; j := r; mitte := listbox1.items[(l+r) div 2]; repeat while listbox1.items[i] < mitte do Inc(i);
while Mitte < listbox1.items[j] do Dec(j);
if i <= j then begin listbox2.items.exchange(i,j); Inc(i); Dec(j); end; until i > j; if (l < j) then QuickSort(l,j);
if (i < r) then QuickSort(i,r);
Edit9.Text := Floattostr((GetCurrentTime - az) / 1000); end;
procedure TForm1.Button1Click(Sender: TObject); begin QuickSort(0,listbox1.items.count - 1); end;
Bewertung
Stabil: Ja Geschwindigkeit: Sehr schnell Bei vorsortieren Zahlen: gut Sortiermenge: alles Ergebnis (8 von 10)
Schreibtischtest
Posted on 8.12.2005 at 10:31 - 0 Kommentare - Link
So, für alle Faulen, es gibt ne ganz einfache Möglichkeit, den Schreibtischtest auch von Delphi machen zu lassen. Dabei ist zu beachten, dass bei Rekursionen die Zahlen nicht immer stimmen müssen, da die einzelnen Rekursionen den weiteren Ablauf unterbrechen.
1) Man packe eine Listbox auf die Form.
2) Man setzte an das Ende des Quelltextes eine Funktion, die alle Variablen in die Listbox schreibt. Dabei kann man auch diesen Befehl direkt nach einer Variablenänderung setzen.
3) Nun steht in der Listbox die Variablen für jeden Durchlauf, man kann diese dann einfach rausschreiben und wäre damit fertig. Man sollte in den Hochkommatas auch noch die Variablennamen dazusetzten, sonst verliert man recht schnell den Überblick.
Massenbenutzung
Posted on 8.12.2005 at 10:30 - 0 Kommentare - Link
Wer von euch kennt das, oder auch noch nicht: Man hat 100 Editfelder und möchte alle auf 0 setzten. Dann müsste man 100 mal den Eintrag Edit1..100 := 0; schreiben. Das geht auch einfacher, auch wenn es komplizierter aussieht, die Mühe lohnt sich wirklich.
Als erstes kommt der Quelltext.
... for i := 1 to 100 do TEdit(findcomponent('Edit'+inttostr(i))).text := '0';
...
Mehr ist es nicht. Die 100 ist natürlich ersetztbar durch die Anzahl der Objekte. Das klappt natürlich mit allem, was man auf der Form hat, dazu schreibt man einfach die Bezeichnung mit einem T vorneweg: TButton, TListbox, etc... In den Klammern wird der Name von dem Feld gesucht. Hat man seine 100 Editfelder umbenannt, hat man ein Problem, weil die nicht mehr gefunden werden, hat man ihnen aber einen einheitlichen, anderen Namen gegeben, so muss nur der Name in den Hochkommata getauscht werden. Damit lassen sich natürlich auch andere Sachen als .text ansprechen, alles ist möglich.
Hintergrundbild
Posted on 8.12.2005 at 10:28 - 0 Kommentare - Link
Hiermit wollen wir uns mit dem langweiligen Layout beschäftigen. Wenn wir fertig sind, soll es mindestens ein wenig besser aussehen.
1.) Als erstes kommt eine Image-Komponente auf die Form. Die Position ist egal, ebenso die Größe, außerdem klickt man sie rechts an und schickt sie in den Hintergrund.
2.) Man wähle im Objektinspektor die Funktion Picture und sucht ein Bild. (Wer keins zur Verfügung hat, einfach mal in den Windowsordner schauen, da gibt es immer welche.)
3.) Nun haben wir schon mal ein Bild in der Box, aber wer die Box größer zieht, merkt, dass das Bild da nicht so wirklich mitmachen möchte.
4.) Man klicke auch Stretch und setze es true. (Dabei wird das Bild auf die Größe des Fensters gezerrt, die Größe des Fensters, nicht der Form!!!)
5.) So, nun haben wir ein kleines Bild. Und nun? Faule können es auf die Größe der Form ziehen und wären fertig. Es geht aber auch anders. Als erstes klickt man doppelt auf die Form.
6.) Dort fügt man diesen Quelltext ein. image1.Top := 0; image1.Left:= 0; image1.Width := form1.Width; image1.Height := form1.Height;
7.) An sich wäre man nun fertig, es gibt nur noch zwei kleine Dinge, die man tun könnte. Als erstes wählt man auf der Form den Punkt Autoscroll aus und setzt ihn auf false.
8.) Und wer das Projekt startet und das Fenster vergrößert, merkt, dass der Hintergrund sich nicht mitverändert. Das läßt sich einfach ändern. Wir packen noch einen Timer auf die Form, klicken ihn doppelt an und kopieren den Quelltext auch dort hinein. Dabei ist es egal, ob er nur hier steht oder in beiden. Voilà, fertig.
9.) Obwohl, wer ein Label auf der Form hat, wird merken, dass es auf sich aufmerksam macht, wo es ist. Man muss alle Labels auf Transparent setzten. Und wenn ich 100 Stück hab? Dazu hilft der Beitrag Massenbenutzung!!!
Und nun haben wir eine schönere Form mit nur einem ganz geringen Arbeitsaufwand, wenn das nicht die Mühe wert war.
Nützliches
Posted on 8.12.2005 at 10:24 - 0 Kommentare - Link
|
Erklärung
Unter diesem Punkt werden einige nützliche Dinge erklärt, aber vor allem findet man hier Dinge, die das Projekt schöner aussehen lassen. Sie erfüllen also keinen direkten Nutzen, sondern erfreuen das Auge. Aber auch Sachen, die einem viel Schreibarbeit ersparen, werden hier aufgeführt. |
Sierpinski
Posted on 8.12.2005 at 10:22 - 0 Kommentare - Link
Quelltext Sierpinski
type
procedure Sierpinski(a: Integer);
implementation
{$R *.DFM}
procedure TForm1.Sierpinski(a: integer); var i: integer; begin for i := 1 to 3 do
begin turtle1.FD(a); turtle1.rt(120); if a>5 then sierpinski(a div 2); end; end;
procedure TForm1.Button4Click(Sender: TObject); begin sierpinski(strtoint(edit1.text)); end;
Kochfunktion
Posted on 8.12.2005 at 10:20 - 0 Kommentare - Link
Erklärung Kochfunktion
So, hier ist nun die Kochfunktion. Sie zeichnet eine Art drittel Schneeflocke. Dabei ist sie rekursiv, sonst würde sie hier nicht stehen^^ Mit dem Button wird die Funktion gestartet, der Wert aus einem Editfeld.
Quelltext
procedure TForm1.Button1Click(Sender: TObject); procedure Koch(a: integer); begin if a < 3 then turtle1.fd(a) else begin koch(a div 3); turtle1.lt(60); koch(a div 3); turtle1.rt(120); koch(a div 3); turtle1.lt(60); koch(a div 3); end; end; begin koch(strtoint(edit1.text)); end;
Beispielbild

(Für a = 600)
GGT
Posted on 8.12.2005 at 10:18 - 0 Kommentare - Link
Erklärung
Der GGT - oder auch größter gemeinsamer Teiler - berechnet den GGT von zwei Zahlen. Dazu benutzt er die Funktion mod. Mod liefert immer den Rest einer Division. Bei der Bedingung (a mod b) = 0 kann es keine größeren Teiler geben, da der GGT nicht größer als eine Zahl sein kann. Der zweite Teil GGT(b,a mod b) berechnet dann weiter, bis irgendwann die erste Bedingung erfüllt ist. Es gibt zwar keine Schleife, doch der else-Teil von GGT ruft sich immer wieder selber auf.
Quelltext
function GGT(a,b: integer): Integer; begin if a mod b=0 then result:=b else result := GGT(b,a mod b); end;
procedure TForm1.Button1Click(Sender: TObject); begin edit3.text := inttostr(GGT(Strtoint(edit1.text),Strtoint(edit2.text))); end;
Fakultät
Posted on 8.12.2005 at 10:15 - 0 Kommentare - Link
Quelltext
function fakultaet(a: Integer): Longint; var fa: Longint; begin if a = 0 then fa := 1 else fa := a * fakultaet(a-1); result := fa end;
procedure TForm1.Button1Click(Sender: TObject); begin edit2.Text := inttostr(fakultaet(strtoint(edit1.text))); end;
Dies ist ein sehr schönes Beispiel von einer Rekursion. Jede Zahl, die man eingibt, wird solange um eins erniedrigt, bis sie 0 ist. Anschließend wird sie wieder multipliziert. Klingt komisch, aber da wir wissen, das eine Rekursion ihre einzelnen Schritte speichert, werden diese natürlcih auch wieder rückwärts abgearbeitet und deshalb geht es.
Fibonacci Zahlen
Posted on 8.12.2005 at 10:11 - 0 Kommentare - Link
Erklärung
Fibonatcci Zahlen sind eine Art Additionssumme. Eine Fibonatccizahl besteht aus der Summe ihrer 2 linken Nachbarn. Dabei ist festgelgt, das 0 = 1 und 1 = 1 sei.
Zum Beispiel
Zahlen 0 1 2 3 4 5 6 7
Fibonaccti 1 1 2 3 5 8 13 21
Man kann sehen, das die Zahlen schnell größer werden.
Quelltext
function fibonatcci(n: Integer): Integer; var a: Integer; begin if n <= 1 then a := 1 else a := fibonatcci(n - 1) + fibonatcci(n - 2); result := a; end;
procedure TForm1.Button1Click(Sender: TObject); begin edit2.Text := inttostr(fibonatcci(strtoint(edit1.text))); end;
Eigendlich funktioniert es genauso wie die Fakultät. Jede Zahl, die man eingibt, wird erst auf 1 bzw 0 gebracht. Da 0 = 1 bzw 1 =1 definiert ist, rechnet der Algorithmus dann wieder rückwärts. Und so kommt man dann auf das Ergebnis.
Binominalkoeffizent
Posted on 8.12.2005 at 10:10 - 0 Kommentare - Link
Erklärung
Der Binominalkoeffizent berechnt ein Pascal'sches Dreieck, dabei berechnet es dieses aber immer nur bis zu der Stelle. Ein Overflow tritt ein, wenn die zweite Zahl größer ist, da es nicht möglich ist, fünf Tassen mit sechs Getränken zu füllen.
edit Benny: Wer sagt das? :D
Quelltext
function bino(n,k: Integer): Integer; begin if (k = 0) or (k = n) then result := 1 else result := bino(n-1,k-1)+bino(n-1,k); end;
procedure TForm1.Button1Click(Sender: TObject); begin edit3.text := inttostr(bino(strtoint(edit1.text),strtoint(edit2.text))); end;
Ackermann
Posted on 8.12.2005 at 09:59 - 0 Kommentare - Link
Quelltext
function ack(m, n: Integer): Longint; begin if m = 0 then result := n+1 else if n = 0 then result := ack(m - 1, 1) else result := ack(m - 1, ack(m, n - 1)); end;
Ackermann (2,3) im Schreibtischtest
Einmal ausführlich beschrieben, dabei wird immer das Ergebnis ausgegeben, allerdings nicht die Unterpunkte:
2,3 2,2 2,1 2,0 1,1 1,0 0,1 0,2 1,3 1,2 1,1 1,0 0,1 0,2 0,3 0,4 1,5 1,4 1,3 1,2 1,1 1,0 0,1 0,2 0,3 0,4 0,5 0,6 1,7 1,6 1,5 1,4 1,3 1,2 1,1 1,0 0,1 0,2 0,3 0,4 0,5 0,6 0,7 0,8 = 9
Damit ist der Ackermann von 2,3 = 9. Wie man sieht, sind ganz schön viel Schritte nötig.
Anzahl Schritte
0,0---2 0,1---2 0,2---2 0,3---3 0,4---4
1,0---3 1,1---5 1,2---7 1,3---9 1,4---11
2,0---6 2,1---15 2,2---28 2,3---45 2,4---66
3,0---16 3,1---107 3,2---542 3,3---2433 3,4---10308
4,0---108 4,1--- Schafft mein Pc nicht mehr
Man sieht also, das die Funktion schon sehr schnell nicht mehr berechenbar ist
Rekursion
Posted on 8.12.2005 at 09:52 - 0 Kommentare - Link
Einführung
Bei einer rekursiven Funktion, wie man sie in den Beispielen, wie Koch und Sierpinski findet, wird die Funktion durch sich selbst immer wieder aufgerufen.
Rekursion wird immer dann eingesetzt, wenn ein großes Problem in mehrere kleine Probleme, die genau wie das große aussehen, aufgeteilt werden kann. Mehr dazu siehe unten unter "Dummes Beispiel"
Zum Aufbau einer rekursiven Fuktion
Die Funktion wird wie alle Funktionen bzw. Prozeduren definiert, hat jedoch in den Klammern mindestens eine Variable.
Beispiel: procedure name(a: Integer);
a muss nicht unbedingt "a" heißen und nicht immer ein Integer sein, aber bei unseren Beispielen ist es der Fall. Die Variablen, die schon in der Klammer definiert wurden, dürfen in der Funktion nicht nochmals definiert werden.
Ganz wichtig ist, dass die rekursive Funktion eine Abbruchbedingung (dies ist eine if Abfrage) hat, weil die Funktion sich ansonsten immer wieder unkontrolliert aufrufen würde.
Beispiel:
... if(a > 5) then name(a/3) else Anweisung; ...
Falls es noch nicht bekannt ist. Wenn sich eine rekursive Funktion selbst aufruf, wird eine neue Kopie dieser Funktion erstellt und die alte Funktion wartet bis die Kopie beendet ist. Die Funktion führt sich also nicht selbst aus, sondern nur eine Kopie von sich.
Dummes Beispiel Man hat einen Karton in dem wiederum kleine Kartons sind.
Die Funktion "auspacken" würde lauten:
Karton öffnen.
Wenn in dem Karton noch ein Kartons ist, dann gib den Karton an jemand anders mit dem Befehl auspacken.
Wenn Ware in dem Karton ist, dann bring sie ins Lager.
Das Beispiel gibt es als Gif-Animation
Man sieht, dass die Funktion eine Abbruchbedingung hat. Im Gegensatz zum wirklichen Leben würde man bei diesem Beispiel den Karton an jemanden weitergeben und müsste dann warten, bis dieser Seine Tätigkeit (Funktion) ausgeführt hat.
Ich hoffe das ist erstmal verständlich, sonst einfach im Gästebuch fragen!!!
So, für diejenigen, die das immer noch nicht verstanden haben, jetzt kommt ein Beispiel aus dem richtigen Leben. Obwohl keiner so blöd sein kann...
Eine Rekursion ruft sich selber wieder auf. Ohne Abbruchbedingung läuft sie deshalb endlos. Machen wir den Test. Man nehme ein Blatt Papier und schreibe auf beide Seiten "Bitte wenden". Nun gibt man es einer Person und sie soll den Anweisungen auf dem Papier folgen. Sie wird nie fertig. (Ich sag ja, niemand wird so blöd sein, versucht es gar nicht erst) Wie auch, es gibt keine Abbruchbedingung. Man könnte eine formulieren, das wäre dann ja aber langweilig, oder und schließlich will der Computer ja auch ein bisschen rechnen, er wird sich schon melden, wenn er nicht mehr kann...
for-Schleife
Posted on 8.12.2005 at 09:48 - 0 Kommentare - Link
Die for-Schleife
Am meisten wird dieser Typ von Schleife verwendet, deshalb gehe ich ein wenig genauer auf ihn ein. Anders als bei den anderen Schleifen zählt diese sich eine Laufvariable bei jedem Durchlauf um einen rauf, bzw runter. Ein weiterer besonderer Punkt ist, dass die Laufzeitvariable eine lokale Variable sein muss. In den meisten Fällen nimmt man i für diese Variable, doch eigentlich ist es einem freigestellt.
Zum Beispiel
... zähler := 0; for i:=1 to 5 do begin zähler := zähler + i; end;
...
Diese Schleife würde 5 mal durchlaufen und jedesmal den Wert von i in den zähler schreiben. Am Ende ist er 15 groß. Diese Art von Schleifen werden sehr oft geschachtelt oder benutzt, um den Index von längeren Anweisungen anzugeben. Da man auf i zugreifen kann und er sich mit jedem Durchlauf selbst erhöht, spart das viel Zeit.
Eine Besonderheit Die downto-Variante, sie zählt runter anstatt rauf, ansonsten verwendet man sie genauso.
Zum Beispiel
... zähler := 0; for i:=5 downto 1 do begin zähler := zähler + i; end;
...
Am Ende kommt das gleiche, nämlich 15, raus.
while-Schleife
Posted on 8.12.2005 at 09:42 - 0 Kommentare - Link
Die while-Schleife
Die while-Schleife ist kopfgesteuert. Oben wird überprüft, ob die Bedingung erfüllt ist, dann läuft sie einmal durch. Ist die Bedingung immer noch erfüllt, läuft sie noch einmal durch, usw. Eine while-Schleife beginnt mit einem while, dann kommt die Bedingung, gefolgt von einem do. Natürlich kann man längere Bedingungen mit begin und end; klammern
Zum Beispiel
... while Zähler <= 5 do begin Zähler := Zähler + 1; end; ...
Am Ende wird der Zähler 6 sein, da wenn er 5 ist, die Bedingung immer noch erfüllt ist und die Schleife ein weiteres Mal durchläuft.
repeat-Schleife
Posted on 8.12.2005 at 09:40 - 0 Kommentare - Link
Die Repeat-Schleife
Die repeat-Schleife ist eine fußgesteuerte Schleife, d.h. sie läuft mindestens einmal durch, denn erst am Ende jedes Durchlaufs der Schleife wird überprüft, ob sie noch einmal durchlaufen soll. Eine repeat-Schleife beginnt mit dem Wörtchen repeat und endet mit einem until.
Zum Beispiel
... Zähler := 0; repeat Zähler := Zähler + 1; until Zähler = 5;
...
Diese Schleife würde sooft durchlaufen, bis der Zähler 5 ist. In diesem Beispiel wird innerhalb der Schleife raufgezählt und damit die Abbruchbedingung erfüllt, es kann aber auch der Fall eintreten, das die Bedingung schon vorher erfüllt ist. Trotzdem läuft die Schleife einmal durch.
Schleifen
Posted on 8.12.2005 at 09:38 - 0 Kommentare - Link
Nutzen
Hier werden erstmal die Funktionen von Schleifen erklärt. Eine Schleife bewirkt, das eine Funktion beliebig oft wiederhohlt werden kann. Dies ist ganz nützlich, wenn man eine immer wiederkehrende Anweisung durchführen möchte, aber den Quelltext nicht so oft untereinanderschreiben will. Alle Schleifen müssen eine Abbruchbedingung haben, sonst laufen sie so lange, bis der Arbeitsspeicher überfüllt ist und/oder sich das Programm aufhängt. Man kann beliebig viele Anweisungen in eine Schleife stecken, die einzelnen Schleifen stelle ich unter dem jeweiligen Punkt vor.
Selection Sort
Posted on 8.12.2005 at 09:29 - 0 Kommentare - Link
Erklärung
Selection Sort ist ein recht schneller Sortieralgorithmus. Er sucht den jeweils größten Wert raus und schreibt ihn dann an das Ende der Zeile. Obwohl er BubbleSort ähnelt, ist er sehr viel schneller, da nicht jedes Element untereinander getauscht wird, sondern erst, wenn der Algorithmus einmal durchgelaufen ist.
Quelltext
procedure TForm1.Button1Click(Sender: TObject); var Max: string; i,iMax,z: Integer; begin for i:= (listbox1.items.count - 1) downto 1 do begin iMax := i; Max := listbox1.items[i]; for z := 0 to i-1 do if(listbox1.items[z] > Max) then begin iMax := z; Max := listbox1.items[z]; end; listbox1.Items[iMax] := listbox1.items[i]; listbox1.items[i] := Max; end; end;
Bewertung
Stabil: Ja Geschwindigkeit: Schnell Bei vorsortieren Zahlen: Gut Sortiermenge: Zahlen, Buchstaben und Gemische
Ergebnis (6 von 10)
BubbleSort
Posted on 8.12.2005 at 09:28 - 0 Kommentare - Link
Erklärung
BubbleSort ist ein recht einfacher Algorithmus. Er fängt unten an und vergleicht die ersten beiden Zahlen. Ist die eine Zahl darüber kleiner, so tauscht er sie. Dies macht er so lange, bis die nächste Zahl mal eine größere ist. Dann nimmt er die neue Zahl und verfährt mit ihr genauso. Wenn er dann die größte Zahl am Ende stehen hat, fängt er wieder von vorne an, allerdings ohne das jeweils letzte Element.
Quelltext
procedure TForm1.Button9Click(Sender: TObject); var i, j: Integer; begin for j := 0 to (listbox2.Items.Count - 1) do for i:=0 to (listbox2.Items.Count - j - 2) do if listbox2.items[i] > listbox2.items[i+1] then listbox2.items.exchange(i, i+1); end;
Bewertung
Stabil: Ja Geschwindigkeit: Langsam Bei vorsortieren Zahlen: Gut Sortiermenge: Zahlen, Buchstaben und Gemische
Ergebnis (4 von 10)
ArraySort
Posted on 8.12.2005 at 09:24 - 0 Kommentare - Link
Beschreibung
Ein selbstentwickelter Sortieralgorithmus. Er basiert darauf, das die Zahlen in einen Array geschrieben werden, wobei der Index des Array gleich der Zahl ist und der Wert gleich der Anzahl an Zahlen. Dadurch ist er sehr schnell, aber sobald die Zahlen mehr als 6-Stellen haben, wird er pro Stelle deutlich langsamer. Noch funktionieren keine Strings.
Quelltext
procedure TForm1.Button1Click(Sender: TObject); var i:Integer; z: Array[0..999999] of Integer; begin for i := 0 to 999999 do z[i] := 0; for i := 0 to listbox1.Items.Count -1 do inc(z[strtoint(Listbox1.items[i])]); listbox1.clear; for i := 0 to 999999 do if z[i] > 0 then repeat dec(z[i]); listbox1.Items.Add(inttostr(i)); until z[i] <= 0; end;
Bewertung
Stabil: Ja Geschwindigkeit: Sehr sehr schnell Bei vorsortieren Zahlen: sehr schlecht Sortiermenge: Zahlen
Ergebnis (6 von 10)
Sortieralgorithmen
Posted on 8.12.2005 at 09:17 - 0 Kommentare - Link
Einführung
Ein guter Sortieralgotithmus spart viel Zeit. Im allgemeinen sortieren sie eine Menge an Daten, meistens sind es Strings. Ziel ist es, einen guten Sortieralgorithmus zu haben, der sowohl eine unordentliche Menge, als auch eine schon vorsortierte Menge, in die nur ein Element eingefügt werden soll, sortieren kann. Und das möglichst schnell. Natürlich spielt dabei der Prozessor und der Arbeitsspeicher eine große Rolle, doch man kann trotzdem sagen, das einige Algorithmen anderen überlegen sind. Deshalb gibt es auch immer eine kurze Bewertung zu den einzelnen Algorithmen, was Zeit und Leistung angeht.
Zeitmessung
Damit man Sortieralgorithmen auch vergleichen kann, fügen wir eine Zeimessung durch. Dazu nehmen wir die Systemzeit am Anfang und am Ende von der Funktion und ziehen sie voneinandern ab. So erhalten wir die gewünschte Zeit.
... var Systemzeit: Integer; begin systemzeit := GetCurrentTime; ...
... Edit1.text := Floattostr((GetCurrentTime - Systemzeit) / 1000); end; ...
Damit lässt sich die Zeit auf 3 Stellen genau berechnen.
Neuigkeiten
Posted on 7.12.2005 at 22:01 - 0 Kommentare - Link
So, wir wollen mal versuchen, neue Artikelbesser hervorzuheben, darum ganz einfach auf den Namen klicken undschon wird man weitergelinkt.
Neue Artikel sind
Unser Minidownloadbereich:
Viel Spass
Aufgaben
Posted on 7.12.2005 at 15:37 - 0 Kommentare - Link
Im folgenden werde ich einige Aufgaben inclusive Lösung und Welt angeben, man muss die Dateien allerdings downloaden und umbennen, da ich keine Dateien außer Bildern hochladen kann. Die Datei mit der 1 ist die Welt, die 2 das eigendliche Programm.
Kara
Posted on 7.12.2005 at 15:37 - 0 Kommentare - Link
Kara ist ein Marienenkäfer, dem man alles sagen muss. Er kann diverse Zustände überprüfen, hat aber keinen Speicher, auf den er zurückgreifen kann. Sein handeln ist nur durch Bedingungen geknüpft.
Invertieren
Posted on 7.12.2005 at 14:22 - 0 Kommentare - Link
Kara ist so zu programmieren, dass er alle Klebbläter umdreht, das heißt, wo eins liegt, soll er es aufnehmen, wo keins leigt, soll er eines hinlegen.
Welt:

Der Code, Baum rechts ist der Startstate

Turtle
Posted on 7.12.2005 at 14:22 - 0 Kommentare - Link
Erklärung
Mit einer Turtle ist es möglich, einfach Geraden zu zeichnen. Dabei geht die Turtle immer nur nach vorne, man muss sie immer in die entsprechende Richtung drehen. Turtle hat einen ganzen Katalog an eigenen Befehlen, ich liste mal die wichtigsten auf.
Befehle
.fd(a: Real) geht um die Strecke a nach vorne
.bk(a: Real) geht um die Strecke a nach hinten
.lt(a: Real) dreht sich um die Strecke a nach links
.rt(a: Real) dreht sich um die Strecke a nach rechts
.home bringt die Turtle auf die Startposition
.cs löscht die Zeichnung
Das waren jetzt die Wichigsten.
Timer
Posted on 7.12.2005 at 14:22 - 0 Kommentare - Link
Erklärung
Ein Timer ist eine unsichtbare Komponente. Sie startet nach einem festgelegtem Intervall jeweils eine Procedure oder Function. Dies ist nützlich, wenn man zeitliche Abläufe festlegen möchte, oder Ergeignisse immer wiederkehren sollen. Im Groben kann man den Timer als eine Schleife bezeichnen, die auf Dauerbetrib macht.
Begriffe
Der Timer vefügt nur über ganz wenige Begriffe. Und das einzig neue ist Interval. Damit legt man die Taktrate fest. Ich bin mir nicht sicher, glaube aber es sind Millisekunden.
Radiobutton
Posted on 7.12.2005 at 14:22 - 0 Kommentare - Link
Nutzen
Anders als bei der CheckBox kann man immer nur eine Auswahl anwählen. Dies ist nützlich, wenn man das Geschlecht abfragen möchte oder ähnliches, wo man nur die Auswahl zwischen zwei Möglichkeiten hat und man sicher gehen möchte, das der Benutzer nur eine auswählt. Es ist dennoch Möglich, mehrere Radiobuttons zu haben und auch mehrere auszuwählen, dazu müssen diese aber jeweils in der Gruppe auf eine Groupbox, Radiobox oder Panel gesetzzt werden.
Ansprechen
Der Radiobutton wird genau wie die Checkbox angesprochen, nämlich über den Befehl checked.
Listbox
Posted on 7.12.2005 at 14:22 - 0 Kommentare - Link
Erklärung
Die Listbox ist etwas schwerer. Am besten vergleicht man sie wirklich mit einer Liste. In ihr stehen untereinander einzelne Strings. Damit gelten alle Befehle, die man für Strings beachten muss. Ansonsten vereinfacht sie das Arbeiten ungemein, da man in einem Feld fast beliebig viele Ausgaben anzeigen lassen kann.
Begriffe
Der mit Abstand wichtigste Befehl ist Items. Mit ihm lässt sich auf die ganzen String zugreifen.Im Folgenden gehe ich davon aus, das immer ein Listbox1.items vorneweg geschrieben steht.
Möchte man auf eine einzelne Zeile zugreifen, sogibt es 2 Möglichkeiten.
Kennt man die Stelle, so ist es mit [] und der Stelle möglcih.
Kennt man sie nicht, so schreibt man index. Dies ist ein Integerwert, der die Position des angeklickten Strings ausgibt.
Ein guter Punkt ist exchange(index1, index2). Damit lassen sich zwei Zeilen vertauschen.
Mit count lassen sich alle Elemente zählen. Dabei werden die Zeilen gezählt.
Mit sorted werden alle Elemente sortiert.
Mit delete(index) wird die Stelle gelöscht
Dann gibt es noch den Befehl clear, welcher einfach hinter Listbox1 gehängt wird (Punkt nicht vergessen) und die Listbox leert.
Label
Posted on 7.12.2005 at 14:22 - 0 Kommentare - Link
Nutzen
Mit einem Labelfeld kann man auf die Form Texte schreiben, meistens wird es genutzt, um hinzuweisen, für was gewisse Felder wie Editfelder gut sind. Natürlich kann man den Text auch während des Ablaufens ändern lassen. Deshalb nutzt man sie manchmal auch als Ergebnisausgabe
Ansprechen
Die wichtigste Funktion ist caption, und mehr hat es eigentlich schon gar nicht mehr, die wichtig sind.
EditFeld
Posted on 7.12.2005 at 14:22 - 0 Kommentare - Link
Nutzen
Mit einem Editfeld ist es dem Benutzer möglich, Texte, Zahlen oder auch nur Zeichenketten (nix anderes tippt man ja ein), zu übermitteln.
Ansprechen
Man spricht das Textfeld über die Komponente .text an. Anzeigen lassen kann man nur String, doch mit dem Befehl Inttostr lassen sich auch Variablen anzeigen, da sie mit dem Befehl in einen String umgewandelt werden. Natürlich lassen sich auch wieder einzelne Zeichen anzeigen, mann setzt sie in Hochkommata ' '.
Checkbox
Posted on 7.12.2005 at 14:22 - 0 Kommentare - Link
Nutzen
Mit einer Checkbox ist es möglich, den Benutzer eine Auswahl treffen zu lassen. Dabei kann man mehrere Häkchen setzten, anders als beim Radiobutton, und diese dann mit Bedingungen abfragen lassen. So kann man eine Checkbox für die Hobbies nehmen, wo der Benutzer selber welche ankreuzen muss.
Ansprechen
Bei einer Checkbox gibt es zwei sehr ähnliche neue Befehle. Da wäre der Boolean checked, der ausgibt, ob das Kästchen gedrückt wurde. Und dann hat man noch unter State die Möglichkeit einzustellen, ob man, wenn man schon mit einem Häkchen startet, dieses nicht grau, also unveränderlich haben möchte. Natürlich geht dies auch wieder während des Programmablaufs.
Button
Posted on 7.12.2005 at 14:22 - 0 Kommentare - Link
Erklärung
Ein Knopf zum Drücken, womit sich dann weitere Procedures starten lassen.
Begriffe
Da dies nur eine sehr einfache Komponente ist, gibt es keine Besonderheit.
Formobjekte
Posted on 7.12.2005 at 13:25 - 0 Kommentare - Link
Einführung
Hier werden lauter Beiträge zu den einzelnen Komponenten entstehen, was sie machen. Auch wird hier erstmal die Grundansprechweise beschrieben. Unter den einzelnen Punkten sind dann auch noch Sonderbefehle und Beachtungen zu finden.
Begriffe
Es ist möglich, alle Unterpunkte im Objektinspektor auch während des Programms abzufragen. Dazu muss im Quelltext nur der Name des Objekts stehen, dann kommt ein Punkt und dann der Punkt, den man gerne angesprochen hätte. Die Zuweisung erfolgt wie immer, man muss nur darauf achten, das die Werte stimmen, da es nicht möglich ist, einem Booleanfeld eine Zahl zuzuweisen.
Jedes Objekt hat im Objektinspektor den Punkt Name. Damit legt man fest, wie das entsprechende Objekt heißt. Standard ist der Name von dem Objekt mit der Nummer. Man kann natürlich auch einen neuen Namen zuweisen, doch ist dies nicht ratsam.
Alles, was sich auch nur irgendwie beschriften lässt (Buttons etc) kann man über den Punkt Caption bzw. Text machen lassen.
Ein weiterer, oft genutzer Punkt ist Visible. Dieser Boolean regelt, ob man das Objekt sieht.
Ein anderer, noch öfter genutzter Boolean ist Enabled. Damit kann man festlegen, ob es erlaubt ist, dieses Objekt zu nutzen.
Mit den Punkten Top und Left lässt sich die Lage auf der Form ändern. Top regelt den Abstand nach oben, Left zum Linken Rand.
Mit Taborder lässt sich die Reihenfolge ändern, in der man bei Drücken der TAB-Taste zwischen den Feldern springt.
Mit Hight und Weight lässt sich die Komponente an sich festlegen. Hight gibt die Höhe, Weight die Breite an.
Zu guter letzt noch den Punkt Font. Damit lässt sich die Schrift in nur allen erdenklich Varianten definieren.
Array
Posted on 7.12.2005 at 13:25 - 0 Kommentare - Link
Array , was ist das?
Ein Array kann man sich wie eine Reihe von Boxen vorstellen. In jede Box passt ein Wert eines vorher festgelegten Typs.
Es gibt zwei Arten von Arrays:
Das statische Array, bei dem die Anzahl von Speicherplätzen immer gleich bleibt und nicht verändert werden kann.
Das dynamische Array bei dem die Länge während des Programmablaufs verändert werden kann.
Statische Arrays werden so definiert:
var a: array[0..10] of Integer;
In diesem Fall besteht das Array aus 11 Elementen. Element 0 bis 10. Die Elemente sind in diesem Fall Integer;
Definierung eines Arrays: Names des Arrays : array[ Anfangswert .. Endwert ] of Variablentyp ;
Dynamische Arrays werden so definiert: Dazu später mehr
Um die Werte in einem Array auszulesen oder reinzuschreiben verwendet man folgenden Befehl: Arrayname[zellennr] := 3;
x := Arrayname[zellennr];
String
Posted on 7.12.2005 at 13:06 - 1 Kommentare - Link
Was ist ein String
Strings sind Zeichenketten, dies bedeutet, dass sie aus einer Reihe von aneinandergehängten ASCII Zeichen bestehen (Jedes Schriftzeichen hat einen ASCII Wert).
Listboxen und Editfelder zum Beispiel beinhalten Strings. Wenn man in ein editfeld eine Zahl eingegeben hat, ist diese jedoch für den Computer noch keine Zahl sondern nur eine Zeichenkette.
Beispiel: Die Zahl 123 in einem Editfeld ist für den Computer ein String der aus den Zeichen "1" danach "2" und danach "3" besteht. Um mit diesem String rechnen zu können muss man diesen erst mit strtoint(string) in einen Integer umwandeln.
Will man eine Kommazahl umwandel, benutzt man die Funktion strtofloat(string). Bei dieser Methode ist das Ergebnis kein Integer sondern eine Real.
Wenn man das ganze andersherum machen möchte, das heißt eine Zahl in ein Editfeld schreiben will, dann verwendet man die Methoden inttostr(integer) bzw. floattostr(real).
Besonderer Zugriff
Man kann auf einen String, da es ja nur eine Zeichenkette ist, auf eine beliebige Stelle zugreifen und ihr einen neue Wert zuweisen. Dies geht mit den eckigen Klammern [].
Zum Beispiel
procedure TForm1.Button1Click(Sender: TObject); var a: string; begin a := edit1.text; edit2.Text := a[3]; end;
Man würde damit den dritten Buchstaben von dem Text in Edit1 haben. Damit man diese Funktion optimal nutzen kann, ist der Befehl length kann man die Länge eines String bekommen.
Zum Beispiel
i := length(a); oder i := length(edit1.text);
Dabei gibt die Funktion einen Integerwert aus. Nützlich ist dies, um nicht versehentlich auf Stellen zugreifen zu wollen, die nicht vorhanden sind.
Copy, Insert und Delete
Mit den drei Befehlen ist es möglich, längere Teile zu bearbeiten. Befassen wir uns zuerst mit delete. Sie löscht einen Teil aus einem String und der Rest füllt die Lücke. Dabei wird delete so definiert, das man erst den String, dann den Index und zuletzt die Anzahl angibt. Vereinfacht geschrieben sieht das dann so aus:
delete(String, Index, Anzahl)
Dabei ist es einem freigestellt, ob man eine Zahl, den ganzen String oder nur eine bestimmte Stelle löschen möchte.
Der Befehl copy funktioniert ähnlich. Von der Syntax her ist es dasselbe.
copy(String, Index, Anzahl)
copy kopiert halt nur Teile des Strings, die man dann anzeigen, an andere Strings anhängen oder anderweitig verwenden kann.
Nun ist auch klar, was insert macht. Man kann damit einen oder mehrere Zeichen in den String einfugen. Die Syntax sieht wie folgt aus:
insert(Stringname, Zeichen oder anderer String, Index)
Mit diesen drei Befehlen ist eine einfache Grundarbeit an Strings möglich.
Pos
Ein weiterer nützlicher Befehl ist pos. Mit ihm kann man nach bestimmten Zeichen oder Ketten in einem String suchen. Dabei gibt pos das Ergebnis in einem Integer aus. Besonderheit ist, das nur das erste Zeichen gefunden wird. Wenn man ein e finden will und das Wort hat mehrere, dann sagt er nur die Position des ersten. Die Syntax lautet wie folgt:
pos(Substring,String)
Verknüpfung
Hiermit möchte ich nur nochmal kurz die einzelnen Möglichkeiten zur Bearbeitung des Strings anzeigen.
Da ein String nichts anderes als eine Zeichenkette ist, kann man beliebig Zeichen dranhängen. Dies geschieht mit dem Zeichen +. Dabei ist nur eine Besonderheit zu beachten. Möchte man reine Zeichen anhängen, so muss man sie in ' ' schreiben, will man jedoch einen ganzen Sring oder Teile eines String anhängen, reicht der Name. Zahlen werden also auch in ' ' eingefügt, da sie ja nichts anderes als Zeichen sind.
Zum Beispiel ... var a: String; begin a := 'T' + 'e' + 's' + 't'; end; ...
a hat nun den Inhalt Test. Kombinieren wir doch nun mal 2 Strings.
Zum Beispiel ... var a,b,c: String; begin a := 'T' + 'e' + 's' + 't'; b := 'erfolgreich'; c := a + b; end; ...
In c steht nun Test erfolgreich.
Procedure
Posted on 7.12.2005 at 13:06 - 0 Kommentare - Link
Was ist eine Procedure?
Eine Prozedur ist im Grunde wie eine Funktion (siehe unter Funktion). Nur, dass sie nichts zurück gibt.
Eine Prozedur wird so deklariert: Procedure name(n:Integer);
Man sieht, dass die Prozedur nichts hinter den Klammern stehen hat.
Beispiel einer Prozedur: Close;
(zum schließen eines Fensters) ist eine Prozedur. Das Besondere an dieser Prozedur ist, dass sie keinen Wert benötigt. Die Prozedur Add('abc') in einer Listbox benötigt einen String (hier ist es "abc"), den sie in die Listbox schreibt.
Eine Prozedur wird so aufgerufen: Name(13); Die Prozedur erhält einen oder mehrere Werte, wie in der Deklaration festgelegt, in den Klammern. Da die Prozedur keinen Wert zurückgibt wird sie auch keiner Variablen zugeweisen.
Function
Posted on 6.12.2005 at 22:16 - 0 Kommentare - Link
Was ist eine Funktion?
Eine Funktion führt Befehle aus und gibt am Ende einen Wert aus, der weiterverwendet werden kann.
Definition einer Funktion: function name(n:Integer):Integer;
Name steht für den Funktionsnamen, mit dem sie gestartet wird. In der Klammer werden, jeweils durch Kommata getrennt, die Parameter, die die Funktion zum arbeiten braucht, definiert (dies macht man wie bei Variablen). Dann kommte ein Doppelpunkt hinter die Klammer und dann die Art von Variable, die die Funktion zurückgeben soll.
Der Wert den die Funktion zurückgeben soll, wird durch folgende Zeile am Ende der Funktion (aber vor dem "end;") festgelegt:
Result := wert;
Beispiel: IntToStr ist auch eine Funktion:
Die Deklaration lautet in diesem Fall: IntToStr(n:Integer):String;
Wie verwendet man eine Funktion: Eine Funktion wird wie durch IntToStr bekannt werwendet.
a := IntToStr(13);
a ist ein String, dem der Wert, den die Funktion zurückgibt, zugewiesen wird. In die Klammer müssen je nach Funktion die Parameter eingegeben werden. In diesem Fall ist es ein Integer.
Variablen
Posted on 6.12.2005 at 22:16 - 0 Kommentare - Link
Globale/Lokale
Die Meisten kennen sicher noch nicht den Unterschied, das wollen wir nun hier ändern. Man hat zwei Möglichkeiten, eine Variable zu definieren. Zum einem global. Dazu schreibt man unter
var Form1: TForm1;
seine Variable rein.
z.B:
var Form1: TForm1; Test : Integer;
Nun hat man eine globale Variable. Eine Lokale wird vor dem begin einer procedure definiert.
z.B:
procedure TForm1.Button1Click(Sender: TObject); var Test: Integer; begin
end;
Aber wo ist denn nun der Unterschied? Man kann mit beiden ganz normal rechnen, sie werden auch genau gleich angesprochen. Der große Unterschied liegt darin, das jede procedure auf eine globale Variable zugreifen kann, während eine lokale Variable jeweils nur von der procedure benutzt werden kann, in die sie reingeschrieben wurde. HÄ???? Ganz einfach, wenn man zum Beispiel mit einem Knopfdruck eine Rechnung durchführen möchte und die Rechnung ist nach dem Drücken auch fertig, dann ist es uns egal, was mit dem Ergebnis passiert. Wir brauchen es nicht mehr (natürlich haben wir es ausgegeben, sonst wäre ja die Rechnung schön blöd gewesen) und deshalb bleibt die Variable in der procedure. Bei einer globalen Variable kann wie gesagt jede procedure drauf zugreifen. Zum Beispiel haben wir eine Seite von einem Quadrat (gibt ja nur eine^^). Jetzt haben wir mehrere Knöpfe, die jeweils den Umfang, den Flächeninhalt oder sonstwas berechnen. Mit einer globalen Variable müssen wir die Seite nur einmal einlesen, und jede einzelne procedure kann dann darauf zugreifen. Der Nachteil ist, das bei einer falschen Programmierweise diese Variable schon mal überschrieben wird und bei einem längeren Programm gestaltet sich das Fehlerfinden recht schwer.
Anmerkung: Einige Funktionen wie die for-Schleife benötigt eine lokale Variable, da kann man sie auch noch so oft global definieren, es wird nie klappen.
Größe von Variablen
Es gibt verschiedene Arten von Variablen. Unter Variabeln werden erstmal die reinen Variablen aufgezählt, Strings und Array bekommen einen eigenen Abschnitt.
Integer -2 147 483648 bis 2 147 483 647 ShortInt -128 bis 127 Byte 0 bis 255 Extended 3.4*10^-4932 bis 1.1*10^4932 Real keine Ahnung
Allgemeines
Posted on 6.12.2005 at 22:16 - 0 Kommentare - Link
Unter diesem Punkt werden erstmal grundsetzliche Dinge vorgestellt.
Kurzübersicht über diese Seite
Posted on 6.12.2005 at 20:32 - 0 Kommentare - Link
Diese Seite dient zum besseren Verständnis bei einigen Delphiproblemen. Bei Fragen bitte im "Forum" posten, wir werden sie so schnell wie möglich beantworten.
Auf dieser Seite werden die Quelltexte von Problemen mit Erklärung aufgeschrieben, zudem aber auch allgemeine Sachen.
Die meisten Probleme sind dabei aus dem Informatik Unterricht der 12. Klasse, aber es gibt auch Probleme die nicht im Unterricht behandelt wurden, sondern als private Projekt.
Die Projekte haben wir eigentlich dazu gelöst, zu sehen, ob wir diese schaffen können.
Besonders möchte ich noch auf einen Helfer hinweisen, der uns beiden sowohl bei dem graphisches Layout als auch bei meiner katastrophalen Orthographie geholfen hat und uns mit seinem Einsatz diesen Blog verschönert hat: Benny
Viel Spass
Euer M&M-Team
PS: Da ich aber schneller schreibe, als er korrigieren kann, sind noch immer einige auf der Strecke... Ich bitte dies einfach zu übersehen...
|