Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Woher kommt globale Variable für Datenmodule (https://www.delphipraxis.net/172481-woher-kommt-globale-variable-fuer-datenmodule.html)

dataspider 6. Jan 2013 16:14

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

mkinzler 6. Jan 2013 16:20

AW: Woher kommt globale Variable für Datenmodule
 
Funktioniert es auch im kompiliertem Programm?

dataspider 6. Jan 2013 16:23

AW: Woher kommt globale Variable für Datenmodule
 
Zitat:

Zitat von mkinzler (Beitrag 1197981)
Funktioniert es auch im kompiliertem Programm?

Ja, das ist ja das Witzige.

mkinzler 6. Jan 2013 16:30

AW: Woher kommt globale Variable für Datenmodule
 
Auch beim kompletten Rebuild?

dataspider 6. Jan 2013 16:34

AW: Woher kommt globale Variable für Datenmodule
 
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:

Zitat von mkinzler (Beitrag 1197985)
Auch beim kompletten Rebuild?

Natürlich...

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]

stahli 6. Jan 2013 16:49

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.

dataspider 6. Jan 2013 17:01

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:
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;
In jedem Formular verweist das Propertie DM auf das DataModule.

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

Uwe Raabe 6. Jan 2013 22:04

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.

Furtbichler 7. Jan 2013 07:10

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:

Zitat von Uwe Raabe (Beitrag 1198038)
Man beachte, daß das Datenmodul ja auch einen Namen hat, der dem der globalen Variablen entspricht.

Wie soll das funktionieren, wenn die Deklaration entfernt wurde?

Oder geht es nur um den Designer?

dataspider 7. Jan 2013 07:24

AW: Woher kommt globale Variable für Datenmodule
 
Hallo,

ich habe den von Stahli erwähnter Thread hier gefunden.

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

Furtbichler 7. Jan 2013 07:36

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.

dataspider 7. Jan 2013 07:50

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

Furtbichler 7. Jan 2013 08:15

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.

Uwe Raabe 7. Jan 2013 09:57

AW: Woher kommt globale Variable für Datenmodule
 
Zitat:

Zitat von Furtbichler (Beitrag 1198054)
Ja, aber wenn doch keine Instanz erzeugt wird?

...

Oder geht es nur um den Designer?

Natürlich geht es zur Laufzeit nicht, wenn keine Instanz erzeugt wird. Wohin sollten die Events auch verlinkt werden.

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