Om het even samen te vatten, hierbij een testprogrammaatje. Begin een nieuwe Applicatie, zet een Button en een Memo op je form, kopieer onderstaande code in je editor en wijs OnCreate, OnDestroy en Button1.OnClick toe:
Delphi Code:
unit Unit1;
interface
uses
SysUtils, Classes, Forms, StdCtrls, Controls;
type
PKoe = ^TKoe;
TKoe = record
Big: Integer;
Neus: Integer;
Jantje: String;
end;
TForm1 = class(TForm)
Memo1: TMemo;
Button1: TButton;
procedure FormCreate(Sender: TObject); { Form1.OnCreate event handler }
procedure FormDestroy(Sender: TObject); { Form1.OnDestroy event handler }
procedure Button1Click(Sender: TObject); { Button1.OnClick event handler }
private
FList: TList;
procedure AddItem(ABig, ANeus: Integer; const AJantje: String);
procedure ClearItems;
function FindItemForBig(ABig: Integer): PKoe;
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.AddItem(ABig, ANeus: Integer; const AJantje: String);
var
Koe: PKoe;
begin
Koe := New(PKoe);
Koe^.Big := ABig; { Dit is de officiële notatie }
Koe.Neus := ANeus; { Maar dit mag ook, de compiler snapt dat je ^ bedoeld }
Koe.Jantje := AJantje;
FList.Add(Koe);
end;
procedure TForm1.Button1Click(Sender: TObject); { Het e.e.a. eens even testen }
var
Koe: PKoe;
Index: Integer;
begin
AddItem(10, 11, 'Aap');
AddItem(12, 13, 'Noot');
AddItem(14, 15, 'Mies');
AddItem(16, 17, 'Laatste');
Koe := FindItemForBig(15);
if Koe = nil then
Memo1.Lines.Add('Big = 15 niet gevonden');
Koe := FindItemForBig(14);
if Koe <> nil then
begin
Memo1.Lines.Add('Als Big = 14, dan is Jantje: ' + Koe.Jantje);
Index := FList.IndexOf(Koe);
Memo1.Lines.Add('En de index daarvan in FList = ' + IntToStr(Index));
end;
end;
procedure TForm1.ClearItems;
var
i: Integer;
begin
for i := 0 to FList.Count - 1 do
Dispose(PKoe(FList[i]));
end;
function TForm1.FindItemForBig(ABig: Integer): PKoe;
var
i: Integer;
begin
Result := nil;
for i := 0 to FList.Count - 1 do
if PKoe(FList[i]).Big = ABig then
begin
Result := FList[i];
Break;
end;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
FList := TList.Create;
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
ClearItems;
FList.Free;
end;
end.
Zo zie je IndexOf aan het werk.
Let op dat dit nog geen waterdichte implementatie van TList van records is!! Zo mag je bijvoorbeeld nooit FList.Delete(Index) gebruiken, want de pointer wordt daarmee uit de lijst verwijderd, maar het geheugen waar die pointer naar verwijst niet. Om een volledig verantwoorde TList van records te maken, moet je eigenlijk je eigen afstammeling van TList maken.
Afijn, tot zover de theorie. Ik begrijp dat je liever een TList dan een Array wilt gebruiken, want TList is gewoon zoveel handiger. Echter, het vraagt dus wel wat aandacht om een TList voor het beheren van records te maken.
Waar wil je dit voor gaan gebruiken? Moet je je gegevens in records opslaan, of mogen dat ook objecten zijn?
Bookmarks