Announcement

Collapse
No announcement yet.

Datenmodul in MDI-Anwendungen

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Datenmodul in MDI-Anwendungen

    Hallo Andreas,
    in deinem neuen Buch beschreibst du wie man in einer MDI-Anwendung mehrere Sichten auf eine Tabelle bekommt (Kap. 7.4). Mein Problem: Ich möchte zuerst in einem MDI-Fenster alle Datensätze in einem Grid darstellen und der Benutzer kann dann einen Datensatz wählen, um ihn in einem nicht-MDI-Fenster ändern zu können. In diesem Nicht-MDI-Fenster muss ich trotzdem auf die Tabelle zugreifen können (Felder berechnen, Datenüberprüfung,..). Nur fehlt mir jetzt der Bezug zu der Tabelle in DataModuleMDI. Eine Möglichkeit wäre, in die nicht-MDI-Form eine Instanz Table : TTable und vor dem Aufruf der nicht-MDI-Form die Zuweisung
    Table:=DMChild.Table1. Dies funktioniert auch, allerdings muss ich nun immer mit Table.FieldByName('...').Value auf die Daten in Table zugreifen.
    Kennst du eine Möglichkeit, direkt auf die Table1 im DataModuleMDI zuzugreifen?

    Danke Stefan

  • #2
    Hallo,

    ich komme erst heute dazu, diese Frage zu beantworten. Ich bin mir zudem nicht ganz sicher, ob ich Dein Ziel richtig verstanden habe. Die Lösung, die ich gleich im Sourcecode vorstelle, geht von dem folgenden Ansatz aus: <br>
    1. Ein MDI-Childfenster wird geöffnet, der User wählt einen Datensatz aus. <br>
    2. Aus dem MDI-Childfenster heraus wird ein normales Formular aufgerufen. <br>
    3. Das aufgerufene Formular soll exakt den Datensatz anzeigen, der im MDI-Child ausgewählt wurde. <br>
    4. Dieser Datensatz soll auch editierbar sein.<br>

    Damit bleiben 2 Aufgaben übrig: Es muss ein normales Formular aufgerufen werden und dieses Formular muss auf die TTable-Instanz des MDI-Childfensters zugreifen.

    <b>Implementierung im normalen Formular</b>:

    Das normale Formular verwendet einen <b>überladenen</b> Constructor und bekommt dabei die vom MDI-Child verwendete TTable-Instanz als zweiten (neuen) Parameter übergeben. Somit kann die TDataSource-Instanz im normalen Formular direkt mit der TTable-Instanz aus dem MDI-Child (Datenmodul) verbunden werden:
    <pre>
    unit FrmNoMDI;

    interface

    uses
    Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
    StdCtrls, Db, DbTables, ExtCtrls, DBCtrls, Grids, DBGrids;

    type
    TFormNoMDI = class(TForm)
    DBGrid1: TDBGrid;
    DBNavigator1: TDBNavigator;
    DataSourceNoMDI: TDataSource;
    ButtonClose: TButton;
    procedure ButtonCloseClick(Sender: TObject);
    private
    { Private-Deklarationen }
    FTable : TTable;
    public
    { Public-Deklarationen }
    constructor Create(AOwner: TComponent;
    ATable: TTable); reintroduce; overload;
    end;

    var
    FormNoMDI: TFormNoMDI;

    implementation

    {$R *.DFM}

    constructor TFormNoMDI.Create(AOwner: TComponent; ATable: TTable);
    begin
    FTable := ATable;
    inherited Create(AOwner);
    DataSourceNoMDI.Dataset := FTable;
    end;

    procedure TFormNoMDI.ButtonCloseClick(Sender: TObject);
    begin
    DataSourceNoMDI.Dataset := nil;
    Close;
    end;

    end.
    </pre>

    <b>Implementierung im MDI-Child</b>:

    Da das Formular im Constructor die jeweils aktuelle TTable-Instanz übergeben muss, darf das Formular nicht gleich beim Programmstart erzeugt werden (d.h. es ist aus der Liste der automatisch erzeugten Formulare zu entfernen). Eine Instanz des normalen Formulars wird immer dann neu erzeugt, wenn das Fenster aufgerufen wird. Damit wird die aktuelle TTable-Instanz aus dem dem MDI-Child zugeordneten Datenmodul verwendet:

    <pre>
    procedure TMDIChild.Button1Click(Sender: TObject);
    begin
    FormNoMDI := TFormNoMDI.Create(self, DMChild.Table1);
    try
    FormNoMDI.ShowModal;
    finally
    FormNoMDI.Release;
    end;
    end;
    </pre>

    Die Lösung geht davon aus, das das MDI-Childfenster (und damit das erst zur Laufzeit erzeugte Datenmodul) <b>nicht vor</b> dem normalen Formular geschlossen werden kann. Daher auch der modale Aufruf des normalen Formulars.
    &#10

    Comment


    • #3
      Vielen Dank, dies ist die Lösung.

      Stefa

      Comment

      Working...
      X