Fragensteller
bilder aus der form1 in die form2 kopieren

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
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/
-
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
-
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/
-
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
-
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/
-
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++)- Als Antwort vorgeschlagen Martin RichterModerator Dienstag, 25. September 2012 08:17
-
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