Was bedeutet folgende Zeile: (cli::safe_cast<System::ComponentModel::ISupportInitialize^...
-
Hallo!
Ich muss für die Schule einige Einzelheiten zu diversen Steuerelementen in C++/CLI ausarbeiten. Bei der PictureBox bin ich auf eine "Unregelmäßigkeit" gestoßen. Was bedeutet folgende Zeile:
(cli::safe_cast<System::ComponentModel::ISupportInitialize^ >(this->pictureBox1))->BeginInit();Warum kommt diese Zeile nur bei der PictureBox vor? Weiter unten im Code ist dann noch eine Zeile, mit ->EndInit();
Wäre echt nett, wenn ihr mir weiterhelfen könntet.
mfg
-
Weil die PictureBox ISupportInitialize implementiert, lässt der Desginer Code erzeugen (den du dir unsinnigerweise anschauscht, da dieser Quelltext garantiert alles andere als anschaungswürdig ist), der eben
BeginInit()
undEndInit()
von der PictureBox aufruft.
Da Interfaces explizit und implizit auch implementiert werden können und der Aufruf immer stattfinden soll, wird zur Sicherheit immer der explizite Aufruf ausgewählt, was eben die Typumwandlung notwendig macht. Das gleiche gilt fürEndInit()
.Edit: auf einen Liliputaner eingegegangen
-
Hallo,
mit deinem Mutmaßungen hast du aber mächtig daneben gegriffen Rhombicosidodecahedron. Rein gar nichts stimmt an der Erklärung.
ISupportInitialize ist ein Interface und deshalb kann man davon schonmal nicht erben, sondern Interfaces werden implementiert. Deshalb stimmt auch die Erklärung mit der Urspungsimplementierung natürlich nicht. Hier ist überhaupt keine Vererbung im Spiel.
Der Grund für den Cast ist einfach der, dass die PictureBox das Interface explizit und nicht implizit implementiert. Deshalb muss auf den konkreten Interfacetyp gecastet werden um auf die Funktion zuzugreifen.
-
Stimmt danke, mein Fehler, dass ich Verbung mit implementierung gleichgesetzt habe, dennoch muss ich dir ein einem Punkt widersprechen:
Zwergli schrieb:
Der Grund für den Cast ist einfach der, dass die PictureBox das Interface explizit und nicht implizit implementiert.
Fast.
Der Grund für den Cast ist der, dass das der Designer automatisch diesen einfügt. Dass es bei der PictureBox sinnvoll ist, ist zufälligerweise richtig.(cli::safe_cast<System::ComponentModel::ISupportInitialize^ >(this->trackBar1))->BeginInit();
Bei einer Schiebeleiste (TrackBar) sindBeginInit
undEndInit
implizit definiert und dennoch wird der Aufruf mit der Typumwandlung erzeugt. Eben weil der Designer immer Typumwandlungen generiert.