Probleme beim Komponentendesign mit abhängiger Komponente...
-
Hallo,
ich habe eine Komponente die eigentlich nur eine alternative Schnittstelle zweier anderer vorhandener Komponenten ist. Je nach Einstellung wird intern ein Objekt der einen oder anderen Komponente erzeugt und angesprochen.
Nun das Problem: Auch wenn die Pfadangaben entsprechend eingestellt sind, und die bpi-Dateien in den "Requires" richtig aufgeführt werden, kann beim Installieren der Komponente der Fehler kommen das eine bpl-Datei nicht gefunden wurde (In der Regel tritt der Fehler auf wenn man den Compiler geschlossen hatte und anschließend das Projekt neu öffnet, aber noch nicht einmal immer reproduzierbar). Wenn man die bpi Datei (obwohl noch in den Requires stehend) nochmal hinzufügt, oder eine Datei einfügt die diese Komponente beinhaltet, klappt es wieder.
Wenn man das Projekt installiert bekommt und direkt danach ein anderes Öffnet und dort die Komponenten verwendet, auch kein Problem... bis zum Neustart. Auch hier: die bpl Datei konnte nicht gefunden werden.
Kennt jemand ein ähnliches Problem, und weiß was in diesen Fall zu unternehmen ist?
cu André
-
C++Builder 2007?
Kannst du das bei einem Minimalprojekt reproduzieren?Ist es weiter möglich, daß das Erscheinen der Fehlermeldung davon abhängt, ob die benötigten BPLs in den davor geöffneten Projekten explizit ein- oder ausgeschlossen worden waren?
Ansonsten könntest du ja mal die Projektdatei auf Unstimmigkeiten untersuchen.
-
audacia schrieb:
C++Builder 2007?
Kannst du das bei einem Minimalprojekt reproduzieren?Ja & Ja...
Wie folgt bin ich vorgegangen:
a) Neues Package, hier sowohl in die Includepfade, als auch in die Bibliothekspfade die Pfadangaben der zweiten Komponente aufgenommen, und dessen bpi-Datei den Requires hinzugefügt.
b) Neue Komponente (Abgeleitet von TComponent) erstellt.Im Header habe ich dann einfach mal 3 Includes aus der zweiten Komponente hinzugefügt, sowie einfach 3 Zeiger auf die Klassen im private-Teil gesetzt
//... #include <SysUtils.hpp> #include <Classes.hpp> #include "DAODataset.hpp" // Hinzugefügt #include "DAOQuery.hpp" // Hinzugefügt #include "DAOTable.hpp" // Hinzugefügt //--------------------------------------------------------------------------- class PACKAGE TComponent1 : public TComponent { private: TDAODataset * a; // Hinzugefügt TDAOQuery * b; // Hinzugefügt TDAOTable * c; // Hinzugefügt //...
Im Source habe ich dann nur die folgenden Teile ergänzt:
//... #include "Component1.h" #pragma package(smart_init) #pragma link "DAODataset" // Hinzugefügt #pragma link "DAOQuery" // Hinzugefügt #pragma link "DAOTable" // Hinzugefügt //...
Alles andere habe ich mal unangetastet gelassen.
Die Komponente lies sich linken und Installieren. Ohne den Compiler zu schließen konnte ich die Komponte auch in ein anderes ohne Fehler Projekt ziehen. Nach dem Neustart des Compilers kam aber die Fehlermeldung das die bpl der zweiten Komponente nicht gefunden wurde (Include- und Bibliothekspfade hatte ich vorsichtshalber auch hier für beide Komponenten eingefügt).
Wenn man den Compiler einmal geschlossen hat bevor man die Komponente in dem Anderen Projekt verwenden will, führt bereits der Versuch diese hinzuzufügen zu dem entsprechenden Fehler ("");
Eigentliches Ziel ist das die geschriebene Komponente die andere "aufnimmt", und diese für das eigentliche Programm nicht explizit einzubinden ist (Im echten Projekts sind die Includes mittels Handle-Body Idiom nicht im Header; dies ist aber wie ich anhand dieses Minibeispieles sehe, auch garnicht das Problem).
Kann natürlich sein, das mir hier noch irgendwelche C++ Builder spezifischen Kenntnisse fehlen.
cu André
-
Folgendes habe ich getestet (C++Builder 2009):
- Zunächst erstellte ich ein neues Delphi-Package namens "daopackage" (denn bei dir scheint es sich ja um ein Delphi-Package zu handeln) mit den Dummy-Komponenten TDAODataset, TDAOQuery und TDAOTable. In den Linker-Optionen wählte ich "Alle C++Builder-Dateien erzeugen" und applizierte den hier beschriebenen Workaround, damit die Komponenten auch in der Designer-Palette von C++Builder erschienen.
- Sodann legte ich ein C++Builder-Package an, fügte "daopackage" zu Requires-Liste, Bibliotheks- und Include-Pfad hinzu, erstellte dann eine weitere Dummy-Komponente und erweiterte sie wie in deinem Beispiel. Allerdings ließ ich die #pragma link-Anweisungen weg - ich möchte ja das daopackage-Package linken und nicht die Objektdateien der darin enthaltenen Komponenten. Dafür erzeugte ich im Konstruktor der Komponente die TDAO*-Objekte, damit der Linker die Package-Abhängigkeit nicht wegoptimieren konnte:
__fastcall TTestComponent::TTestComponent(TComponent* Owner) : TComponent(Owner) { DAODataset = new TDAODataset (this); DAOQuery = new TDAOQuery (this); DAOTable = new TDAOTable (this); }
- Schließlich erstellte ich eine VCL-Anwendung, setzte ein Objekt vom Typ TTestComponent auf das Formular und fügte die Include- und Library-Pfade beider Packages hinzu.
Ich hoffe, daß mein Testfall dein Szenario hinreichend reproduziert. Jedenfalls trat bei mir in keinem Fall ein "BPL nicht gefunden"-Fehler auf, egal, wie und in welcher Reihenfolge ich die Projekte öffnete.
Vielleicht hilft es, wenn du das Delphi-Package deinstallierst, wie in obigem Link beschrieben alle IDE-Referenzen darauf entfernst und es dann erneut installierst?