Pointer auf Picturebox?



  • Hi,

    ich lerne im Rahmen meines Studiums (Mathe) als Nebenfach ein bisschen C++ (und Haskell...). Bisher habe ich recht viel in der Konsole ausprobiert, um mich mit der Sprache vertraut zu machen, und komme gut damit zurecht.

    Nun wollte ich mal ganz abenteuerlustig etwas in tatsächlicher Windows-Form erstellen, habe mir einen MFC-Guide besorgt nur um festzustellen, dass mein Anfänger-VisualStudio2010 Express das gar nicht unterstützt. Na toll.
    Dazu wollte ich fragen ob mir jemand einen ähnlich übersichtlichen und Benutzerfreundlichen Compiler empfehlen kann, der das unterstützt und dennoch gratis ist? 🙂

    Jedenfalls habe ich dann beschlossen, allem auch hier gelesenen abraten zum Trotz mich etwas mit den Windows Forms auseinander zu setzen. Das ist zwar etwas umständlich (vor allem ohne IntelliSense für Anfänger) aber ich kam eigentlich recht gut zurecht, es hilft mir jedenfalls, ein paar Methoden kennen zu lernen, von denen ich davor noch überhaupt nichts gehört hatte.

    Nun habe ich für mein armes kleines Projekt eine Frage:
    ich habe mehrere PictureBoxes und habe bisher nur Events bei einem Click erstellen können, die die Box selbst beeinflussen oder zB ihren Inhalt ändern. Nun möchte ich ein Programm schreiben, das in diesem Fall den Inhalt einer anderen Box ändert, spezifisch den der als letztes angeklickten.
    Leider übersteigen die Forumulierungen in diesem vorgefertigen System meine Fähigkeiten, einen Buffer oder einen Zeiger, den ich entsprechend biege, ein zu richten, daher wollte ich hier mal um Rat bzw Hilfe fragen 😞

    Und um Nachsicht ob meiner erbärmlich geringen Fähigkeiten muss ich auch bitten, ich machs ja nur so nebenher.

    Vielen Dank im Voraus!
    Bamel



  • ich lerne im Rahmen meines Studiums (Mathe) als Nebenfach ein bisschen C++ (und Haskell...). Bisher habe ich recht viel in der Konsole ausprobiert, um mich mit der Sprache vertraut zu machen, und komme gut damit zurecht.

    Warum postest Du dann im C++/CLI Forum? C++/CLI ist NICHT C++ - es ist ganz einfach eine eigene Sprache.

    Nun wollte ich mal ganz abenteuerlustig etwas in tatsächlicher Windows-Form erstellen

    Dann lies das hier durch und lass es bleiben - es ist nicht das richtige für Dich!
    http://www.c-plusplus.net/forum/263084

    , habe mir einen MFC-Guide besorgt nur um festzustellen, dass mein Anfänger-VisualStudio2010 Express das gar nicht unterstützt. Na toll.

    So ist es, MFC wird erst ab der Professional Edition unterstützt.

    Dazu wollte ich fragen ob mir jemand einen ähnlich übersichtlichen und Benutzerfreundlichen Compiler empfehlen kann, der das unterstützt und dennoch gratis ist?

    Das hängt nicht vom Kompiler ab. Viel eher was mit der IDE für Libraries installiert werden. Ich schlage vor Du nimmst einfach ein alternatives GUI Framework - es gibt zahlreiche (gibt ein Unterforum dafür). Nimm einfach eins, dass sicher NICHT .NET ist wenn Du nit C++ herumhantieren möchtest.

    Jedenfalls habe ich dann beschlossen, allem auch hier gelesenen abraten zum Trotz mich etwas mit den Windows Forms auseinander zu setzen. Das ist zwar etwas umständlich (vor allem ohne IntelliSense für Anfänger) aber ich kam eigentlich recht gut zurecht, es hilft mir jedenfalls, ein paar Methoden kennen zu lernen, von denen ich davor noch überhaupt nichts gehört hatte.

    Wie Du willst - nur so als Anmerkung:
    Mit C# kann man auch Windows Forms benutzen, dort geht Intellisense.

    Nun habe ich für mein armes kleines Projekt eine Frage:
    ich habe mehrere PictureBoxes und habe bisher nur Events bei einem Click erstellen können, die die Box selbst beeinflussen oder zB ihren Inhalt ändern. Nun möchte ich ein Programm schreiben, das in diesem Fall den Inhalt einer anderen Box ändert, spezifisch den der als letztes angeklickten.
    Leider übersteigen die Forumulierungen in diesem vorgefertigen System meine Fähigkeiten, einen Buffer oder einen Zeiger, den ich entsprechend biege, ein zu richten, daher wollte ich hier mal um Rat bzw Hilfe fragen

    Mache dazu einfach eine weitere PictureBox^ Variable welche die zuletzt "angefasst" Picturebox speichert. Benutze dann diese!

    Simon



  • Wenn es das falsche Forum sein sollte, bitte ich um entschuldigung und ggfls verschiebung. Ich hatte nur die Warnung vor WindowsForms im Sticky gelesen und dachte, ich bin hier wohl richtig.

    Erstmal danke für die Antwort, das gibt mir auf jeden Fall Material für die nächsten Wochen um etwas sinnvoller in die Materie ein zu steigen.

    Eine Frage hätte ich noch, weil ich mein aktuelles Projekt doch noch gerne fertig stellen würde 🙂

    Ist es auch möglich, den entsprechenden Befehl für die PictureBoxes (oder jedes andere Objekt) so zu formulieren, dass es letztenendes für alle Objekte durchgeführt wird? Wenn ich 5 Objekte habe und eine Aktion (Click) ausführe, so soll der bei allen gleich sein, nur eben auf das jeweilige Objekt bezogen. Ist ja sicher nicht nötig, 5mal den selben Code nur unterschiedlichen Indizes zu schreiben :o



  • Ist es auch möglich, den entsprechenden Befehl für die PictureBoxes (oder jedes andere Objekt) so zu formulieren, dass es letztenendes für alle Objekte durchgeführt wird? Wenn ich 5 Objekte habe und eine Aktion (Click) ausführe, so soll der bei allen gleich sein, nur eben auf das jeweilige Objekt bezogen. Ist ja sicher nicht nötig, 5mal den selben Code nur unterschiedlichen Indizes zu schreiben :o

    Ja, das ist möglich.
    1. Bneutze einfach immer den gleichen Event Handler.
    2. Benutze das Argument "sender" des Event Handlers - es ist die PictureBox, die das Event ausgelöst hat.



  • Hmm... ok danke.

    Klappt leider nicht so ganz. Wo ist der Fehler?
    Habe ein Array von Pictureboxen deklariert:

    array< System::Windows::Forms::PictureBox^ >^ BoxField;
    

    Dann initialisiert

    BoxField = gcnew array< PictureBox^ >(64 );//Initialisieren:
    					for(Int32 a=0; a<BoxField->Length; a++){
    				BoxField[a] = gcnew System::Windows::Forms::PictureBox();}				
    			for (int i =0; i<64; i++)
    			{
    
    				BoxField[i] = gcnew System::Windows::Forms::PictureBox();
    				if ((i%8+i/8)%2==0)
    					BoxField[i]->Image = Image::FromFile("Schwarz.jpg");
    				else 
    					BoxField[i]->Image = Image::FromFile("Weiß.jpg");
    				BoxField[i]->Name = "Box1";
    				BoxField[i]->Location = System::Drawing::Point( (i%8)*40+50, ((i/8))*40+50 );
    				BoxField[i]->BorderStyle = System::Windows::Forms::BorderStyle::FixedSingle;
    				BoxField[i]->TabIndex = i;
    				BoxField[i]->TabStop = false;
    				BoxField[i]->Size = System::Drawing::Size(40, 40);
    				this->BoxField[i]->Click += gcnew System::EventHandler(this, &Form1::Click);
    				this->Controls->Add(BoxField[i]);
    

    Und dann das Event geschrieben:

    private: System::Void Click(System::Object^  sender, System::EventArgs^  e) {
    				for (int i =0; i<64;i++)
    				{
    					if ( BoxField[i]== sender)
    						i=From;
    				}
    				this->BoxField[From]->Location = System::Drawing::Point( 20, 20 );
    			 }
    

    Wenn ich den Sender nicht einbaue gehts. Wie geht das mit dem Sender?



  • Hat sich erledigt, deppenfehler. From = i natürlich.


Anmelden zum Antworten