[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++)
 

Christian Kusmanow

Erfahrenes Mitglied
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.
 

the incredible Leitman

Erfahrenes Mitglied
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:

yan1

Erfahrenes Mitglied
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:

the incredible Leitman

Erfahrenes Mitglied
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...
 

yan1

Erfahrenes Mitglied
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
 

Christian Kusmanow

Erfahrenes Mitglied
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...
 

the incredible Leitman

Erfahrenes Mitglied
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
 

the incredible Leitman

Erfahrenes Mitglied
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)
 

Christian Kusmanow

Erfahrenes Mitglied
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:

the incredible Leitman

Erfahrenes Mitglied
Danke nochmals :)
das Problem ist, das der Server eben noch nicht fertig ist und ich überhaupt noch nichts mit derartigen Anwendungen zu tun hatte, ich steh praktisch voll im Regen :(

Ich bitte euch, falls jemand bereits ein ähnliches Problem hatte oder weiß wo ich mir gute Informationen zu diesem Thema besorgen kann, bitte schreiben!
Werde derweil auf gut Glück suchen....

Ahja und:
Auf was für Ideen kommt dein Chef nur wenn er nichts zu tun hat?
tja..., was weiß denn ich :p
 

Christian Kusmanow

Erfahrenes Mitglied
Sag mal, was hast von meinen Vorschlägen entnehmen können?
Was sagt dein Kollege dazu? Hab ihr das schon mal besprochen und euch auf eine Vorgehensweise geeinigt?

Du solltest nach Plugin Framework suchen. Die Ansätze eines solchen Framewoks sind die,
die ihr meines Erachtens braucht. Die UserControls muss der Server also in DLL Form anbieten.
Diese lädst vom Server herunter und holst Dir die Controls.
In den DLLs könnt ihr zudem auch Custom Controls mitliefern, die euren UserControls ein nettes aussehen verleihen.

Wie gesagt, wenn Du es richtig anstellst, wirst in deinem Client nur noch mit den Basen und Interfaces
der UserControls hantieren, nachdem Du sie in deinen Client geladen hast.
 
Zuletzt bearbeitet:

the incredible Leitman

Erfahrenes Mitglied
hört sich gut an :)
sagt mir aber leider fast nichts :(

Codeschnipsel,examples,links,...?

Kollege ist zurzeit (und in nächster Zeit) nicht da, deswegen gibts auch noch keinen Server...
Wer mich halt einmal alleine damit auseinandersetzen, was es mit diesen Plugins auf sich hat!
und wie ich die vom Server holen kann...

Danke im Vorraus! :)
 
Zuletzt bearbeitet:

Christian Kusmanow

Erfahrenes Mitglied
Michael, mach dich doch mal über die Begriffe erstmal selber schlau. :)
Btw. arbeite ich ausschließlich mit C#. Kann Dir also kaum Beispiele anbieten.
Viel C++ Artikel findest auf http://www.thecodeproject.com. :google:
In konzeptionellen Fragen könnt ich Dir aber weiterhin weiterhelfen.

Die Plugins sind DLLs in denen sich die UserControls befinden.
Die erstellst in deiner IDE und testest sie mit deinem Client.

[thread=211092]Softwaremodularisierung - Herangehensweise - Thread[/thread]

Und wer geht bitteschön ein solches Projekt an ohne das VORHER feststeht, was wie realisiert werden soll.
Das ist unprofessionell und sollten während er rudimentären Implementation Probleme auftreten,
kann es passieren das duch eben diese fehlende Vorbeitung alles wieder über den Haufen geworfen werden muss
und ihr wieder von vorn anfangen könnt. ;)

[post=1073191]Re: Professioneller Auftrag: Vorgehen! - Post[/post]

Lesen! :)
 

the incredible Leitman

Erfahrenes Mitglied
Michael, mach dich doch mal über die Begriffe erstmal selber schlau
mach ich doch eh :) ;)

und... bitte sag nicht Michael, ok? ich hasse das! *grml*

Wieder einmal freundlichsten Dank, *verbeuge micht*
war echt hilfreich!

auf Codeproject bin ich bereits seit einiger Zeit registriert und sehe mich auch um (beispiels und codemäßig echt hilfreich), jedoch habe ich hier die Möglichkeit, Konzepte zu besprechen / diskutieren oder nur Ideen und Herangehensweisen anderer auszutauschen!

und bezügl. Projektplanung:
das ist noch die Planungsphase! wir evaluieren gerade, welche Funktionen wir benötigen, was unser Programm für Kriterien erfüllen soll, was es bereit stellen soll usw...
Deshalb schauen wir auch, wie wir am Besten unsere Controls verwenden, von Plugins habe ich bisher noch nichts gehört, ich bin die Sache halt einfach einmal so angegangen, wie ich konnte! Bin überhaupt noch ganz frisch in der Softwareentwicklung, deshalb habe ich noch 2 Monate Zeit, bis wir mit unserem Projekt starten um mich in der Zeit noch etwas mit der Materie auseinandersetzen zu können! Da ich aber schon ungefähr weiß, was für Funktionalitäten gefordert werden, versuche ich eben, über diese Dinge alles mir Mögliche in Erfahrung zu bringen (eben selbst erstellte Controls, Client-Server Hot Failover System,...)

Und ich muss sagen, hier in diesem Forum seid ihr mir alle eine große Hilfe dabei,

THX
 

Christian Kusmanow

Erfahrenes Mitglied
und... bitte sag nicht Michael, ok? ich hasse das! *grml*
:D
Du hast in ersten Post aber MfG, Michael geschrieben gehabt. :p
NP, werds in Zukunft berücksichtigen. Nenn mich dann aber bitte auch nicht Christian.
Das kann ich auch nicht leiden. ;) :D

Btw. danke für die Blumen. :)

Wenn Du keine Frage mehr hast kannst das Thema als erledigt markieren. :)
Alles weitere zu den Themen ansich sollten wir in separaten Threads besprechen...
 

the incredible Leitman

Erfahrenes Mitglied
Christian Kusmanow hat gesagt.:
Du hast in ersten Post aber MfG, Michael geschrieben gehabt. :p
Ich weiß... ich machs nie wieder :p
Nenn mich dann aber bitte auch nicht Christian.
no prob (endlich einer der das versteht *rofl*)
Wenn Du keine Frage mehr hast kannst das Thema als erledigt markieren
Nein, passt!
Werd mich mal informieren, schauen was Codeproject so hergibt :)

also...
Hoffe ich hab dir nicht zuviel Zeit gestohlen :D

man hört sich

!ABGEHAKT!
 
Zuletzt bearbeitet:

Neue Beiträge