[C++] Windows Forms dynamisch erstellen

the incredible Leitman

Erfahrenes Mitglied
Hallo zusammen,
ja, ich bins schon wieder *gg*

Ich habe nun mein CustomControl fertig, funktioniert super!
Das Problem, dass mir nun zu schaffen macht, ist folgendes:

Ich kann in meiner Anwendung nicht bereits im Vorhinein alle Steuerelemente erstellen und hinzufügen, da die Anzahl der Buttons, Labels usw. von bestimmten Informationen, welche ich von einem Server erhalte abhängig sind.
Jetzt habe ich vor, mit dem Client eine Anfrage zu starten, wie viele Elemente gebaut werden sollen und um was für Elemente es sich dabei handelt und mittels diesen Informationen dann meine OIberfläche dynamisch erstelle.

Wie kann ich das lösen?
Steh wirklich komplett im Dunkeln, weiß nicht wo ich anfangen soll, bzw. wonach ich überhaupt suchen soll
Bin für jede Hilfe dankbar

Da der Server noch nicht existiert, reicht es momentan, die Daten aus z.B. einer externen Textdatei oder direkt von einer Benutzeingabe auszulesen!


mit freundlichen Grüßen
Michael

(Miscrosoft Visual Studio 2005 Pro Edition, VC++)
 
Hallo Michael!

Du willst Steuerelemente anhand einer bestimmten Konfiguration generieren? :confused:
Wie willst dann die Ereignissbehandungen realisieren? ;)

Erstell UserControls für die jeweilige Aktion und zeig sie an wenn sie gebraucht werden.
Der Server kann sie ja auch bereit stellen. Dein Proggie könnt sie als Plugin downloaden...

Wenn dein Server Informationen von diesen Controls benötigt,
kannst sie auf verschiedene Art und Weise wieder zu ihm senden...
Via Remoting (easy), SOAP (mittel), oder Sockets (schwer, aufwendig, aber dafür schnell).

Wichtig ist das Du das ganze entsprechend Abstahierst (Interfaces, Basisklassen),
sodass Du zB für das Integiereren und Interagieren immer den gleichen Code verwenden kannst.

Du musst zudem eine einheitliche Datenerfassung entwickeln. Auf XML-Basis zB.
So musst eine Datenerfassung nicht für jedes Steuelement separat implementieren.
Innerhalb der standartisierten Datenerfassung kannst dann die jewiligen Datensegmente unterbringen,
die von den jeweiligen UserControls oder deren BusinessObjects generiert wurden.
 
wow!
das ging flott
Du willst Steuerelemente anhand einer bestimmten Konfiguration generieren?
Wie willst dann die Ereignissbehandungen realisieren?
wart, ich versuchs mal konkreter darzustellen:
Thema: Wohnungsüberwachung
Vorgang:
Ich starte den Client mit einem "Zimmer" als Übergabeparameter (z.B. Schlafzimmer);
der Client sendet diesen Parameter an den Server und fragt nach, was er auf der Form darstellen soll;
Der Server sendet zurück, was für Controls gebraucht werden und die benötigte Anzahl (aus einer Datenbank);
Mit diesen Informationen erstellt der Client die GUI Form (und fügt die Controls dazu z.B: 2 mal Licht, einmal Bett, Kasten);


edited:
habs jetzt einfach so gemacht:
Code:
private: System::Void button1_Click(System::Object^  sender, System::EventArgs^  e) 
{
	int times = 0;
			
	if(Convert::ToInt16(this->textBox1->Text)!=0)
	times = (Convert::ToInt16(this->textBox1->Text));

	for(int i = 0; i < times; i++)
	{
		System::String^ str;
		str = "Control "+counter;

		newControl::newControlControl^ C = gcnew newControl::newControlControl();
		C->Location = System::Drawing::Point(p1->X,p1->Y);
		C->Name = str;
		C->LabelText = C->Name;
		this->Controls->Add(C);

		p1->X = p1->X + 200;
		counter++;
	}
}
Sobald in eine Textbox eine Zahl eingegeben und anschließend ein Knopf gedrückt wird,
werden soviele Controls (daweil noch nebeneinander) erstellt, wie in der Textbox stand
KA ob ich das so machen kann, aber noch funktioniert es (ist auch noch absolut nicht umfangreich)

Das Problem, das ich jetzt bereits habe, wenn Text oder nichts in der Textbox steht kann ich es nicht umwandeln ? Convert::ToInt16 nicht richtig?
 
Zuletzt bearbeitet:
Du kannst die Steuerelemente schon erstellen, wenn du vorher noch nicht weißt welches das kommen soll.
Aber was soll das bringen, und vor allem, JA, wie machst du das mit den Events...
Ob sich die ganze Sache was bringen soll ist aber eine andere Frage.

Das Stichwort heisst übrigens Reflections!

Nehmen wir an du bekommst von deinem Server einen XML String zugeschickt (bsp. über eine Socket Verbindung?), der sagen wir folgendermaßen ausschaut:

XML:
<xml>
  <Control name="System.Windows.Forms.Button">
     <Position x=5 y=10 />
     <Size height=100 length=20 />
  </Control>
</xml>

Dann kannst du aus diesem string die enzelnen Daten herausfinden (Da gibts eine XML Klasse, mit der kenn ich mich noch nich aus, ich würds zB über RegEx machen, aber das ist deine Sache)

C#:
            string name = "System.Windows.Forms.Button";
            int posX = 5, posY = 10;
            int sizeHeight = 100, sizeLength = 200;
            
            //neue Instanz von dem Control erstellen, das auf name gespeichert ist
            Type type = System.Reflection.Assembly.GetExecutingAssembly().GetType(name);
            Control myControl = (Control) (Activator.CreateInstance(type));
            myControl.Size = new Size(sizeLength, sizeHeight);
            myControl.Location = new Point(posX, posY);
            //und zum Schluss das Control zur Form hinzufügen
            this.Controls.Add(myControl);

Ich hoffe das hast du gemeint ;)

Lg, Yanick
 
Zuletzt bearbeitet von einem Moderator:
vor allem, JA, wie machst du das mit den Events...
wieso? Ich versteh nicht...

Meine Controls liefern keine wirklichen Aktionen auf bestimmte Event, sie dienen lediglich der Darstellung und zeigen Sachen an, die vom Server kommen... Kann ich da nicht einfach alles Refreshen, dann sind die Werte wieder aktuell oder?

Kenn mich kaum aus zwischen Server Client Kommunikation (Tutorial ? *gg*) aber vorerst ist meine Aufgabe ledigloch der Client, Server macht wer anderer
da der aber zzt. nicht anwersend ist, brauche ich halt Informationen aus einer Datenbank oder einfach aus einer Textdatei...
 
Meine Controls liefern keine wirklichen Aktionen auf bestimmte Event, sie dienen lediglich der Darstellung und zeigen Sachen an, die vom Server kommen...

Ja aber weisst du was der Sinn von GUI Controls sind - ja genau, wie der name schon sagt, User Interface - d.h. das ist ein Interface zwischen dem PC und dem User.
Wenn du die Sachen nur darstellen willst, warum machst du dann nicht nur eine PictureBox und zeichnest die Sachen dort hinein :p ?

Lg, Yanick
 
Das war auch meine Intension in dem Zusammenhang. Yanick hat es grad treffend definiert!
Controls sind zum Interagieren mit dem User da. Alles andere währe eine Resourcenverschwendung.

Btw. Mit dem Remoting Tutorial siehst eine wirklich einfache Art und weise,
wie man mit einem Client ohne wirklich viel Schnick Schack kommunizieren kann...
 
Ich danke euch vielmals!

Es war halt meine Aufgabe, Custom Controls darzustellen, aber wenn ich mir das so ansehe, ist eine PicBox sicher die bessere Lösung... werd ich mal besprechen :)

Remoting Tutor werd ich mir gleich checken,

danke nochmals

mfG
Michael
 
Ach verdammt...
Tut mir leid, da war ich falsch informiert, für meinen Client brauche ich doch Controls, die Interaktionen des Users zulassen! d.h. ich muss die Ereignisbehandlung doch irgendwie realisieren können...

Gibt es denn keine Möglichkeit, eine Liste von Steuerelementen zu erstellen, wie ein Array, die ich dann auch mit einer Art Index ansprechen kann?
Muss ich da wirklich alle Elemente erstellen und dann nur die welche gebraucht werden anzeigen? (das geht von mind. 5 bis durchschn. 68 Elementen)
 
Es währe Nonsens. Hol Dir UserControls vom Server und zeig sie dann an.
Standartisiert (Du und dein Kollege) mithilfe von Basis Klassen und Interfaces die Business- und Präsentationslogik,
sodass Du im Client nicht mit den Typen der UserControls selber,
sondern lediglich mit deren Basen und Interfaces hantierst.

Und nochmal, alles andere währe ´Nonsens und echte Resourcen verschwendung.
Implementierungs- und Personaltechnisch. Sowas macht keiner, hab ich noch nicht gesehen.
//Edit: Btw. Wirst auch so kaum irgend welche Custom Styles für deine Controls realisieren können...

Auf was für Ideen kommt dein Chef nur wenn er nichts zu tun hat. :eek:
 
Zuletzt bearbeitet:
Zurück