none
bilder aus der form1 in die form2 kopieren RRS feed

  • Frage

  • Hallo

    Ich bin dabei ein Memory Spiel zu erstellen und möchte ein schummel Fenster einbauen, welches in einer zweiten Form dargestellt wird. Von der ersten Form soll dieses Fenster mittels eines Buttons aufgerufen werden. Soweit so gut. Funktioniert auch. Mein Problem ist jetzt die Umsetzung die Bilder aus der ersten Form in die zweite zu bekommen.

    Bin schon seit Tagen am Probieren und lesen, aber der aha Effekt ist bis jetzt noch nicht gekommen. Beispielcodes waren eher verwirren und haben sich nicht unbedingt auf mein Problem bezogen.

    Jetzt habe ich mich total verhaspelt und frage mich, ob ich die verwendeten Bilder auch in der Form2 per ImageList einlesen muss oder ob ich dazu nur die ImageList aus Form1 benötige und ob ich auch das tableLayoutPanel1 in der Form2 einbinden muss oder nicht.

    Ein zweites array zum Kopieren habe ich erstellt, aber wie bekomme ich die mit Random zufällig verteilt Bilder in das zweite Form?

    Der Hinweis CLI macht keinen Sinn ist mir bekannt, aber der Lehrgang ist nun mal CLI und nicht C# 

    Danke für Eure Hinweise

    lempy

    Samstag, 22. September 2012 14:27

Alle Antworten

  • Hallo,

    ich verstehe dein Problem nicht ganz. Du hast 2 Forms. In   Form2 möchtest du ein Bild an Form1 senden? 

    1. Form2 wird aus Form1 heraus erstellt und Bilder werden von Form2 an Form1 übertragen
    So erstellst du ein Event in Form2, welches Form1 abboniert und wenn du dein Bild übertragen willst, gibst du es eigenen EventArgs mit an Form1. So hat dann Form1 das Bild zur verfügung. Anstatt es direkt zu übergeben könntest du auch eine Eigenschaft bzw. Methode in Form2 erstellen, welche das Bild zurückliefert. Diese Methode müsste dann im EventHandler aufgerufen werden.

    2. Form2 wird in Form1 erstellt und Bilder werden von Form1 an Form2 übertragen:
    Du erzeugst eine Methode, welche Form1 aufrufen kann und das Bild übergeben kann. Form2 verarbeitet dann das Bild.

    "Der Hinweis CLI macht keinen Sinn ist mir bekannt, aber der Lehrgang ist nun mal CLI und nicht C#"
    Was ist das denn für ein Lehrgang, wenn ich fragen darf?


    Koopakiller - http://koopakiller.ko.ohost.de/

    Samstag, 22. September 2012 15:18
  • Hey

    Ist ein Lehrgang bei der ILS und schimpft sich Windowsprgrammierer .. müsste jetzt noch mal in den Unterlagen sehen.

    Aber zu Deinen Fragen:

    Memory ist als Spiel bekannt? (Nur so, weil ich noch nie Domino gespielt habe und dann Testaufgaben aus daraus machen musste.)

    Das Spielfeld, das im ersten Form aufgebaut wird soll mir im zweiten Form wiedergegeben werden. Nur mit dem unterschied, dass ich damit schummeln kann. Ich sehe die noch verdeckten Bilder aufgedeckt anstatt verdeckt.

    Die Form2 soll ein genaues Abbild aus Form1 ergeben. Quasi nach dem Motto Form2 = Form1!!

    Gruß 

    lempy

    Samstag, 22. September 2012 15:45
  • Ja Memory ist mir bekannt, auch wenn ich erst an RAM dachte ;)

    Im Grunde genommen geht das genauso wie bei dem einzelnen Bild, halt nur mit einem 2D Array zum übertragen. Wenn du in Form1 etwas änderst, rufst du die Methode in Form2 auf um die Bilder zu aktualisieren. Ich weiß ja nicht, wie du es geregelt hast, das das Bild beim anklicken sich herumdreht, aber ich glaube, das du nur ein weiteres Bild darüber legst oder einfach ein anderes anzeigst, als es tatsächlich ist und es ggf ausblendest bzw. änderst, das müsstest du dann einfach weglassen, wenn du die Daten verarbeitest.

    ILS: Naja, sieh es Positiv, C# mit C++ gekreuzt ;). Wenn du dann mit C# weiter machen solltest, so wird es wahrscheinlich einfacher, mit C++ kenn ich mich nicht ganz so gut aus.


    Koopakiller - http://koopakiller.ko.ohost.de/

    Samstag, 22. September 2012 15:53
  • Hey

    OK. Ist schon mal ein Hinweis. Das ganze soll aber über die Form1 gesteuert werden. Bin mal irgendwo im Netz auf eine Seite gelandet, die man auch von der Hilfe des Compilers aufrufen kann, aber ich kann mich leider nicht mehr daran erinnern zu welchem Thema ich gesucht habe. Musste da zwischendurch raus und habe mir das leider nicht gemerkt geschweige denn aufgeschrieben. Finde es jetzt nicht mehr wieder.

    Danke 

    lempy

    Samstag, 22. September 2012 16:16
  • Naja, hier mal ein Codeschnippsel von C#, müsstest du analog in C++/CLI übersetzen können:
    public partial class Form1 : Form
    {
    	public Form1()
    	{
    		frm2 = new Form2();
    		InitialisizeComponent();
    	}
    	
    	Form2 frm2; //Cheat-Fenster
    	
    	private void Click_ShowCheat(object sender, EventArgs e)
    	{
    		frm2.Show();
    	}
    	
    	private void Click_UpdateCheatWindow(object sender, EventArgs e)
    	{
    		//Sollte beim ändern der Karten aufgerufen werden.
    		frm2.Update(panel1.Controls); //panel1 enthält die ganzen Karten.
    	}
    }
    
    public partial class Form2 : Form
    {
    	public Form2()
    	{
    		InitialisizeComponent();
    	}
    	
    	public void Update(ControlCollection c)
    	{
    		//Daten verarbeiten, also einfach anzeigen.
    	}
    }
    Du solltest beachten, das man in C# problemlos mehrere Dateien für eine Klasse verwenden kann usw. Und ich ja nicht weiß wie du deine Karten gespeichert hast und teilweise versteckt anzeigt.

    Koopakiller - http://koopakiller.ko.ohost.de/

    Samstag, 22. September 2012 16:26
  • Ist ein Lehrgang bei der ILS und schimpft sich Windowsprgrammierer .. müsste jetzt noch mal in den Unterlagen sehen.

    http://www.c-plusplus.de/forum/p2092474

    Aber zu Deinen Fragen:

    http://www.c-plusplus.de/forum/308047


    Jochen Kalmbach (MVP VC++)
    Samstag, 22. September 2012 19:07
  • Hey

    Lieben Dank. 

    Reguläre Umschulung plus "Fernstudium", da darf man ruhig schon mal ein wenig den Überblick verlieren. Hauptsache man bekommt den Knoten wieder entwirrt.

    Gruß

    lempy

    Sonntag, 23. September 2012 09:42
  • Hallo Leute

    Wer richtig lesen kann ist klar im Vorteil!!!!! 

    He, hab die Aufgabe falsch verstanden. Brauche nur eine Funktion, die mir die Bilder im selben Form umdreht.

    Ich habe folgende Arrays vorgegeben und eins selber dazu geschrieben, um das Array spielfeld darin zwischen zu speichern.

    public ref class Form1 : public System::Windows::Forms::Form
    
    {
    
    private:
    	// die Anzahl der bereits umgedrehten Karten
    
    	Int32 offeneKarten;
    
    	// der aktuelle Spieler
    
    	Int32 spieler;
    
    // ein Array vom Typ Point für die Position der offenen Karten
    
    	array <Point> ^offeneKartenPos;
    
    	// ein Array für die Paare
    
    	array <Int32> ^paare;
    
    	// ein zweidimensionales Array für die Indizes der Bilder
    
    	array <Int32,2> ^initSpielfeld;
    
    	// ein zweidimensionales Array für das Spielfeld
    
    	array <Int32,2> ^spielfeld;
    
    	// ein zweidimensionales Array vom Typ Point für die bereits umgedrehten Karten
    
    	array <Point,2> ^aufgedeckt;
    
    	// eigenes Array zum zwischenspeichern für das Array spielfeld
    
    array <Int32,2> ^schummelfeld;
    
    ….. mehr Anweisungen
    }


    die Form1.h sieht so aus 

    public:
    	Form1(void)
    	{
    		InitializeComponent();
    
    		// einige Hilfsvariablen
    
    		Int32 bild = 0;
    
    		array <Int32> ^feld = gcnew array <Int32>(42);
    
    		// für das Mischen des Arrays feld über den Zufallsgenerator
    
    		Random ^zufallszahl;
    		// das Anlegen der Arrays
    
    		offeneKartenPos = gcnew array <Point>(2);
    		paare = gcnew array <Int32>(2);
    		initSpielfeld = gcnew array <Int32,2>(7, 6);
    		spielfeld = gcnew array <Int32,2>(7, 6);
    		aufgedeckt = gcnew array <Point,2>(21, 2);
    
    		schummelfeld = gcnew array <Int32,2>(7, 6);
    
    
    		// Initialisieren
    
    		// der Mensch startet als Spieler, beide Spieler haben kein Paar
    
    		spieler = 0;
    
    		paare[0] = 0;
    
    		paare[1] = 0;
    
    		// aufgedeckt wird mit -1 belegt
    
    		for (Int32 schleife1 = 0; schleife1 < 21; schleife1++)
    
    			for (Int32 schleife2 = 0; schleife2 < 2; schleife2++)
    
    				aufgedeckt[schleife1, schleife2] = Point(-1, -1);
    
    		// die Paare werden hintereinander in feld kopiert
    
    		for (Int32 schleife = 0; schleife < 42; schleife++)
    		{
    			feld[schleife] = bild;
    
    			if (((schleife + 1) % 2) == 0)
    
    			bild++;
    		}
    
    		// eine neue Instanz für Random erzeugen
    
    		zufallszahl = gcnew Random();
    
    		for (Int32 schleife = 0; schleife < 42; schleife++)
    		{
    			Int32 temp1, temp2;
    
    			// eine zufällige Zahl im Bereich 0 bis 41 erzeugen
    
    			temp1 = zufallszahl -> Next(42);
    
    			// den alten Wert in Sicherheit bringen
    
    			temp2 = feld[temp1];
    
    			// die Werte tauschen
    
    			feld[temp1] = feld[schleife];
    			feld[schleife] = temp2;
    		}
    
    
    		// die Paare werden hintereinander in feld kopiert
    
    		for (Int32 schleife1 = 0; schleife1 < 7; schleife1++)
    
    			for (Int32 schleife2 = 0; schleife2 < 6; schleife2++)
    			{
    				initSpielfeld[schleife1, schleife2] = feld[schleife2 * 7 + 
    				schleife1];
    
    				spielfeld[schleife1, schleife2] = 22;
    				/*schummelfeld = spielfeld;*/
    			}
    
    
    			//
    			//TODO: Konstruktorcode hier hinzufügen.
    			//
    }


    Desweiteren gibt es die Funktion "Karte öffnen"

    Void karteOeffnen (Int32 x, Int32 y)
    		{
    			// eine Hilfsvariable
    
    			Int32 aufTemp = 0;
    
    			// die Karte wird dem Spielfeld zugewiesen
    
    			spielfeld [x, y] = initSpielfeld[x, y];
    
    			// zwischenspeichern von spielfeld in schummelfeld
    
    			schummelfeld [x, y] = spielfeld [x, y];
    
    			// und in offeneKartenPos gespeichert
    
    			offeneKartenPos[offeneKarten] = Point (x, y);
    
    			// wurde die Karte bereits einmal gefunden?
    			// bitte in einer Zeile eingeben
    
    			if (aufgedeckt [spielfeld[x, y], 0].X != -1 && (aufgedeckt [spielfeld[x, y], 0] != Point (x, y)))
    
    				aufTemp = 1;
    
    			// die Position der Karte wird in aufgedeckt gespeichert
    
    			aufgedeckt[spielfeld[x, y], aufTemp] = Point (x, y);
    
    			// die Anzahl der geöffneten Karten wird erhöht
    
    			offeneKarten++;
    		} 


    Ich habe einen Index von 42 von dem 0 bis 20 mal 2 für die Abbildungen der Bilder stehen, 21 für das Bild vom Spielfeld entfernt, und 22 die Rückseite der Karten.

    In einer Tabelle ausgedrückt wären das 7 Spalten und 6 Zeilen.

    Meine Klickfunktion sieht provisorisch erst mal so aus:

    private: System::Void buttonAufdecken_Click(System::Object^  sender, System::EventArgs^  e) 
    		 {
    			 
    
    			 for (Int32 schleife1 = 0; schleife1 < 7; schleife1++)
    				 for (Int32 schleife2 = 0; schleife2 < 6; schleife2++)
    				 {
    					schummelfeld[schleife1, schleife2] = 21;
    				 }
    
    				 tableLayoutPanel1 -> Refresh();
    		 }
    		 

    Mein Problem ist, dass diese Konstrukt zwar aufflackert, mir aber kein Bild anzeigt. Die Version, wo ich zu mindest das erste Bild umdrehen konnte, habe ich mir leider zerschossen und ich komme einfach nicht mehr darauf, wie ich das gemacht habe.

    Der einzige Anhaltspunkt ist "karteÖffnen" . Doch alles was ich bisher ausprobiert habe brachte keinen Erfolg. 

    Habe die Anweisung mit dem einen aufgedeckten Bild wieder hinbekommen. Meine Funktion "Klick" sieht jetzt so aus:

    private: System::Void buttonAufdecken_Click(System::Object^  sender, System::EventArgs^  e) 
    		 {
    			 Int32 x, y;
    
    			 x = 0;
    			 y = 0;
    			
    					if (offeneKarten == 0 )
    						 karteOeffnen(x, y);
    				
    
    				 tableLayoutPanel1 -> Refresh();
    		 }

    Danke Euch für jeden Hinweis und Hilfestellung

    lempy


    • Bearbeitet lempy Dienstag, 25. September 2012 13:57 Änderung der Funktion klick
    Dienstag, 25. September 2012 12:43