WindowsForm: Array of PictureBox möglich mit VC++ Express?



  • so wie ich das sehe hast du nur ein Array vom Typ der PictureBox angelegt. Dazu musst du aber noch in die "freien" felder der Array pictureboxen legen, also:

    // </summary>
        public ref class Form1 : public System::Windows::Forms::Form
        {
    
        array< System::Windows::Forms::PictureBox^ >^ BoxField;//Deklariern:
    
        public:
            Form1(void)
            {
                InitializeComponent();
    
                //
                //TODO: Konstruktorcode hier hinzufügen.
                //
    
                BoxField = gcnew array< PictureBox^ >( 10 );//Initialisieren
    
                //******************    Hier instanzen in das Array legen
                for(Int32 a=0; a<BoxField->Length; a++){
                     BoxField[a] = gcnew System::Windows::Forms::PictureBox();
                }
            }
    

    und dann kannst du die auch über nen [index] ansprechen und werte setzen oder holen.



  • Hilfe

    der Fehler:

    Eine nicht behandelte Ausnahme des Typs "System.NullReferenceException" ist in ArrayPicBox.exe aufgetreten.
    
    Zusätzliche Informationen: Der Objektverweis wurde nicht auf eine Objektinstanz festgelegt.
    

    bleibt. Dabei ist es egal ob ich die Instanzen einzeln oder in einer Schleife anlege. Sobald der Debugger bei
    this->BoxField[1]->Name = "Box1"; ankommt bekomme ich die Fehlermeldung.

    ...
    this->BoxField[1] = gcnew System::Windows::Forms::PictureBox(); 
    this->BoxField[1]->Name = "Box1"; 
    ...
    


  • Doug_HH schrieb:

    /// </summary>
    	public ref class Form1 : public System::Windows::Forms::Form
    	{
    
    	array< System::Windows::Forms::PictureBox^ >^ BoxField;//Deklariern:
    
    	public:
    		Form1(void)
    		{
    			InitializeComponent();
    
    			//
    			//TODO: Konstruktorcode hier hinzufügen.
    			//
    
    			BoxField = gcnew array< PictureBox^ >( 10 );//Initialisieren:
    		}
    

    Du hast das initialisieren vergessen...
    Zeile 16!
    Stimmts?



  • Hallo Doug_HH
    leider ist es nicht so einfach (Zeile 16 ist vorhanden).
    Um die Fehlersuche etwas zu vereinfachen, habe ich mal den Quelltext von meinem Testprogramm eingefügt.

    #pragma once
    
    namespace ArrayPicBox {
    
    	using namespace System;
    	using namespace System::ComponentModel;
    	using namespace System::Collections;
    	using namespace System::Windows::Forms;
    	using namespace System::Data;
    	using namespace System::Drawing;
    	/// <summary>
    	/// Zusammenfassung für Form1
    	///
    	/// Warnung: Wenn Sie den Namen dieser Klasse ändern, müssen Sie auch
    	///          die Ressourcendateiname-Eigenschaft für das Tool zur Kompilierung verwalteter Ressourcen ändern,
    	///          das allen RESX-Dateien zugewiesen ist, von denen diese Klasse abhängt.
    	///          Anderenfalls können die Designer nicht korrekt mit den lokalisierten Ressourcen
    	///          arbeiten, die diesem Formular zugewiesen sind.
    	/// </summary>
    	public ref class Form1 : public System::Windows::Forms::Form
    	{
        array< System::Windows::Forms::PictureBox^ >^ BoxField;//Deklariern: 
    
    	public:
    		Form1(void)
    		{
    			InitializeComponent();
    			//
    			//TODO: Konstruktorcode hier hinzufügen.
    			//
            BoxField = gcnew array< PictureBox^ >( 10 );//Initialisieren: 
    
            BoxField[1] = gcnew System::Windows::Forms::PictureBox(); 
    
    		}
    
    	protected:
    		~Form1()
    		{
    			if (components)
    			{
    				delete components;
    			}
    		}
    
    	private: System::Windows::Forms::Button^  button1;
    	private:
    		System::ComponentModel::Container ^components;
    
    #pragma region Windows Form Designer generated code
    		void InitializeComponent(void)
    		{
    			this->button1 = (gcnew System::Windows::Forms::Button());
    			this->SuspendLayout();
    
    // ***************			1. picbox ***********************
    
    //			this->BoxField[1]= gcnew System::Windows::Forms::PictureBox(); // Testweise schon im Konstruktor
    				this->BoxField[1]->Name = "Box1";
    			  this->BoxField[1]->Location = System::Drawing::Point( 100, 212 );
    				this->BoxField[1]->BorderStyle = System::Windows::Forms::BorderStyle::FixedSingle;
    			  this->BoxField[1]->SizeMode = System::Windows::Forms::PictureBoxSizeMode::StretchImage;
    			  this->BoxField[1]->Size = System::Drawing::Size( 160, 136 );
    			  this->BoxField[1]->TabStop = false;
    //			this->Controls->Add(this->BoxField[1]);	//in übergeordnetes Panel einfügen
    
    			// 
    			// button1
    			// 
    			this->button1->Location = System::Drawing::Point(441, 307);
    			this->button1->Name = L"button1";
    			this->button1->Size = System::Drawing::Size(149, 31);
    			this->button1->TabIndex = 0;
    			this->button1->Text = L"Erzeugen";
    			this->button1->UseVisualStyleBackColor = true;
    			this->button1->Click += gcnew System::EventHandler(this, &Form1::button1_Click);
    			// 
    			// Form1
    			// 
    			this->AutoScaleDimensions = System::Drawing::SizeF(6, 13);
    			this->AutoScaleMode = System::Windows::Forms::AutoScaleMode::Font;
    			this->ClientSize = System::Drawing::Size(705, 349);
    			this->Controls->Add(this->button1);
    			this->Name = L"Form1";
    			this->Text = L"Form1";
    			this->Load += gcnew System::EventHandler(this, &Form1::Form1_Load);
    			this->ResumeLayout(false);
    
    		}
    #pragma endregion
    	private: System::Void Form1_Load(System::Object^  sender, System::EventArgs^  e) 
    			 {
    			 }
    	private: System::Void button1_Click(System::Object^  sender, System::EventArgs^  e) 
    			 {
    
    				 for( int i=1; i<10; i++ )
    				{
    //				 BoxField[i] = gcnew System::Windows::Forms::PictureBox;
    			 //  BoxField[i]->BorderStyle = System::Windows::Forms::BorderStyle::FixedSingle;
    			 //  BoxField[i]->SizeMode = System::Windows::Forms::PictureBoxSizeMode::StretchImage;
    			 //  BoxField[i]->Location = System::Drawing::Point( i*100+270, i*5+212 );
    			 //  BoxField[i]->Name = "Box"+i.ToString() ;
    			 //  BoxField[i]->Size = System::Drawing::Size( 160, 136 );
    			 //  BoxField[i]->TabStop = false;
    			 //this->Controls->Add(BoxField[i]);	//in übergeordnetes Panel einfügen
    			    }
    
    			 }
    	};
    }
    

    liegt´s am VS-Express oder mal wieder an mir?
    Wie kann ich hier im Forum Quelltext in einem kleineren Fenster mit Scrollbalken anzeigen?
    wwipfel



  • Du initialisierst aber nur das Element BoxField[1]. Die anderen mußt Du auch noch initialisieren, vllt eine Schleifen nehmen. BTW die Indizierung beginnt ab 0.



  • Das mit der Indizierung ab 0 war mit klar, ich hab zum Testen mal die Variable fest durch ne zufällige Zahl ersetzt. (Die Schleife wollte ich mir für das Klickereignis des Buttons aufheben 😉 )

    BoxField = gcnew array< PictureBox^ >( 10 );//Initialisieren: 
    
    				 for( int i=1; i<10; i++ )
    				{
            BoxField[i] = gcnew System::Windows::Forms::PictureBox(); 
    				 }
    

    Egal ob nur eine Box des Arrays oder alle in einer Schleife, Kompilieren ist noch ok und Ausführen kommt die Fehlermeldung.
    Kann bitte jemand den Quelltext durch seinen Compiler schicken? Ich traue meinem Studio Express nicht so richtig.



  • Ich verstehe den Code von Zeile 62 bis 69 nicht, der gehört da nicht hin!?

    #pragma once
    
    namespace TstBsp {
    
    	using namespace System;
    	using namespace System::ComponentModel;
    	using namespace System::Collections;
    	using namespace System::Windows::Forms;
    	using namespace System::Data;
    	using namespace System::Drawing;
    
    	/// <summary>
    	/// Zusammenfassung für Form1
    	///
    	/// Warnung: Wenn Sie den Namen dieser Klasse ändern, müssen Sie auch
    	///          die Ressourcendateiname-Eigenschaft für das Tool zur Kompilierung verwalteter Ressourcen ändern,
    	///          das allen RESX-Dateien zugewiesen ist, von denen diese Klasse abhängt.
    	///          Anderenfalls können die Designer nicht korrekt mit den lokalisierten Ressourcen
    	///          arbeiten, die diesem Formular zugewiesen sind.
    	/// </summary>
    	public ref class Form1 : public System::Windows::Forms::Form
    	{
    	public:
    
    		array< System::Windows::Forms::PictureBox^ >^ BoxField;//Deklariern:
    
    		Form1(void)
    		{
    			InitializeComponent();
    			//
    			//TODO: Konstruktorcode hier hinzufügen.
    			//
    
    			BoxField = gcnew array< PictureBox^ >( 10 );//Initialisieren:
    
    			BoxField[1] = gcnew System::Windows::Forms::PictureBox();
    		}
    
    	protected:
    		/// <summary>
    		/// Verwendete Ressourcen bereinigen.
    		/// </summary>
    		~Form1()
    		{
    			if (components)
    			{
    				delete components;
    			}
    		}
    	private: System::Windows::Forms::Button^  button1;
    	protected: 
    
    	private:
    		/// <summary>
    		/// Erforderliche Designervariable.
    		/// </summary>
    		System::ComponentModel::Container ^components;
    
    #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->button1 = (gcnew System::Windows::Forms::Button());
    			this->SuspendLayout();
    			// 
    			// button1
    			// 
    			this->button1->Location = System::Drawing::Point(167, 61);
    			this->button1->Name = L"button1";
    			this->button1->Size = System::Drawing::Size(75, 23);
    			this->button1->TabIndex = 0;
    			this->button1->Text = L"button1";
    			this->button1->UseVisualStyleBackColor = true;
    			this->button1->Click += gcnew System::EventHandler(this, &Form1::button1_Click);
    			// 
    			// Form1
    			// 
    			this->AutoScaleDimensions = System::Drawing::SizeF(6, 13);
    			this->AutoScaleMode = System::Windows::Forms::AutoScaleMode::Font;
    			this->ClientSize = System::Drawing::Size(284, 264);
    			this->Controls->Add(this->button1);
    			this->Name = L"Form1";
    			this->Text = L"Form1";
    			this->ResumeLayout(false);
    
    		}
    #pragma endregion
    	private: System::Void button1_Click(System::Object^  sender, System::EventArgs^  e) 
    			 {
    
    				for( int i=1; i<10; i++ ) 
                    { 
    					BoxField[i] = gcnew System::Windows::Forms::PictureBox; 
    					BoxField[i]->BorderStyle = System::Windows::Forms::BorderStyle::FixedSingle; 
    					BoxField[i]->SizeMode = System::Windows::Forms::PictureBoxSizeMode::StretchImage; 
    					BoxField[i]->Location = System::Drawing::Point( i*100+270, i*5+212 ); 
    					BoxField[i]->Name = "Box"+i.ToString() ; 
    					BoxField[i]->Size = System::Drawing::Size( 160, 136 ); 
    					BoxField[i]->TabStop = false; 
    					this->Controls->Add(BoxField[i]);    //in übergeordnetes Panel einfügen 
                    }
    			 }
    	};
    }
    

    So sollte das aussehen!?



  • Hallo Doug_HH
    du bist Super!!!!!!!!
    Zeile 62 bis 69 waren gedacht, um beim starten der Testanwendung eine der Pictureboxen in der Form anzuzeigen. Ich wollte direkt einen Erfolg sehen, ohne immer auf den Button zu klicken.

    Kannst du mir bitte noch erklären, warum dieser Versuch zum scheitern verurteilt ist?

    Danke
    wwipfel



  • Genau die idee kam mir heute morgen auch. Die PicBoxen werden initialisiert bevor sie erstellt werden. Und im platzhalter für den Designer hat das sowieso nix zusuchen.

    Und es Scheiterte darum weil der Designer Code ausgeführt wurde bevor das Array erzeugt wurde. Also wurde versucht in irgentwas zu initialisieren.

    public:
            Form1(void)
            {
                InitializeComponent();//*******Hier drin wird Initialisiert
    
                //
                //TODO: Konstruktorcode hier hinzufügen.
                // 
                BoxField = gcnew array< PictureBox^ >( 10 );//******Und hier wird es erst erzeugt
    

    Die Anweisungen die im Butten_Click stehen kannst du auch gleich im Konstruktor Schreiben. Dann musst auch nix machen 😉



  • OK,
    ich hab nicht gesehen, daß InitializeComponent im Konstruktor als erstes aufgerufen wird.

    Vielen dank an alle die geholfen haben.

    wwipfel


Anmelden zum Antworten