Reflections - wie richtig nutzen ?



  • Erstmal ein riesiges Danke an euch bzw. dich - Mogel. Soviel Geduld muss man erstmal haben 😃

    Nun ist es ja so, dass die DLLpanelklasse ja eine wesentliche Rolle in dem ganzen spielte. Hier ist ja bspw. das Titel Label, die Basis - Kontext Menüs usw. Wie gehe ich nun vor, damit diese mir auch zur Verfügung stehen ?



  • Gehen wir davon aus, dass die DLLpanelklasse nun als DLL vorliegt.

    Versucht habe ich es so:

    Testpanel

    namespace Sidebar {			
    
    	public ref class panel : public Sidebar::DLLpanelklasse
    	{
    	public: void InitializePanel ();
    
    	public:
    		panel(void)
    		{
    			InitializeComponent();	
    			InitializePanel (
    
    ...
    ...
    public ref class panelPlugin : public SidebarInterface::Interface
    			{				
    			public: virtual UserControl ^getUserControl() { return (dynamic_cast<UserControl^>( gcnew Sidebar::panel () ) ); }
    			public: virtual String ^getAuthor() { return "Shaun"; }			
    			public: virtual String ^getPlugTitle () { return "Testpanel"; }
    			};
    

    Soweit auch OK. Beim aufruf von getUserControl wird auch gleich von der DLLpanelklasse abgeleitet, wobei es hier zu fehlern kommt:

    DLLpanelklasse

    this->standardmenü->SuspendLayout();
    		this->SuspendLayout();
    		// 
    		// überschriftlabel
    		// 
    		resources->ApplyResources(this->überschriftlabel, L"überschriftlabel"); // <-- hier
    

    Eine nicht behandelte Ausnahme des Typs "System.Resources.MissingManifestResourceException" ist in mscorlib.dll aufgetreten.

    Zusätzliche Informationen: Could not find any resources appropriate for the specified culture or the neutral culture. Make sure "Sidebar.DLLpanelklasse.resources" was correctly embedded or linked into assembly "DLLpanelklasse" at compile time, or that all the satellite assemblies required are loadable and fully signed.



  • Also .. ein paar Schwierigkeiten gibt es noch. Hier mal der aktuelle Stand:

    Testpanel

    namespace Sidebar
    	{	
    
    	public ref class panel : public DLLpanelklasse::BASISpanel
    	{	
    
    	public: void InitializePanel ();
    
    	public:
    		panel(void)
    		{
    			InitializeComponent();	
    			InitializePanel ();				
    		}		
    
    	protected:
    
    		~panel()
    		{
    			if (components)
    			{
    				delete components;
    			}
    		}
    	private: System::Windows::Forms::PictureBox^  pictureBox4;
    	protected: 
    	private: System::Windows::Forms::PictureBox^  pictureBox3;
    	private: System::Windows::Forms::PictureBox^  pictureBox2;
    	private: System::Windows::Forms::PictureBox^  pictureBox1;
    
    	protected: 
    
    	private:
    
    		System::ComponentModel::Container ^components;
    
    #pragma region Windows Form Designer generated code
    
    		void InitializeComponent(void)
    		{
    		System::ComponentModel::ComponentResourceManager^  resources = gcnew System::ComponentModel::ComponentResourceManager ( (Assembly::GetExecutingAssembly ())->GetType () );//gcnew System::ComponentModel::ComponentResourceManager(panel::typeid));
    		this->pictureBox4 = (gcnew System::Windows::Forms::PictureBox());
    		this->pictureBox3 = (gcnew System::Windows::Forms::PictureBox());
    		this->pictureBox2 = (gcnew System::Windows::Forms::PictureBox());
    		this->pictureBox1 = (gcnew System::Windows::Forms::PictureBox());
    		(cli::safe_cast<System::ComponentModel::ISupportInitialize^  >(this->pictureBox4))->BeginInit();
    		(cli::safe_cast<System::ComponentModel::ISupportInitialize^  >(this->pictureBox3))->BeginInit();
    		(cli::safe_cast<System::ComponentModel::ISupportInitialize^  >(this->pictureBox2))->BeginInit();
    		(cli::safe_cast<System::ComponentModel::ISupportInitialize^  >(this->pictureBox1))->BeginInit();
    		this->SuspendLayout();
    		// 
    		// pictureBox4
    		// 
    		resources->ApplyResources(this->pictureBox4, L"pictureBox4");
    		this->pictureBox4->BackColor = System::Drawing::Color::Transparent;
    		this->pictureBox4->Name = L"pictureBox4";
    		this->pictureBox4->TabStop = false;
    		// 
    		// pictureBox3
    		// 
    		resources->ApplyResources(this->pictureBox3, L"pictureBox3");
    		this->pictureBox3->BackColor = System::Drawing::Color::Transparent;
    		this->pictureBox3->Name = L"pictureBox3";
    		this->pictureBox3->TabStop = false;
    		// 
    		// pictureBox2
    		// 
    		resources->ApplyResources(this->pictureBox2, L"pictureBox2");
    		this->pictureBox2->BackColor = System::Drawing::Color::Transparent;
    		this->pictureBox2->Name = L"pictureBox2";
    		this->pictureBox2->TabStop = false;
    		// 
    		// pictureBox1
    		// 
    		resources->ApplyResources(this->pictureBox1, L"pictureBox1");
    		this->pictureBox1->BackColor = System::Drawing::Color::Transparent;
    		this->pictureBox1->Name = L"pictureBox1";
    		this->pictureBox1->TabStop = false;
    		// 
    		// panel
    		// 
    		resources->ApplyResources(this, L"$this");
    		this->AutoScaleMode = System::Windows::Forms::AutoScaleMode::Font;
    		this->Controls->Add(this->pictureBox4);
    		this->Controls->Add(this->pictureBox3);
    		this->Controls->Add(this->pictureBox2);
    		this->Controls->Add(this->pictureBox1);
    		this->Name = L"panel";
    		this->Controls->SetChildIndex(this->überschriftlabel, 0);
    		this->Controls->SetChildIndex(this->pictureBox1, 0);
    		this->Controls->SetChildIndex(this->pictureBox2, 0);
    		this->Controls->SetChildIndex(this->pictureBox3, 0);
    		this->Controls->SetChildIndex(this->pictureBox4, 0);
    		(cli::safe_cast<System::ComponentModel::ISupportInitialize^  >(this->pictureBox4))->EndInit();
    		(cli::safe_cast<System::ComponentModel::ISupportInitialize^  >(this->pictureBox3))->EndInit();
    		(cli::safe_cast<System::ComponentModel::ISupportInitialize^  >(this->pictureBox2))->EndInit();
    		(cli::safe_cast<System::ComponentModel::ISupportInitialize^  >(this->pictureBox1))->EndInit();
    		this->ResumeLayout(false);
    		this->PerformLayout();
    
    			}
    #pragma endregion
    	};
    
    public ref class panelPlugin : public SidebarInterface::Interface
    		{				
    		public: virtual UserControl ^getUserControl() { return gcnew Sidebar::panel (); }
    		public: virtual String ^getAuthor() { return "Shaun"; }			
    		public: virtual String ^getPlugTitle () { return "Testpanel"; }
    		};
    
    }
    

    DLLpanelklasse

    namespace DLLpanelklasse {
    
    	public ref class BASISpanel : public System::Windows::Forms::UserControl
    	{
    	public:
    		BASISpanel(void)
    		{
    			InitializeComponent();			
    		}
    
    	protected:
    
    		~BASISpanel()
    		{
    			if (components)
    			{
    				delete components;
    			}
    		}
    
    	protected:	static System::Collections::Generic::List<Control^> panelliste = gcnew System::Collections::Generic::List<Control^>();	
    
    	protected:	System::Media::SoundPlayer^ FXeffekt;
    
    	protected:	static System::Drawing::Size größe; // <-- Zum temporären Speichern der Panel Größe (Maximieren / Minimieren)
    	protected:	static int errorcount = 0;
    	public:		static Form^ form1instanz ;
    	protected:	static int abstandspanel = 0, ABSTAND = 6, panelanzahl = 0;	
    ...
    ...
    

    Probleme treten hier wieder mit dem RessourceManager auf - mit der gleichen Fehlermeldung wie im obigen Post. Jedoch verstehe ich nicht warum.



  • Ich habe mal ein wenig mit den Ressourcen herumgespielt:

    namespace DLLpanelklasse {
    
    	public ref class BASISpanel : public System::Windows::Forms::UserControl
    	{	
    	public:
    		BASISpanel(void)
    		{
    			InitializeComponent();			
    		}				
    
    	protected:
    
    		~BASISpanel()
    ...
    ...
    ...
    #pragma region Windows Form Designer generated code
    		/// <summary>
    		/// Erforderliche Methode für die Designerunterstützung.
    		/// Der Inhalt der Methode darf nicht mit dem Code-Editor geändert werden.
    		/// </summary>
    		void InitializeComponent(void)
    		{
    		this->components = (gcnew System::ComponentModel::Container());
    		System::ComponentModel::ComponentResourceManager^  resources = (gcnew System::ComponentModel::ComponentResourceManager(BASISpanel::typeid));
    		this->überschriftlabel = (gcnew System::Windows::Forms::Label());
    ...
    
    namespace Sidebar
    	{	
    
    	public ref class panel : public DLLpanelklasse::BASISpanel 
    	{	
    
    	public: void InitializePanel ();
    
    	public:	panel()
    		{
    
    			InitializeComponent();	
    			InitializePanel ();	
    			InitCallPlugIn (this);
    		}	
    
    	protected:
    
    		~panel()
    		{
    			if (components)
    ...
    ...
    #pragma region Windows Form Designer generated code
    
    		void InitializeComponent(void)
    		{		
    		System::ComponentModel::ComponentResourceManager^  resources = (gcnew System::ComponentModel::ComponentResourceManager(BASISpanel::typeid));
    		this->SuspendLayout();
    		// 
    		// panel
    		// 
    		resources->ApplyResources(this, L"$this");
    		this->AutoScaleMode = System::Windows::Forms::AutoScaleMode::Font;
    

    Das bearbeiten des BASISpanels ist somit nun endlich möglich. Elemente können hinzugefügt werden usw. und sind im PlugIn endlich angekommen. Das blöde ist nun, dass es beim bearbeiten des eigentlichen PlugIns - Im Designer - weiterhin schwierigkeiten gibt.

    Füge ich hier nun neue Elemente ein wird ...

    1. Der RessourceManager wieder auf

    System::ComponentModel::ComponentResourceManager^  resources = (gcnew System::ComponentModel::ComponentResourceManager(panel::typeid));
    

    zurückgesetzt ...

    2. Haben die neu hinzugefügten Steuerelemente (des eigentlichen Plugs) stets die Loc 0;0 - und überlagern sich hiermit. Selbst ein Sperren via Locked zieht hier nicht.

    Ich habe mir als unwissender nun überlegt, ob es wohl irgendwie möglich sei, einen einheitlichen RessourceManager zu erstellen - welche beide nutzen. Wäre das sinnvoll, bzw überhaupt Möglich?

    Andererseits gehe ich davon aus - dass die Sache mit den ressourcen damit eigentlich aus der Welt sein müsste, da die Steuerelemente ja vorhanden sind - nur eben nicht an der richtigen Position.

    Vielleicht hat von euch noch jemand ne Idee?



  • Dies passiert übrigens bei allen Bildern der PictureBoxes, sowie bei bspw. ImageLists. Auch wenn ich diese Controls in die BasisKlasse verlege - liegt der selbe Fehler vor.



  • Wenn hier keiner mehr Ideen hat ... kann der Thread geschlossen werden. Trotzdem ein riesen Danke.



  • shaun1981 schrieb:

    2. Haben die neu hinzugefügten Steuerelemente (des eigentlichen Plugs) stets die Loc 0;0 - und überlagern sich hiermit. Selbst ein Sperren via Locked zieht hier nicht.

    ja klar ... woher soll das panel auch wissen in welche Position es soll ... musst Du beim hinzufügen immer einmal ausrechen ... wenn alle Panels die gleiche Höhe haben, dann

    pluginpanel->Location = gcnew Size(0, pluginplane->Controls->Length); // oder so ähnlich
    

    Ich habe mir als unwissender nun überlegt, ob es wohl irgendwie möglich sei, einen einheitlichen RessourceManager zu erstellen - welche beide nutzen. Wäre das sinnvoll, bzw überhaupt Möglich?

    ich mache nicht sehr viel mit eingebetteten Resourcen ... aber Möglich denke ich schon ... wenn die in einer extra DLL sind (können auch mit in die fürs Interface mit rein) - dann sollten beide darafu zugreifen können



  • Das werde ich mal versuchen. Das Ding mit dem Interface klappt nun ja einwandfrei. Die Panels sind zu 90% auch schon umgeschrieben. Nur ne Sidebar ohne Bildchen ist ja irgendwie langweilig. Werde mich mal damit beschäftigen ...

    Melde mich wieder ...



  • Wenn du eine eigenes UserSteuerelement erstellst und designst und in panel-Form nur das einfürgst, kann dort doch der Code mit gcnew ComponentResourceManager(BASISpanel::typeid) stehen belieben, oder?

    Edit: umgeschreiebn.



  • Ich weiß nicht ob ich deine Frage richtig verstehe, aber soweit ich das beurteilen kann - kann ich nun ohne Probleme im Designer arbeiten und Controls hinzufügen. Eben nur mit den Images u. Co. gibt es die ja bekannten Probleme.

    Alles andere läuft wie gewohnt.



  • Rhombicosidodecahedron schrieb:

    Wenn du eine eigenes UserSteuerelement erstellst und designst und in panel-Form nur das einfürgst, kann dort doch der Code mit gcnew ComponentResourceManager(BASISpanel::typeid) stehen belieben, oder?

    Edit: umgeschreiebn.

    Eigentlich habe ich den Grund für die Fehlermeldungen noch nicht wirklich verstanden. Ich glaube, dass das PlugIn Panel die Ressourcen in den Ressourcen des BasisPanels sucht. Stimmt das so? Aber warum kann ich dann nicht einmal eine ImageList erstellen - auch ohne Bilder nicht ?

    In deinem Beispiel meinst du ein eigenes UserControl - oder was meinst du mit UserSteuerelement? Die Panel Form ist immer noch von der DLL Basis Panel abgeleitet, welche die Haupt Funktionen beinhaltet - sowie Menüs etc.

    Mein Rechner liegt leider grade lahm - muss mich noch was gedulden. Nur Vista weiß wie lang noch ... 🙂



  • shaun1981 schrieb:

    Stimmt das so? Aber warum kann ich dann nicht einmal eine ImageList erstellen - auch ohne Bilder nicht ?

    Weil ComponenResourceManager nur in der aufrufenden Assembly nach einer Resource names "DLLpanelklasse.BASISpanel.resources" sucht. Dies wird er wohl in den Plugins nicht finden.



  • So ... die Sache scheint nun zu klappen - wenn ich die Bilder zum Projekt hinzufüge, und unter Projekteigenschaften - Linker - Eingabe - Verwaltete Ressourcen einbetten - die Datei angebe (inklusive Pfad).



  • shaun1981 schrieb:

    So ... die Sache scheint nun zu klappen - wenn ich die Bilder zum Projekt hinzufüge, und unter Projekteigenschaften - Linker - Eingabe - Verwaltete Ressourcen einbetten - die Datei angebe (inklusive Pfad).

    Ja, dann lass es jetzt auch mal langsam gut sein...Das geht ja schon fast 5 Wochen hier mit dem Thema...

    Nach 5 Wochen darf diese Thema nicht mehr gewählt werden und wird aus der Top Ten List gestrichen...



  • Wo genau liegt das Problem ?



  • shaun1981 schrieb:

    Wo genau liegt das Problem ?

    Du weist doch - mein Troll & so



  • Ich glaub ich steh aufm Schlauch.


Anmelden zum Antworten