Reflections - wie richtig nutzen ?



  • ich tippe dann nochmal auf "Erstellen" (nicht "Neu Erstellen") ... beim Zweiten mal passt alles ... scheint aber ein generelles Problemzu sein ... MS wird das wohl in VS2010 fixen ... hast Du den Header schon in eine CPP eingebunden?



  • Das Problemchen ist gelöst. Habe einfach eine Komponenten Klasse erstellt und diese angepasst. Damit läufts. Komme auch ein wenig weiter - freu.



  • Hallo nochmal. Also ... hänge jetzt wieder einige Tage an einem Problem und bin echt am verzweifeln. Ich bekomme es einfach nicht hin, die PlugIn Klasse vom Interface abzuleiten:

    PlugIn

    #pragma once
    
    using namespace System;
    using namespace System::ComponentModel;
    using namespace System::Collections;
    using namespace System::Windows::Forms;
    using namespace System::Data;
    using namespace System::Drawing;
    
    namespace Sidebar {
    
    	public ref class panel : public UserControl
    	{	
    
    	public: void InitializePanel ();
    
    	public:
    		panel(void)
    		{
    			InitializeComponent();	
    			InitializePanel ();	
    
    		}
    
    	protected:
    
    		~panel()
    		{
    			if (components)
    			{
    				delete components;
    			}
    		}
    	private: System::Windows::Forms::Button^  button1;
    	private: System::Windows::Forms::ListBox^  listBox1;
    	protected: 
    
    	private:
    
    		System::ComponentModel::Container ^components;
    
    #pragma region Windows Form Designer generated code
    
    		void InitializeComponent(void)
    		{
    		System::ComponentModel::ComponentResourceManager^  resources = (gcnew System::ComponentModel::ComponentResourceManager(panel::typeid));
    		this->button1 = (gcnew System::Windows::Forms::Button());
    		this->listBox1 = (gcnew System::Windows::Forms::ListBox());
    		this->SuspendLayout();
    		// 
    		// button1
    		// 
    		this->button1->Location = System::Drawing::Point(39, 55);
    		this->button1->Name = L"button1";
    		this->button1->Size = System::Drawing::Size(102, 30);
    		this->button1->TabIndex = 0;
    		this->button1->Text = L"Test Panel";
    		this->button1->UseVisualStyleBackColor = true;
    		// 
    		// listBox1
    		// 
    		this->listBox1->FormattingEnabled = true;
    		this->listBox1->Location = System::Drawing::Point(55, 19);
    		this->listBox1->Name = L"listBox1";
    		this->listBox1->Size = System::Drawing::Size(71, 30);
    		this->listBox1->TabIndex = 1;
    		// 
    		// panel
    		// 
    		this->AutoScaleDimensions = System::Drawing::SizeF(6, 13);
    		this->AutoScaleMode = System::Windows::Forms::AutoScaleMode::Font;
    		this->BackgroundImage = (cli::safe_cast<System::Drawing::Image^  >(resources->GetObject(L"$this.BackgroundImage")));
    		this->Controls->Add(this->listBox1);
    		this->Controls->Add(this->button1);
    		this->Name = L"panel";
    		this->Size = System::Drawing::Size(180, 140);
    		this->ResumeLayout(false);
    
    			}
    #pragma endregion
    	};
    
    	public class panelPlugin : public Interface
    	{    
    	public: virtual UserControl ^getSidebarUC() override { return gcnew Sidebar::panel (); }
    	String ^getAuthor() { return "Shaun"; }
    	String ^getName() { return "Testpanel - 14 Tage später"; }
    	};
    

    Interface

    namespace Sidebar
    	{
    	public interface class Interface
    			{
    			public: UserControl^ getUserControl ();
    			public: String ^getAuthor();
    			public: String ^getName(); 
    
    			public: Point getPanelPosition ();
    			public: Size  getpanelGröße ();
    			public: void setÜberschrift (String^);
    			};	
    
    	}
    

    Wie vorher habe ich das Interface als Verweis hinzugefügt. Versuche ich nun hier zu kompilieren erhalte ich ...

    Fehler 2 error C3668: "Sidebar::panelPlugin::getSidebarUC": Die Methode mit dem Überschreibungsspezifizierer "override" hat keine Basisklassenmethoden überschrieben. d:\c++ backup\sidebar\testpanel\panel.h 87
    Fehler 1 error C2504: 'Interface': Basisklasse undefiniert d:\c++ backup\sidebar\testpanel\panel.h 86

    .. wobei mir der erste Fehler doch sagen will, dass Interface unbekannt ist. Der zweite leuchtet mir auch ein. Ich verstehe einfach nicht warum das nicht funktioniert, zumal Sidebar::Interface doch bekannt sein sollte - und auch im IntelliSense auftaucht.

    Definiere ich die Klassen direkt hintereinander ...

    this->Name = L"panel";
    		this->Size = System::Drawing::Size(180, 140);
    		this->ResumeLayout(false);
    
    			}
    #pragma endregion
    	};
    
    	public interface class Interface2
    			{
    			public: UserControl^ getUserControl ();
    			public: String ^getAuthor();
    			public: String ^getName();
    			};	
    
    	public ref class panelPlugin : Interface2
    			{    
    			public: virtual UserControl ^getUserControl() { return gcnew Sidebar::panel (); }
    			public: virtual String ^getAuthor() { return "Shaun"; }
    			public: virtual String ^getName() { return "Testpanel - 4 Tage später"; }			
    			};
    

    Ist die Ableitung kein Problem. Woran liegt das ?



  • *hehe*,

    in Dein Fehler basiert darauf das Du im Plugin die Methode getSidebarUC() überschreibst ... die ist in der Tat nicht im INterfache definiert - da ist es getUserControl() ... das Lustige daran ist aber das Du es - als Du beides in eine Datei packst - die Klassenmethoden richtig schreibst - getUserControl() ... im Interface und Plugin

    hand, mogel

    BTW: deutsche Umlaute sind ungünstig im Quelltext



  • Jetzt wo du es sagst - habe ich ihn auch gesehen 🙂 ... ist aber nicht mehr aktuell. Die Methode heißt nun definitiv getUserControl, der Verweis besteht, und beim Versuch das ganze abzuleiten:

    namespace Sidebar
    	{
    	public interface class Interface
    			{
    			public: UserControl^ getUserControl ();
    			public: String ^getAuthor();
    			public: String ^getName();
    			};	
    
    	}
    
    this->Name = L"panel";
    		this->Size = System::Drawing::Size(180, 140);
    		this->ResumeLayout(false);
    
    			}
    #pragma endregion
    	};
    
    	public interface class Interface2 
    			{
    			public: UserControl^ getUserControl ();
    			public: String ^getAuthor();
    			public: String ^getName();
    			};	
    
    	public ref class panelPlugin : public Sidebar::Interface
    			{    
    			public: virtual UserControl ^getUserControl() { return gcnew Sidebar::panel (); }
    			public: virtual String ^getAuthor() { return "Shaun"; }
    			public: virtual String ^getName() { return "Testpanel - 4 Tage später"; }			
    			};
    

    Fehler 2 error C2504: 'Interface': Basisklasse undefiniert d:\c++ backup\sidebar\testpanel\panel.h 94
    Fehler 1 error C2039: 'Interface': Ist kein Element von 'Sidebar' d:\c++ backup\sidebar\testpanel\panel.h 94

    und nu?



  • Ändere ich den Namensbereich des Interface - ist dieser im PlugIn seltsamerweise NICHT mehr bekannt. Ich habe das Gefühl - das ich irgendwas mit dem einbinden nicht richtig mache, und frage mal ganz dumm:

    "Sollte der Namespace des Interfaces bekannt sein, allein durch einen Verweis auf die Interface.dll ?"



  • nein ... ein using muss - soweit Interface und Plugin nicht im gleichen NS sind - immermit angegeben werden ... zerleg mal Deine DLLs mit Reflector ... damit werfe ich immer einen Blick rein um zu sehen ob das mit den NS etc. passt



  • Joa .. DLL sieht aus wie von mir definiert.

    Nach einer langen Nachtschicht hab ich mich noch mal nen bisschen an den Rechner gesetzt - weil mich dieses verdammte Problem einfach nicht in Ruhe lässt.

    // Interface.h
    
    #pragma once
    
    using namespace System;
    using namespace System::Windows::Forms;
    
    namespace SidebarInterface {
    
    	public interface class Interface
    		{
    		public: UserControl ^getUserControl();
    		public: String ^getAuthor();
    		public: String ^getName(); 
    		};
    }
    

    Testpanel

    public ref class panelPlugin : public SidebarInterface::Interface , public Sidebar::DLLpanelklasse
    			{    
    			public: virtual UserControl ^getUserControl() { return gcnew Sidebar::panel (); }
    			public: virtual String ^getAuthor() { return "Shaun"; }
    			public: virtual String ^getName() { return "Testpanel - 4 Tage später"; }			
    			};
    

    Testpanel hat die erforderlichen Verweise auf das Interface und die DLLpanelklasse. Ich weiß nicht warum - aber das läuft so - ohne Using - und vor allem - AUF EINMAL DOCH?.

    Nun zurück zum eigentlichen Übel:

    void Sidebar::Form1::panelseinlesen ()
    	{			using namespace System::Reflection;	
    	System::Reflection::Assembly ^exAss;
    
    	System::Collections::Generic::List<SidebarInterface::Interface^>^ result = gcnew  System::Collections::Generic::List<SidebarInterface::Interface^>();
    
    	for each(String^ fileName in System::IO::Directory::GetFiles (arbeitsordnerholen () + "PlugIns\\","*.dll"))
    		{
    		if (fileName->Contains ("DLLpanelklasse") || fileName->Contains ("Interface")) continue;
    		// hier eine Fehlerbehebung für Fehler von LoadFrom
    		try{
    			exAss  = ::Reflection::Assembly::LoadFrom (fileName);		
    			}
    
    		catch (Exception^)
    			{
    			continue;
    			};
    
    	for each(Type^ t in exAss->GetTypes())
    			{			
    			if ( t->IsPublic && t->GetInterface (SidebarInterface::Interface::typeid->ToString ()))
    				{
    				Reflection::MethodInfo ^ test = t->GetMethod ("getUserControl");
    				if (test == nullptr) continue;				
    
    				result->Add(safe_cast<SidebarInterface::Interface^>(Activator::CreateInstance(t))); 
    				//result->Add( (SidebarInterface::Interface^)Activator::CreateInstance(t) )	;			
    				} 
    			}
    		}
    
    	}
    

    (Arbeitsordnerholen habe ich hier noch drin, da mir sonst eine Exception ausgeworfen wird. Irgendwie stimmt dann das Verzeichniss nicht. Aber darum kümmere ich mich später - wenn ich geschlafen habe 🙂

    Viel wichtiger ...

    Im For each Teil hast mir vorgeschlagen:

    ... t->isSubClassOf (...)

    Nun habe ich aber das gefunden:

    Die IsSubclassOf-Methode kann nicht verwendet werden, um zu bestimmen, ob eine Schnittstelle von einer anderen Schnittstelle abgeleitet ist oder eine Klasse eine Schnittstelle implementiert. Verwenden Sie für diesen Zweck die GetInterface-Methode.

    Nun bin ich mir nicht sicher, ob ich etwas falsch verstanden habe, oder ob dir vielleicht ein Fehler unterlaufen ist - was ich eigentlich nicht glaube. Jedenfalls wird nun die richtige Klasse gefunden - welche ich nun Instanzieren möchte.

    Im ersten "result->Add" wird mir diese Exception ausgeworfen:

    Eine nicht behandelte Ausnahme des Typs "System.Reflection.TargetInvocationException" ist in mscorlib.dll aufgetreten.



  • shaun1981 schrieb:

    public ref class panelPlugin : public SidebarInterface::Interface , public Sidebar::DLLpanelklasse
    

    mir ist unklar wieso Du hier zwei mal erbst ... vom Interface reicht es eigentlich - sofern Du später auch dahin castest

    Im For each Teil hast mir vorgeschlagen:
    ... t->isSubClassOf (...)

    nicht wirklich ... ich bvorzuge an der Stelle Assembly::CreateInstance ... wobei sich der Name - bei mir immer - wie folgt aufbaut

    eindeutig.fester.namepace.DLL-Name.fester-Klassenname
    

    alternativ würde auch ein Konfigurationsfile gehen wo die entsprechenden Infos drinnen stehen

    hand, mogel



  • Das sieht gut aus. Jetzt klappt es auch mit dem Cast. Bspw. GetAuthor kann ich nun aufrufen. Allerdings bekomme ich beim abrufen des UserControls folgenden Fehler:

    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.panel.resources" was correctly embedded or linked into assembly "Testpanel" at compile time, or that all the satellite assemblies required are loadable and fully signed.

    und zwar bei der Funktion InitializeComponent der PlugIn Form. Genauer gesagt, beim abrufen des Hintergrunds durch diese Zeile:

    //this->BackgroundImage = (cli::safe_cast<System::Drawing::Image^  >(resources->GetObject(L"$this.BackgroundImage")));
    

    Kommentiere ich diese aus - alles Ok.



  • 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.


Anmelden zum Antworten