Delphi Arrays
Aus WikiSchool
Dieser Beitrag ist ein Referat und wurde unter der GNU-Lizenz für freie Dokumentation veröffentlicht. Autor: Robert Pfau |
Anmerkung: Aufgabenstellung war es den anderen Schülern die Elemente Arrays und den Baustein TListbox anhand eines Beispielprogramms näher zu bringen. Hauptleistung waren 2 komplette Schulstunden zu halten, das folgende ist nur das Handout.
Arrays
Arrays dienen dazu viele Daten eines einzelnen Datentyps kompakt zu speichern. Der Zugriff auf die Elemente eines Arrays erfolgt mittels Arraynamen sowie einem Index am Ende in eckiger Klammer.
Array[0], Array[255]
Deklaration eines Arrays:
var IntegerArray: array [0..9] of integer;
heißt also dass ein Array mit dem Namen IntegerArray und 10 Werten (0 bis 9) vom Typ Integer angelegt wird.
Über den Index kann man auf sie zugreifen.
IntegerArray[0] := 0; IntegerArray[1] := 1; ... IntegerArray[9] := 9;
Das befüllen eines Arrays welches oft vielehundert Datenwerte beinhaltet kann recht mühsam sein. Deshalb werden Arrays typischerweise durch Schleifen gefüllt. z.B.
for i := 0 to 9 do IntegerArray[i] := i;
Auch Strings können in ein Array geschrieben werden.
var StringArray: array [0..9] of string;
StringArray := ('Hund','Katze','Maus'); // StringArray[0] ist also Hund, [1] = Katze und [2] = Maus
Der Vorteil von Arrays ist die komfortable Art Daten zu speichern. Nachteil ist jedoch ein hoher Speicherverbrauch bei falscher Anwendung. Ausserdem kann die Größe zur Laufzeit nicht geändert werden.
Aus diesem Grund hat man dynamische Arrays eingeführt. Sie werden fast gleich deklariert
var DynArray: array of integer;
Das Array ist jetzt zwar angelegt, aber eine Information über seine Größe ist nicht vorhanden. Diese muss man erst zur Laufzeit mit dem Befehl
SetLength(DynArray, 10);
festlegen.
Ist man sich über die Größe eines Arrays im Unklaren, so kann man diese mit dem Befehl
Length(DynArray);
abfragen. Der Rückgabewert dieser Funktion ist vom Typ "SmallInt".
Die Länge des Arrays kann auch während der Laufzeit jederzeit geändert werden, falls plötzlich weniger Werte gebraucht werden.
SetLength(DynArray, 5);
die letzen 5 Werte wurden jetzt also ins Nirvana geschickt. Vergrößert man ein Dynamisches Array so sind die hinteren Stellen mit undefinierten Werten gefüllt. Es gibt auch mehrdimensionale Arrays, man benötigt also 2 Indexangaben ähnlich wie in einem Koordinatengitter
var ZweiDimArray: array [0..9, 0..9] of integer;
/ | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
0 | 00 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 |
1 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 |
2 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 |
3 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 |
4 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 |
5 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 |
6 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 |
7 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 |
8 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 |
9 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 |
Angesprochen werden diese Arrays wie die eindimensionalen auch ZweiDimArray[0,0] := Wert00; oder ZweiDimArray[0][0] := Wert00;
Man kann auch höherdimensionale Arrays dynamisch aufbauen.
var nDimDynArray : array of array of integer;
nun muss man mit SetLength 2 Dinge festlegen
SetLength(nDimDynArray,n); //n = Zahl
nun muss noch die 2. Länge jedes einzelnen Teilarrays festgelegt werden.
SetLength(nDimDynArray[i],n);
Beispiel:
var nDimDynArray : array of array of integer; Setlength(nDimDynArray,3); SetLength(nDimDynArray[0],1); SetLength(nDimDynArray[1],4); SetLength(nDimDynArray[2],2); //würde folgendes Array produzieren. X XXXX XX
In anderen Programmiersprachen (Perl,PHP) gibt es noch die assoziativen Arrays, wo statt Indizes Variablennamen verwendert werden, diese gibt es in Delphi aber nicht...
Um in Delphi Daten durch Strings zu indizieren, können TStrings und seine Nachfahren verwendet werden (z.B. TStringList)
TListBox
Sie ist eine Standardkomponente und man kann sie gut bei der Ausgabe von vielen Daten anwenden. Da sie einzelne Daten immer als getrennte Zeile ausgibt braucht man keine gesonderten Zeilenumbrüche einzufügen wie bei der MemoBox
Die TlistBox hat einige wichtige Befehle (Methoden).
ListBox1.Clear; löscht alle Einträge
ListBox1.Items.Add(s); fügt s hinten an die Liste an.
sowie
ListBox1.Delete(i); löscht den Eintrag an der i-ten Stelle.
ListBox1.Items.Insert(i,s); fügt s an der i-ten Stelle ein.
Projekt Mauspos
Das Programm Mauspos dient dazu die aktuelle Mausposition anzuzeigen sowie die aufzuzeichnen und auch wieder abzuspielen.
Das ganze funktioniert folgendermaßen:
über die Funktionen GetMousePos(p) und SetMousePos(i,i) werden die Mauspositionen abgefragt bzw gesetzt
Die abgefragten X und Y-Werte werden in zwei eindimensionale oder ein zweidimensionales Array geladen.
(Alles auskommentierte ist die Version mit einem zweidimensionalen Array.)
Für das Projekt braucht man 3 EditFelder, 3 Buttons, sowie eine TlistBox (Edit1-3,Button1-3,Listbox1)
unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) Edit1: TEdit; Button1: TButton; Button2: TButton; Button3: TButton; ListBox1: TListBox; Edit2: TEdit; Label1: TLabel; Label2: TLabel; Edit3: TEdit; procedure FormMouseMove(Sender: TObject; Shift: TShiftState; X,Y: Integer); procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); procedure Button3Click(Sender: TObject); procedure Edit2Change(Sender: TObject); procedure FormShow(Sender: TObject); procedure Edit3Change(Sender: TObject); private { Private-Deklarationen } public { Public-Deklarationen } end; var Form1: TForm1; Arrayx : array of integer; Arrayy : array of integer; //dimarray : array [0..99,0..1] of integer; delay : integer ; time : integer ; implementation {$R *.dfm} procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); var p : TPoint; begin GetCursorPos(p); Edit1.Text := IntToStr(p.X)+' | '+IntToStr(p.Y); end; procedure TForm1.Button1Click(Sender: TObject); var i : integer; begin ListBox1.Clear; for i := 0 to time do begin Listbox1.Items.Add(IntToStr(i)+'. '+IntToStr(Arrayx[i])+' | '+IntToStr(Arrayy [i])); //Listbox1.Items.Add(IntToStr(i)+'. '+IntToStr(dimArray[i,0])+' | '+IntToStr (dimArray[i,1])); end; end; procedure TForm1.Button2Click(Sender: TObject); var p : TPoint; i : integer; begin SetLength(arrayx,time+1); SetLength(arrayy,time+1); for i := 0 to time do begin GetCursorPos(p); Arrayx[i] := p.X; Arrayy[i] := p.Y; {dimarray[i,0] := p.X; dimarray[i,1] := p.Y;} sleep(delay); end; end; procedure TForm1.Button3Click(Sender: TObject); var i : integer; begin for i := 0 to time do begin SetCursorPos(Arrayx[i],Arrayy[i]) ; //SetCursorPos(dimArray[i,0],dimarray[i,1]) ; sleep(delay); end; end; procedure TForm1.Edit2Change(Sender: TObject); begin delay := StrToInt(Edit2.Text); end; procedure TForm1.Edit3Change(Sender: TObject); begin time := StrToInt(Edit3.Text); end; procedure TForm1.FormShow(Sender: TObject); begin delay := StrToInt(Edit2.Text); time := StrToInt(Edit3.Text); end; end. |