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/)
-   -   Verwendung von Datamodule in Packages (https://www.delphipraxis.net/173008-verwendung-von-datamodule-packages.html)

Keldorn 2. Feb 2013 18:32

Verwendung von Datamodule in Packages
 
Hallo,

Ich verwende Datamodules auch gerne für das zentrale Hinterlegen von Imagelisten etc.
Wenn ich ein normales Projekt haben, kann ich unter den Projektoptionen unter Formulare das Datamodule automatisch erzeugen oder nicht. In einem Package fehlt diese Option und das Datamodule wird auch nicht erzeugt und ist NIL.

In dem Packages sind z.B. Formulare hinterlegt und Actionmanager verwenden die imagelisten des Datamodules für Toolbars etc....

Mache ich nix, ist das Datamodule NIL und es werden keine Images aus dem Datamodule gezogen, klar es ist ja nicht erstellt wurden.

Erzeuge ich es selber:
Delphi-Quellcode:
  DatamoduleErzeugt:=(Datamodule_IH_Images<>NIL);
  if NOT(DatamoduleErzeugt) then
    Datamodule_IH_Images := TDatamodule_IH_Images.Create(NIL);
   
    &#8230;
    Erstelle Hauptformular des Packages
    &#8230;
   
  if not(DatamoduleErzeugt) then
    Datamodule_IH_Images.Free;
//  Datamodule_IH_Images:=Nil;
Ohne dem Datamodule_IH_Images:=Nil; geht der 2. Aufruf auch schief, da dann das Datamodule wieder nicht erstellt wurde, ist ja nicht NIL … .

Mit dem Datamodule_IH_Images:=Nil bzw FreeAndNil klappt alles, allerdings sehe ich dann in der IDE dann öfters solche Fehlermeldungen:
Zitat:

Modul 'Form_XYZ' ist mit Modul 'Datamodule_IH_Images' verknüpft, das im aktuellen Projekt nicht gefunden wurde. Sollen die Verknüpfungen entfernt oder zu einem anderen Modul umgeleitet werden?
Ich muß dann das Datamodule öffen, in die Design-ansicht wechseln und dann zum Formular Form_XYZ zurück …

Wie macht man das richtig? Wie verwaltet man ein Datamodule in einem Package?

Danke&Gruß Frank

stahli 2. Feb 2013 19:38

AW: Verwendung von Datamodule in Packages
 
So eine Konstellation sollte man m.E. vermeiden.

Wenn Du eine Verbindung zwischen Mainform und Package-DataModule zur Designtime einrichten willst, dann muss die IDE das DataModul auch zuverlässig finden und immer eine Instanz erstellen.
In dem Fall sollte das DataModule in Deiner Anwendung erzeugt und verwaltet werden.

Wenn es Dir reicht, die Verbindung zur Laufzeit herzustellen dann solltest Du Dich darauf beschränken.
In dem Fall könntest Du im Initalization-Abschnitt eine Datamodule-Instanz erstellen und im Finalization-Abschnitt wieder auflösen.

Wichtig ist, dass Dein Package erstellt werden kann, ohne dass Dein Hauptprojekt vorhanden ist. Sonst handelt man sich unnötige Abhängigkeiten ein und könnte auf ein Package auch verzichten.

Eine konkrete Lösung kann ich nicht anbieten, aber Du solltest Dein Konzept ggf. nochmal überdenken.

Keldorn 2. Feb 2013 20:00

AW: Verwendung von Datamodule in Packages
 
sorry, dann habe ich mich mißverständlich ausgedrückt.

das Datamodule wird nur von Forms innerhalb des Packages verwendet, nicht von einer Form innerhalb des richtigen Projektes.

Keldorn 14. Feb 2013 07:16

AW: Verwendung von Datamodule in Packages
 
Ich muß hier nochmal fragen, weil mich das langsam alle macht :cry:

Also noch mal ausführlich:
Das Package für einen Komponenteneditor enthält ein Hauptformular und mehrere Unterformulare, sowie ein Datamodule. Im Datamodule sind zentral alle Imagelisten für Actionmanager der einzelnen Formulare hinterlegt. Nach „außen“ kommt nichts, alle imagelisten werden und sollen nur in Formularen des Packages verwendet werden.

Wie gesagt, das Datamodule automatisch erzeugen geht nicht, da es eben diesen Punkt in den Projektoptionen nicht gibt.

Wenn ich das Datamodule im initialization erstelle
Delphi-Quellcode:
initialization
begin
  if not(Assigned(Datamodule_IH_Images)) then
    begin
      ShowMessage('DM_images nicht zugewiesen, wird erstellt');
      Datamodule_IH_Images := TDatamodule_IH_Images.Create(NIL);
    end;
end;

finalization
begin
  if not(Assigned(Datamodule_IH_Images)) then
    ShowMessage('DM_images not assigned')
   else
    begin
      ShowMessage('DM_images.FreeAndNil');
      FreeAndNil(Datamodule_IH_Images);
    end;
end;
Hat das den äußerst unangenehmen Seiteneffekt, dass bei jedem Erstellen des Packages alle Verweise zum Datamodule verschwinden. Heißt für den Actionmanager: die vorher verlinkten imagelisten werden im OI nicht angezeigt. Klick ich eine Actionmanager.imageliste an, steht der Verweis immer noch drin (DatamoduleXYZ.imageliste32x32), allerdings kommt dann die Fehlermeldung „ungültiger Eigenschaftswert“ …
Ich muß dann das Datamodule als Formular anzeigen, danach kann ich die imagelisten wieder neu zuweisen.
Irgendwie mag die IDE das gar nicht, dass das Datamodule im finalization freigegeben wird.

Wie macht man es nun richtig???
Wo und wie sollte man das Datamodule erstellen? Vorallem, wo man das suchen sollte…
Wenn ich das Datamodule dort erstelle und freigebe, wo ich die Hauptform erstelle und aufrufe, habe ich das Problem, dass wenn die Hauptform nicht mit showmodal angezeigt wird, das Datamodule zu früh freigegeben wird.

Danke & Gruß Frank

stahli 14. Feb 2013 08:36

AW: Verwendung von Datamodule in Packages
 
In einem Package habe ich noch nicht mit mehreren Formularen und Datemodules gearbeitet. Ich denke, Du kannst hier m.E. nicht die gleiche Funktionalität wie in einem Projekt voraussetzen.

M.E. solltest/musst Du die einzelnen Formular- und Datamodule-Instanzen dynamisch erzeugen und die betreffenden Daten danach gegenseitig zuweisen.
Also eine Verknüpfung im OI dürfte nicht ohne weiteres funktionieren.

Ein Packagage dürfte Dir m.E. die Formulare nicht kontrolliert erzeugen und verknüpfen wie ein Projekt.

Keldorn 14. Feb 2013 09:26

AW: Verwendung von Datamodule in Packages
 
ok, danke erstmal.

zuweisen macht sich teilweise schwierig, da die Imagelisten ja überall zugewiesen werden popupmenus etc ... das macht die Sache nicht grad einfach :?


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:13 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz