Announcement

Collapse
No announcement yet.

Formular und Datenmodul zur Laufzeit n-fach erzeugen (Inhalt gleich)

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

  • Formular und Datenmodul zur Laufzeit n-fach erzeugen (Inhalt gleich)

    Hallo,

    ich habe folgendes Problem.

    Meine MainForm sowie das HauptDatenmodul wird automatisch beim start der Anwendung erzeugt (Projekt/Optionen Register Formulare).

    Mit einem Login Dialog in der Hauptform meldet der Anwender sich am Interbase Server an.

    In der Mainform wird dem Anwender eine Liste von Projekten angezeigt.

    Mit einem doppelklick auf einen Eintrag wird eine Detailform geöffnet.

    Das es möglich sein soll, dass mehrer dieser Detailsforms zu öffnen sind, muss ich auf ShowModal und Free verzichten. Das Freigeben der Form ist anders geregelt.

    Ich erzeuge also diese Form, in dem OnCreate dieser Form wird ein weiteres Datenmodul erzeugt. Als nächstes wird die Transaction gestartet, Params der IBDataset Komponente gesetzt und Active=True gesetzt.
    Die Daten erscheinen in der Detailform. Dies sind DBEdits, DbMemos usw. mit einer Datasource verbunden und diese wiederrum mit der IBDataset.

    Minimiere ich diese Detailform und möchte aus der MainForm nun eine weitere Detailform öffnen, so erscheinen die Daten der zuvor geöffneten Form. Die Caption der Form hingegen wird per Hand upgedatet. Dort wird u. a. über DMDetails.IBDataset1.Fields[0].AsInteger die ProjektId angezeigt. Diese hat den richtigen Wert die DBEdits jedoch nicht.

    Folgendes ist mir noch aufgefallen:

    Setze ich nach dem Active := True der IBDataset eines der DBEdit.Datasource.Dataset auf die Dataset so ist der Effekt genau umgedreht. Die neuen Daten werden in der zweiten Detailform angezeigt, jedoch auch in der alten.

  • #2
    Musste man nicht für jede Instanz eines Datenmoduls eine eigene TSession verwenden

    Comment


    • #3
      Das Problem hier ist die Bindung zwischen Datenmengen und DatawareControls über den Propertyeditor.
      Ich nehme mal an deine TDatasources liegen auf dem Datenmodul(das Problem ist aber ähnlich wenn sie auf der Form liegen).
      Die Zuweisung erfolg über den Namen(TComponent.Name) der Datasource auf dem Datanmodul also nach dem Schema MyDatamodule.MyDatasource (Der wird im DFM gespeichert und kann deshalb ja nur ein String sein). Der Name einer Komponente/Form muß eindeutig sein.

      Wenn ein 2.tes Datenmodul des obigen Typen erzeugt wird heißt dieses deshalb MyDatamodule1 alle DataAware Controls gucken aber natürlich auf MyDatamodule da dessen Name ja in der entsprechenden Property eingetragen ist.
      Wenn nun eine Form erzeugt wird mit Controls die MyDatamodule referenzieren finden sie natürlich die zuerst erzeugte mit dem richtigen Namen obwohl man eigentlich eine später erzeugte Instanz meinte.

      Daraus folgen 2 Lösungsmöglichkeiten.

      a. Alle formübergreifenden Verknüpfungen zwischen Datenmodul und der dazugehörenden Form müssen im Code zugewiesen werden. Da hier direkt konkrete Instanzen zugewiesen werden ist dann der Name egal.

      b. Immer dafür sorgen das ein neu erzeugtes Datenmodul den richtigen Namen hat.

      Das sähe zum Beispiel so aus.

      1. Datenmodul erzeugen.
      2. Form erzeugen.
      - Die Controls finden das richtige Datenmodul und hängen sich dort an die richtige Datasource)
      3. Datenmodul umbenennen.
      - Wenn jetzt wieder ein Datenmodul erzeugt wird erhält es den richtigen Namen da dieser Name ja jetzt frei ist und kann bei der nächsten erzeugten Form richtig zugeordnet werden.

      Gruß
      Ral

      Comment


      • #4
        Hallo, Ralf,

        vielen Dank für deine Antwort. Ich habe es gleich ausprobiert und selbst verständlich hat es nun funktioniert.

        Danke nochmals.

        Gruß Ren

        Comment

        Working...
        X