VC++ Forms dynamisch erstellen

  • #1
L

leitman

Mitglied
Themenersteller
Dabei seit
19.07.2006
Beiträge
7
Reaktionspunkte
0
Hallo alle zusammen!

Ich habe ein Problem, und zwar habe ich ein Control erstellt, das bestimmte Dinge anzeigt und einen Button besitzt, über den sich die Eigenschaften des Controls ändern lassen.

Nun möchte ich dieses Control in eine Windows Form Applikation (in VC++) einbinden.
Mein Problem jetzt ist, dass es möglich sein soll, eine Unterschiedliche Anzahl von Controls darzustellen, jedoch weiß ich nicht im Vorhinein (also beim Programmstart) wieviele Controls erstellt werden sollen.

Wenn ich sie dynamisch erstelle, kann ich ja nicht darauf zugreifen, oder?
gibt es da die Möglichkeit eine Liste zu verwenden?
oder wie kann ich das sonst lösen?

steh vollkommen im Dunkeln, würde mich über jede Hilfe freuen

mfG
Michael
 
  • #2
Falls ich das richtig verstehe (es handelt sich doch um ein->Managed Control'?): Die Controls werden ja alle ohnehin quasi dynamisch erzeugt. Der Designer schreibt bloß den entsprechenden Code für Dich (im Header der Form). Beispiel Button:

Code:
System::Windows::Forms::Button^ btnMachwas;
	  
btnMachwas = (gcnew System::Windows::Forms::Button());
	  
btnMachwas->Location = System::Drawing::Point(110, 150);
btnMachwas->Name = LbtnMachwas;
btnMachwas->Size = System::Drawing::Size(75, 23);
btnMachwas->TabIndex = 0;
btnMachwas->Text = LMachwas;
btnMachwas->UseVisualStyleBackColor = true;		
btnMachwas->Click += gcnew System::EventHandler(this, &Form1::btnMachwas_Click);
this->Controls->Add(btnMachwas);

...

private: System::Void btnMachwas_Click(System::Object^  sender, System::EventArgs^  e) {
  Windows::Forms::MessageBox::Show(Hallo);
}

Du kannst also beliebige Controls erzeugen und in Control-Container (z.B. eine Form) setzen: jeweils DeinContainer->Controls->Add(DeinControl) aufrufen. Die Event-Handler musst Du dann natürlich selbst verdrahten. Wenn Du mehrere Deiner Controls brauchst - wie Du ja schreibst -, könntest Du eine passende Collection (Liste o.ä.) verwenden und die Controls in einer Schleife erzeugen. Bei vielen Controls ist es u.U. sinnvoll, vor/nach dieser Schleife SuspendLayout/ResumeLayout zu verwenden.
 
  • #3
Danke erstmal,
hab eine Schleife, in der die Controls erstellt werden, funktioniert super  ;D

...eine passende Collection (Liste o.ä.) verwenden
Genau davor stehe ich jetzt, da es ja CustomControls sind, die ich selber erstellt habe, weiß ich nicht, wo ich sie abspeichern kann! Habs bereits mit ArrayList probiert, aber das ist nicht ganz das Wahre...
Gibts da etwas besseres?
oder wie kann ich selber solche Listenklassen oder Collections erstellen?

Vielen Dank nochmals
mfG

Leitman
 
  • #4
...eine passende Collection (Liste o.ä.) verwenden
Genau davor stehe ich jetzt, da es ja CustomControls sind, die ich selber erstellt habe, weiß ich nicht, wo ich sie abspeichern kann! Habs bereits mit ArrayList probiert, aber das ist nicht ganz das Wahre...

Warum? Na ja, die nötigen Casts sind nicht so schön. Aber funktionieren sollte es.

Gibts da etwas besseres?

Ja, in VS 2005 generische Collections (wie List<T>). Typsicher und praktisch. Weitere Möglichkeiten s.u.

oder wie kann ich selber solche Listenklassen oder Collections erstellen?

Z.B. durch Ableiten von ArrayList, List<T> etc. (hat aber jeweils Nachteile, da die Klassen schon sehr spezialisiert sind und Du auch nicht alle Methoden überschreiben kannst), durch Ableiten von CollectionBase (). Oder durch Implementieren von ICollection, IList, ..., aber dann musst Du natürlich eine entsprechende Datenstruktur in dieser Klasse haben (einfaches Array, Liste, ...), wodurch sich in Deinem Fall wahrscheinlich die Katze in den Schwanz beißt, sozusagen.

Eine eigene Klasse wäre sinnvoll, wenn Du mit Deiner Collection mehr anfangen willst, als bloß die Controls zu speichern. Sprich, wenn Du spezielle Operationen auf alle oder auf einen Teil der Controls anwenden willst und dies nicht von außen über Schleifen oder Generics und Delegates mit den dafür vorgesehenen Methoden (ForEach, Find, FindAll, TrueForAll, RemoveAll, ...) machen willst.

Der Vollständigkeit halber:
Außer den Klassen in System::Collections, System.Collections.Specialized, System::Collections::ObjectModel (sinnfreier Name) und System::Collections::Generic gäbe es als Alternative z.B. noch die STL (STL/CLI) und die Power Collections (, Anmeldung erforderlich)
 
Thema:

VC++ Forms dynamisch erstellen

ANGEBOTE & SPONSOREN

Statistik des Forums

Themen
113.840
Beiträge
707.963
Mitglieder
51.494
Neuestes Mitglied
Flensburg45
Oben