private void tsSave_Click(object sender, EventArgs e) { #region Notes et pseudocode // Identifier le fichier à créer // Préparer l'objet à sérialiser // Ouvrir le fichier et sérialiser // S'assurer qu'on a traité tous les champs globaux. #endregion Notes et pseudocode #region CODE // Identifier le fichier à créer SaveFileDialog d = new SaveFileDialog(); d.Title = "Fichier où enregistrer la grille"; if (d.ShowDialog() == DialogResult.Cancel) { return; } // Préparer l'objet à sérialiser Contenu[,] jeu = new Contenu[N, N]; for (int row = 0; row < N; row++) { for (int col = 0; col < N; col++) { jeu[row, col] = new Contenu(row, col, grille[row, col].Text[0], grille[row, col].originale); // Si on est en mode conception, les cases non vides sont toutes des cases originales if ((etat == Etat.Création) && (grille[row, col].Text[0] != ' ')) { jeu[row, col].originale = true; } } } // Ouvrir le fichier et sérialiser BinaryFormatter bf = new BinaryFormatter(); FileStream f = new FileStream(d.FileName, FileMode.Create, FileAccess.Write, FileShare.None); bf.Serialize(f, jeu); f.Close(); // S'assurer qu'on a traité tous les champs globaux. hasChanged = false; #endregion CODE }
private void MenuAnnuler_Click(object sender, EventArgs e) { // case cs = sender as case; Case precedents = null; Contenu preds = null; // preds = historique[historique.count - 1]; // precedents = grille[preds.row, preds.col]; //if ((precedents != cs)) // historique.removeat(historique.count - 1); if (historique.Count != 0) { preds = historique[historique.Count - 1]; precedents = grille[preds.row, preds.col]; historique.RemoveAt(historique.Count - 1); //preds = historique[historique.Count - 1]; //precedents = grille[preds.row, preds.col]; historique.RemoveAt(historique.Count - 1); } #region Notes et pseudocode // Il faut restaurer le dernier Contenu de l'historique // Rappel: on ne peut arriver ici que si historique // contient au moins un élément. // Mais, on va quand même vérifier. // Annuler la dernière action // Le bouton annuler est-il encore disponible? #endregion #region CODE // L'écriture de cette méthode est laissée en TP. #endregion }
private void Case_Click(object sender, EventArgs e) { #region Notes et pseudocode // Obtenir une référence sur la case cliquée. // Si la case est originale, on ne peut la changer. // Sauvegarder l'état actuel de la case (pour pouvoir annuler) // Ici, il faut faire attention, si on clique la même case, // on ne doit sauver qu'un historique. // Changer la valeur de la case ==> annotations aussi. // La grille est-elle complétée? // Si oui, arrêter le temps, désactiver le menu annuler, afficher un message. // Si non, activer le menu annuler, en jeu, activer le timer. #endregion #region CODE // Obtenir une référence sur la case cliquée. Case c = sender as Case; // Si la case est originale, on ne peut la changer. if (c.originale) { return; } // Sauvegarder l'état actuel de la case (pour pouvoir annuler) // Ici, il faut faire attention, si on clique la même case, // on ne doit sauver qu'un historique. Case precedent = null; Contenu pred = null; if (historique.Count > 0) { pred = historique[historique.Count - 1]; precedent = grille[pred.row, pred.col]; } if ((precedent != c)) { historique.Add(new Contenu(c.row, c.col, c.Text[0], false)); } // Changer la valeur de la case ==> annotations aussi. switch (c.Text[0]) { case ' ': c.SetValue("0"); break; case '0': c.SetValue("1"); break; case '1': c.SetValue(" "); break; } // La grille est-elle complétée? // Si oui, arrêter le temps, désactiver le menu annuler, // afficher un message. // Si non, activer le menu annuler, en jeu, activer le timer. hasChanged = true; MenuAnnuler.Enabled = true; if (etat == Etat.Initial) { etat = Etat.EnJeu; } timer.Enabled = (etat == Etat.EnJeu); #endregion }