![]() |
Woher kommt globale Variable für Datenmodule
Hallo,
ich bräuchte etwas Aufklärung. Ich mach gerade ein umfangreiches Refactoring einen Fremdprojektes. Hier sind zur Entwurfszeit z.B. Grids mit DataSource aus einem DataModule verbunden. Was ich nich ganz begreife :oops: ist: Wenn ich ein DataModule habe: TDMKunde und die globale Variable DMKunde: TDMKunde in der Unit des DM lösche, woher nimmt der Designer das DMKunde? In der dfm stehft immer noch z.B. DataSource = DMKunde.qryKunde, und im Designer kann ich es noch genauso auswählen... Es funktioniert auch, aber DMKunde gibt es doch eigentlich nicht. Der einzige Hinweis ist in der DPR, aber in den geschweiften Klammern. Kann mir das jemand erklären? Frank |
AW: Woher kommt globale Variable für Datenmodule
Funktioniert es auch im kompiliertem Programm?
|
AW: Woher kommt globale Variable für Datenmodule
Zitat:
|
AW: Woher kommt globale Variable für Datenmodule
Auch beim kompletten Rebuild?
|
AW: Woher kommt globale Variable für Datenmodule
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:
Frank Hab mal ein Beispiel angehangen... [EDIT] Hab grad gesehen, in der DFM steht: object DBAdresse: TDBAdresse Jetzt weiss ich trotzdem noch nicht, wie er das richtige DataModule findet. [/EDIT] |
AW: Woher kommt globale Variable für Datenmodule
Das Thema hatten wir schon mal (finde es aber nicht so schnell).
Ungefähr so müsste es passen: Die IDE kennt die Formulare und die DataModules und versucht, die Verknüpfungen nach dem Laden über FindComponent aufzulösen. Dazu ist eine Variablendeklaration in der Unit nicht notwendig. |
AW: Woher kommt globale Variable für Datenmodule
Hi, Danke schon mal.
Bis jetzt ist es kein Problem, da Formular und dazugehöriges DataModule im Programm nur 1 Mal erzeugt werden können. Das wollte ich nun ändern. Und ich möchte nur sichergehen, das die Zuweisungen aus der DFM immer das DataModule verwenden, welches ich in der Formular - Unit erzeugt habe. Ich erzeuge das so: Basis - Klasse:
Delphi-Quellcode:
In jedem Formular verweist das Propertie DM auf das DataModule.
class function TfrmAppBase.DataModuleClass: TDMBaseClass;
begin Result := Nil; end; ... procedure TfrmAppBase.AfterConstruction; begin inherited; FGridStorage := nil; AppNotifier.AddListener(Self, [aeNewRecordInserted]); if (DataModuleClass <> nil) and AutoCreateDataModule then CreateDataModule; end; ... procedure TfrmAppBase.CreateDataModule; begin assert(DataModuleClass <> nil, 'DataModulclass ist NIL'); FDM := DataModuleClass.GetInstance(Self); AfterDataModuleCreated; UpdateRights; CheckDBControlsDataSource; FDM.Init; end; Wenn nun in der Grid für DataSource DMKunde.dsKunde steht, kann ich dann davon ausgehen, dass er mein im Form erzeugtes DM referenziert? Frank |
AW: Woher kommt globale Variable für Datenmodule
Die globale Variable wird nur benötigt, wenn sie irgendwo im Quelltext angesprochen wird (z.B. in der dpr). Beim Laden der Forms und Datenmodule wird ein anderer Mechanismus verwendet, um die Referenzen auf die Instanzen zu finden. Wichtig ist nur, daß zumindest eine Instanz des Datenmoduls erzeugt wird.
Man beachte, daß das Datenmodul ja auch einen Namen hat, der dem der globalen Variablen entspricht. |
AW: Woher kommt globale Variable für Datenmodule
Ja, aber wenn doch keine Instanz erzeugt wird?
Denn selbst die globale 'DMKunde' wird ja im Hauptprogramm per 'Applicatiom.CreateForm' erzeugt... und wenn die Deklaration entfernt wird (ich würde sie ja nur aus der autom. Erzeugung rausnehmen), dann sollte das doch nicht gehen. Bei mir jedenfalls klappt das nicht, Zitat:
Oder geht es nur um den Designer? |
AW: Woher kommt globale Variable für Datenmodule
Hallo,
ich habe den von Stahli erwähnter Thread ![]() Also wenn ich das richtig verstanden habe, könnte ich doch Probleme bekommen. Nämlich dann, wenn ich das Modul Kunde 2 mal erzeuge. Dann bin ich mir nicht sicher, dass das 2. Kundenmodul sich nicht die erste erzeugte Instanz des Datenmodules greift. Ich werde das einfach mal ausprobieren. Vielen Dank an alle... Frank |
AW: Woher kommt globale Variable für Datenmodule
Keine Bange: Entweder sind die Verknüpfungen zur Laufzeit alle weg (Datasource im Datenmodul), oder es wird nichts angezeigt (Datasource woanders)
Ich mache das häufiger (bzw. habe es früher gemacht): Ein Formular, das Daten anzeigen soll, verwaltet seine eignene Datenmodulinstanz. Alle datensensitiven Steuerelemente sind mit der auf dem Formular plazierten TDataSource-Instanz verknüpft. So geht auch nichts verloren, wenn mal wieder im Designer das Formular aber nicht das Datenmodul geladen ist. Ich habe eine Eigenschaft 'DMKunde : TDMKunde', dessen Setter den TDatasource-Instanzen das jeweilige Dataset explizit zuordnet. Im Designer verwende ich die globale Instanz zum Testen und designen. Per GExperts ('Set Component Properties') sorge ich dafür, das keine Verbindung, keine Query 'aus Versehen' implizit erstellt wird. |
AW: Woher kommt globale Variable für Datenmodule
@@FurtBichler
So werde ich es auch machen. DataSource auf das Formular und die Zuweisung zur Laufzeit auf das erzeugte DM. Ich habe mein Testprojekt so erweitert, das ich die Formulare mehrfach erzeugen kann. Schon beim testen war mir klar, dass es gar nicht anders funktionieren kann. Wenn ich 2 Formulare erzeuge, verwenden logischerweise beide das erste erzeugte Datenmodul, das 2. DM wird nutzlos erzeugt. Ich meine, wenn die DataSource Eigenschaft der Grid im OI zugewiesen wird. Komisch, dass manches - was eigentlich so logisch ist - einen das Hirn so vernebeln kann... Frank |
AW: Woher kommt globale Variable für Datenmodule
Nicht vergessen: Zur Sicherheit die globale Variable umbenennen (ich meine, ich hätte Probleme gehabt, die Deklaration zu entfernen).
Alternativ solltest Du auf keinen Fall (so wie in meinem Beispiel), die Eigenschaft 'DMxxx : TDatenModul' so nennen, wie die globale Variable. Ich bin da mehrmals sowas von auf die Fresse gefallen. Hab heute noch einen Überbiff defwegen. |
AW: Woher kommt globale Variable für Datenmodule
Zitat:
Für den Designer wird allerdings immer eine Instanz erzeugt. In dem Fall ist die dann aber vom Typ TDataModule. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:18 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz