Delphi Arrays

Aus WikiSchool

Dieser Beitrag ist ein Referat und wurde unter der GNU-Lizenz für freie Dokumentation veröffentlicht.

Autor: Robert Pfau
Jahr: 2005 / Klasse 12/13
Fach: CT
Erreichte Punktzahl: 15
Schule: JZGS


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.
Eingeloggt werbefrei.



Links

Originelle Geschenke und Geschenkideen online finden.
Ansichten
  • Seite
  • Diskussion
  • Quelltext betrachten
  • Versionen/Autoren
Persönliche Werkzeuge
  • Anmelden
Navigation
WikiSchool
Benutzer
  • Spielwiese
  • Hilfe
  • Benötigte Artikel
  • MultiDateiUpload
Googlesuche

Web WikiSchool
Werkzeuge
  • Links auf diese Seite
  • Änderungen an verlinkten Seiten
  • Hochladen
  • Spezialseiten
  • Druckversion
  • PDF