dwie formy, mdiparent - zapis/odczyt danych do pliku

0

Witam, pisze aplikację Gra w życie i mam problem z zapisywaniem oraz odczytaniem danych. Otóż, moja aplikacja składa się z dwóch form głównej-rodzica oraz drugiej formy, dziecka. W głównej formie w menu mam opcje zapisu oraz odczytu danych ale nie wiem jak się za nie zabrać. Chciałbym aby dzięki nim zapisać dane z formy-dziecka do pliku a później je np odczytać. Może ktoś ma jakieś przykłady, linki programów a najlepiej opis jak to mógłbym zrobić. Za wszystkie sugestie dzięki

0

ale dokładnie to czego nie wiesz? Jak znaleźć aktywną formę MDIChildren - google, jak zapisać dane - google. A jak już będziesz miał KONKRETNE pytanie to wtedy wróć - na pewno ktoś podpowie Ci coś KONKRETNEGO

0

mam taką sytuację z kodem:
Klasa rysuje siatkę na planszy oraz komórki

 
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Drawing;
using System.Drawing.Drawing2D;

namespace Gra_w_życie
{
    class Rysunek
    {
        public int[,] komorka = new int[50,50];
        public int maxX;
        public int maxY;
        private int plansza = 500;
        private int RozmiarKomorki;

        Ustawienia U_ustawienia = new Ustawienia();
        
        public void RysujPictureBox(ComboBox cBox, ColorDialog color, System.Windows.Forms.PaintEventArgs e)
        {
            maxX = maxY = U_ustawienia.wybor(cBox);
            RozmiarKomorki = plansza / maxX;
            Graphics rysuj = e.Graphics;

            Pen dlugopis = new Pen(Color.Black, 1);
            for (int i = 0; i <= plansza; i += RozmiarKomorki)
            {
                rysuj.DrawLine(dlugopis, 0, i, plansza, i);
                rysuj.DrawLine(dlugopis, i, 0, i, plansza);
            }
            dlugopis.Dispose();

            Color nkolor = new Color();
            nkolor = color.Color;
            for (int X = 0; X < maxX; X++)
            {
                for (int Y = 0; Y < maxY; Y++)
                {
                    SolidBrush colorFill = new SolidBrush(nkolor);
                    if (komorka[Y, X] == 1)
                        rysuj.FillRectangle(colorFill, (Y * RozmiarKomorki) + 1, (X * RozmiarKomorki) + 1, RozmiarKomorki - 1, RozmiarKomorki - 1);
                    colorFill.Dispose();
                }
            }
        }
        public void Mysz(PictureBox plansza, MouseEventArgs zaznacz)
        {
            if (zaznacz.X < plansza.Width && zaznacz.Y < plansza.Height && zaznacz.X > 0 && zaznacz.Y > 0 && zaznacz.Button == MouseButtons.Left)
            {
                int myszX = (zaznacz.X) / RozmiarKomorki;
                int myszY = (zaznacz.Y) / RozmiarKomorki;
                this.komorka[myszX, myszY] = 1;
                plansza.Refresh();
            }
        }
    }
}


A tutaj główna forma z której chciałbym zapisać i odczytać do pliku:


  private void zapisz_Click(object sender, EventArgs e)
        {
            
            SaveFileDialog zapisz = new SaveFileDialog();
            zapisz.Filter = "Plik jpg (*.jpg)|*.jpg";    

            if (zapisz.ShowDialog() == DialogResult.OK)
            {
              //tutaj zaczyna się problem
            }
            
            zapisz.Dispose();
        }

 
0

no fajnie ale nadal nie zapytałeś o nic konkretnego. Co byś chciał zapisać i odczytać? Czy naprawdę jest tak trudno wyrazić swoje myśli?

0

Chciałbym zapisać tablicę komorka aby później można było wczytać z powrotem zapisany plik. Chodzi mi o to aby zapisać stan gry tak aby dało radę później ją kontynuować

0

ok, to teraz napisz z czym masz konkretnie problem. Nie potrafisz stworzyć pliku? Nie potrafisz zapisać/odczytać z pliku? To wszystko jest bardzo ładnie opisane w niejednym kursie/FAQu i to po polsku

0

Nie wiem czy dobrze rozwiązałem problem zapisu.

 
private void zapisz_Click(object sender, EventArgs e)
        {
           
              Rysunek R_rysunek = new Rysunek();
         
            SaveFileDialog zapisz = new SaveFileDialog();
            zapisz.Filter = "Plik csv (*.csv)|*.csv";    //|Plik JPEG (*.jpeg)|*.jpeg|Plik PNG (*.png)|*.png|Plik GIF (*.gif)|*.gif|Plik TIFF (*.tiff)|*.tiff";

            if (zapisz.ShowDialog() == DialogResult.OK)
            {
              StreamWriter writer = new StreamWriter(zapisz.FileName);

              for (int i = 0; i < R_rysunek.komorka.GetLength(0); i++)
                  for (int j = 0; j < R_rysunek.komorka.GetLength(1); j++)
                  {
                      if (j < (R_rysunek.komorka.GetLength(1) - 1))
                      {
                          writer.Write(R_rysunek.komorka[i, j].ToString() + ";");
                      }
                      else
                      {
                          writer.Write(R_rysunek.komorka[i, j].ToString());
                      }


                      if ((j == (R_rysunek.komorka.GetLength(1)) - 1) && i < R_rysunek.komorka.GetLength(0) - 1)
                      {
                          writer.Write("\n");
                      }
                  };
            }
            
            zapisz.Dispose();
        }
0
  1. dlaczego zapisz/wczytaj nie jest metodą klasy Rysunek

  2. zamiast Pen dlugopis = new Pen(Color.Black, 1); i dlugopis.Dispose(); stosuj using (var dlugopis = new Pen(Color.Black, 1)) { }. Jest też coś takiego jak Pens.Black. Tak samo z resztą zmiennych, które są "disposable". Zaletą using jest też to, że Dispose() wykona się zawsze - jest to opakowane w blok try .. finally

  3. for (int i = 0; i < R_rysunek.komorka.GetLength(0); i++)
    for (int j = 0; j < R_rysunek.komorka.GetLength(1); j++)
    {
    if (j < (R_rysunek.komorka.GetLength(1) - 1))
    {
    writer.Write(R_rysunek.komorka[i, j].ToString() + ";");
    }
    else
    {
    writer.Write(R_rysunek.komorka[i, j].ToString());
    }

                   if ((j == (R_rysunek.komorka.GetLength(1)) - 1) && i < R_rysunek.komorka.GetLength(0) - 1)
                   {
                       writer.Write("\n");
                   }
    
</ol>
możesz zapisać jako - mniej jednego sprawdzania a i kod bardziej czytelny
<code class="c#">          for (int i = 0; i < R_rysunek.komorka.GetLength(0); i++)
          {
                      for (int j = 0; j < R_rysunek.komorka.GetLength(1); j++)
                      {
                                 if (j < (R_rysunek.komorka.GetLength(1) - 1))
                                 {
                                            writer.Write(R_rysunek.komorka[i, j].ToString() + ";");
                                 }
                                 else
                                 {
                                            writer.Write(R_rysunek.komorka[i, j].ToString());
                                 }
                      }
                      writer.Write("\n");
           }

Jeśli zapisuje tak jak chciałeś to znaczy, że jest OK

0

zapisz/wczytaj nie są metodami klasy Rysunek ponieważ ta klasa przekazuje dane do Formy dziecka(u mnie to Gra) w której rysuje się siatka gry i komórki a te metody są w Formie rodzica (u mnie to Aplikacja). Dzięki za dotychczasową pomoc :D a mógłbyś mnie nakierować jeszcze z odczytem tego tak aby wczytało ten plik oraz wyświetliło Formę Gry

2

to tłumaczenie ma niewielki sens. Nic nie stoi na przeszkodzie aby zapis/odczyt był w klasie rysunek.

Wg mnie dużo prościej by było zapisywać planszę binarnie. Najpierw zapisujesz w pliku wysokość i szerokość (2 inty) a potem całą tablicę na po elemencie (bez żadnych średników czy znaków końca linii). Przy odczycie najpierw odczytujesz wysokość i szerokość planszy (też 2 inty), tworzysz tablicę o odpowiednich rozmiarach i odczytujesz ją po elemencie

0

A mam pytanie odnośnie zapisanego pliku. Podczas otwarcia jego za pomocą notatnika zostaje on wypełniony samymi zerami bez względu czy komórki są żywe czy martwe. Nie powinno być tak że komórka która jest żywa przyjmuje wartość 1 a martwa 0?

0

zależy co zapisujesz

1 użytkowników online, w tym zalogowanych: 0, gości: 1