Ich probiere gerade etwas herum und habe nun den vorhin beschriebenen Weg eingeschlagen. Momentan existiert nur ein unvollständiges Grundgerüst, das derzeit nur die Funktionalität bietet Daten(objekte) der Liste hinzuzufügen.
Das Lesen und Schreiben der Daten in eine
DBMS fehlt noch komplett, aber ich will mal langsam beginnen.
Delphi-Quellcode:
type
TDAORec = class(TObject)
private
FModified: Boolean;
FPrimaryKey: Integer;
public
procedure Assign(ARec: TDAORec); virtual;
end;
TDAORecType = class of TDAORec;
TDAO = class(TObject)
private
FRecType: TDAORecType;
FRecList: TObjectList;
function GetRec(AIndex: Integer): TDAORec;
function GetCount: Integer;
public
constructor Create(ADAORecType: TDAORecType);
destructor Destroy; override;
function AddRec(var ARec: TDAORec): Integer;
property Rec[AIndex: Integer]: TDAORec read GetRec; default;
property Count: Integer read GetCount;
end;
//==============================================================================
// T D A O R e c
//==============================================================================
procedure TDAORec.Assign(ARec: TDAORec);
begin
end;
//==============================================================================
// T D A O
//==============================================================================
constructor TDAO.Create(ADAORecType: TDAORecType);
begin
inherited Create;
FRecType := ADAORecType;
FRecList := TObjectList.Create;
end;
destructor TDAO.Destroy;
begin
FRecList.Free;
inherited;
end;
function TDAO.AddRec(var ARec: TDAORec): Integer;
begin
ARec.FModified := True;
ARec.Assign(ARec);
result := FRecList.Add(ARec);
end;
function TDAO.GetRec(AIndex: Integer): TDAORec;
begin
result := FRecList[AIndex] as TDAORec;
end;
function TDAO.GetCount: Integer;
begin
result := FRecList.Count;
end;
Um das ganze etwas universeller zu haben, ist die Idee dabei, dass ich für jede konkrete Implementation eine neue Klasse für die Datenfelder von TDAORec ableite, in der ich die benötigten Felder anlege und die Methode Assign entsprechend anpasse.
In TDAO sind dann die entsprechenden Methoden, um diese Struktur zu verwalten.
Delphi-Quellcode:
TTestRec = class(TDAORec)
Feld1: String;
Feld2: String;
procedure Assign(ARec: TDAORec); override;
end;
TForm1 = class(TForm)
Edit1: TEdit;
Edit2: TEdit;
Button1: TButton;
Label1: TLabel;
ListBox1: TListBox;
procedure FormCreate(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure FormDestroy(Sender: TObject);
private
{ Private-Deklarationen }
DAO: TDAO;
public
{ Public-Deklarationen }
end;
procedure TTestRec.Assign(ARec: TDAORec);
begin
if ARec is TTestRec then
begin
Feld1 := TTestRec(ARec).Feld1;
Feld2 := TTestRec(ARec).Feld2;
end;
inherited;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
i: Integer;
Rec: TTestRec;
begin
Rec := TTestRec.Create; //Die erzeugten Objekte werden von TDAO wieder freigegeben
Rec.Feld1 := Edit1.Text;
Rec.Feld2 := Edit2.Text;
//Datensatz hinzufügen
DAO.AddRec(TDAORec(Rec)); //Der Typecast gefällt mir nicht
//Nur zum Testen:
//Anzahl der Datensätze
Label1.Caption := IntToStr(DAO.Count);
//Inhalt der Datensätze
Listbox1.Clear;
for i := 0 to DAO.Count - 1 do
begin
Rec := TTestRec(DAO[i]); //Der Typecast gefällt mir nicht
Listbox1.Items.Add(Rec.Feld1 + ' ' + Rec.Feld2);
end;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
DAO := TDAO.Create(TTestRec); //Übergabe des Types für einen Datensatz
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
DAO.Free;
end;
Leider sind hier noch einige Typecasts notwendig, die ich gerne weg haben möchte (dafür wollte ich irgendwie die Klassenreferenz TDAORecType verwenden, aber ich komm damit nicht weiter). Kann sich mal ein Profi meiner annehmen und mich auf den rechten Weg bringen? Evtl. ist das ja auch alles Quatsch, was ich hier fabriziere und ich sollte wie immer rumwursteln...