Einzelnen Beitrag anzeigen

urs.liska

Registriert seit: 6. Aug 2003
Ort: Freiburg
195 Beiträge
 
Delphi 6 Professional
 
#1

Dynamisch erzeugte Datenmodule

  Alt 6. Aug 2003, 22:41
Hallo,

ich habe eine Frage, die mit dem ökonomischen und sinnvollen Design einer Datenbankanwendung zusammenhängt.
Ich arbeite an einer Datenbank, die mich seit längerem begleitet und wohl auch noch einige Zeit wichtig sein wird.
Ich hatte sie zunächst als Paradox-DB angelegt und auch eine halbwegs funktionierende Anwendung dazu geschrieben (und dabei Delphi gelernt). Jetzt habe ich eine neue, erweiterte Firebird-DB daraus gemacht(mit ca. 40 Tabellen) und die Daten auch schon übertragen.
Da es nun doch eine etwas größere Sache ist, möchte ich die neue Anwendung sorgfältiger planen und möglichst sinnvoll mit Vererbung arbeiten, um einheitliches Verhalten und Aussehen sowie leichtere Wartbarkeit zu erreichen.

Für die Bearbeitung der Daten möchte ich folgende Konstruktion erreichen:
1) Ein Formular, das die ganze Tabelle in Auszügen (typischerweise ein Schlüsselfeld und ein Erkennungsfeld (z.B. Autor und Titel bei einer Literaturliste)) darstellt (abgeleitet von einer Klasse TCustomDatasetForm). Hier kann z.B. ein bestimmter Datensatz gesucht werden oder eine Selektion für einen Export durchgeführt werden.
2) Eine weitere Formularklasse, die eine Maske für jeweils einen Datensatz bereitstellt (abgeleitet von TCustomRecordForm).
3) Ich möchte dazu jeweils Datenmodule verwenden (Zwecks Trennung von Design und Inhalt).
4) Es sollen beliebig viele Datensätze (also Formulare) geöffnet sein können. Daher verwaltet das Tabellenformular 1) eine Liste der geöffneten Datensatzformulare, so dass ich etwa eine solche Methode verwenden könnte:

Delphi-Quellcode:
function TCustomDatasetForm.Edit(AKey: integer): boolean;
var rf: TCustomRecordForm;
begin
  result := false;
  rf := RecordForm(AKey); { gibt das Datensatzformular oder nil zurück, = Prüfung, ob der Datensatz bereits offen ist }
  if rf = nil then
  begin // Datensatz erzeugen, in Liste einfügen und anzeigen
    rf := FRecordFormClass.Create(Self); //FRecordFormClass wird im Konstruktor gesetzt
    Datensaetze.Add(rf);
    rf.Edit(AKey); // kümmert sich um die Anzeige des Formulars
  end
  else // Datensatz schon offen, lediglich das Formular anzeigen
  begin
    if rf.visible then rf.BringToFront
    else rf.Show;
  end;
end;
Zu diesem Zweck benutze ich keine globale Variable für das Datensatzformular, sondern erzeuge es dynamisch.
Mit dem dazugehörigen Datenmodul könnte ich es genauso machen. Ich würde dafür ein Feld FDatenModul: TDataModule in die Datensatzformularklasse einbinden, so dass ich etwa folgende Aufrufe machen könnte:
Delphi-Quellcode:
constructor TVonCustomRecordFormAbgeleiteteKlasse.Create(AOwner: TComponent);
begin
  inherited;
  FDatenModul := TDatenmodulFuerDiesenDatensatztyp.Create(Self);
  ...
  FDatenModul.MainDataSet.Active := true;
  ...
  FDatenModul.BeliebigeDortDefinierteMethode;
end;
Meine Frage ist jetzt, inwiefern ich dann noch in der IDE Zugriff auf das Datenmodul haben kann. Wenn ich ein datensensitives Steuerelement auf einem Formular ablege und im OI die DataSource etc. einstellen will, habe ich doch Zugriff auf alle Komponenten im selben Formular oder in Formularen/Datenmodulen, die ich über die uses-Klausel eingebunden habe (?), und letztere werden über ihre globale Variable angesprochen, die Delphi automatisch erzeugt (?).
Kann ich denn die visuellen Programmierhilfen beim Entwurf meines Formulars überhaupt in Anspruch nehmen? Ich will doch (soweit ich es verstehe) keine Verbindung der Steuerelemente mit dem globalen Datenmodulobjekt, sondern für jede Instanz des Formulars mit dem jeweils dynamisch erzeugten Datenmodul. Oder habe ich da etwas ganz falsch verstanden?
Ich könnte mir vorstellen, auf die Datenmodule zu verzichten; letztlich ließe sich alles wohl auch innerhalb des Formulars realisieren (zumal die Erzeugung jeweils eigener Datenmodul-Instanzen auch Overhead mit sich bringt). Aber erstens scheint es mir ratsam, auch hier die Trennung von GUI und Datenbank-Logik aufrecht zu erhalten - und zweitens würde ich bei dieser Gelegenheit wirklich gerne einen Schritt mehr über OOP verstehen.

Es wäre klasse, wenn sich jemand die Mühe machen könnte, meine (zugegebenermaßen lange) Frage durchzulesen und mich auf den richtigen Weg zu bringen.

MFG
Urs
  Mit Zitat antworten Zitat