Einzelnen Beitrag anzeigen

guidok

Registriert seit: 28. Jun 2007
417 Beiträge
 
#9

Re: Datenbankanwendung sauber strukturieren und programmiere

  Alt 14. Nov 2008, 14:36
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...
  Mit Zitat antworten Zitat