Zitat von
Elvis:
Wenn du < 20 Elemente hast, vielleicht. Aber wahrscheinlich nicht. Die Zeiten ändern sich, mit den flachen Adressräumen wurden linked Lists immer unbedeutender. Ein array-basierter Container wie die TList-Ableitungen wäre schon mehr als OK.
Du fährst aber definitiv besser wenn du deine Daten als Instanzen von Klassen abbildest. Records/Structs haben ihre Berechtigungen IMHO nur, wenn man mit einem Speicherbereich fixer Größe arbeiten muss, der in fest vorgechriebene Felder unterteilt wird. Zum Beispiel für API calls.
Eine Instanz einer Klasse kostet dich eigentlich nur ihren VMT-Pointer als Overhead, dafür gewinnst du neben Polymorphie noch einiges an Unterstützung des Compilers.
So ich habe versucht den Tip mit der Instanz der Klasse umzusetzen.
Ich hoffe ich habe das in etwa richtig gemacht.
Code Form1
Delphi-Quellcode:
implementation
uses Termin;
{$R *.dfm}
var Liste: TList;
index: integer;
procedure TForm1.NewItem(
name, nr:
String);
begin
Liste.Add(TTermin.Create(
name,nr));
Label2.Caption:= IntToStr(
index);
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
Liste:= TList.Create;
index:= 0;
end;
procedure TForm1.Button1Click(Sender: TObject);
var name, nr:
string;
begin
name:= Edit1.Text;
nr:= Edit2.Text;
NewItem(
name,nr);
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
Edit1.Text:= TTermin(Liste[
index]).
name;
Edit2.Text:= TTermin(Liste[
index]).nr;
end;
procedure TForm1.Button3Click(Sender: TObject);
begin
Edit1.Clear;
Edit2.Clear;
end;
procedure TForm1.Button5Click(Sender: TObject);
begin
if(
index < Liste.Count -1)
then
inc(
index);
Label2.Caption:= IntToStr(
index);
self.Button2.Click;
end;
procedure TForm1.Button4Click(Sender: TObject);
begin
if(
index > 0)
then
dec(
index);
Label2.Caption:= IntToStr(
index);
Self.Button2.Click;
end;
Code der Klasse
Delphi-Quellcode:
unit Termin;
interface
type
TTermin =
class(TObject)
private
{ Private-Deklarationen }
FName:
String;
FNr:
String;
public
{ Public-Deklarationen }
property Name:
String read FName
write FName;
property nr:
String read FNr
write FNr;
Constructor Create(
Name, nr:
String);
end;
implementation
Constructor TTermin.Create(
Name, nr:
String);
begin
inherited Create;
FName:=
Name;
FNr:= nr;
end;
end.
Jetzt ist mir einfach nicht ganz klar wie ich die Instanzen wieder freigebe, reicht es wenn ich alle Objects in meiner Liste mit Free freigebe und anschliessend die Liste selbst mit Free freigebe?
grz zer00