• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Zapis właściwości wielu kontrolek do pliku tekstowego.

Aruba Cloud VPS - 50% taniej przez 3 miesiące!
0 głosów
312 wizyt
pytanie zadane 12 sierpnia 2019 w C# przez kuba7528 Obywatel (1,320 p.)

Witam wszystkich.

Piszę niewielki programik który na początku pyta czy "wylosować" właściwości kontrolki RichTextBox. Następnie zapisuje oraz (po kolejnym uruchomieniu programu) odczytuje właściwości (rozmiar kolor i typ czcionki, kolor, rozmiar ,położenie kontrolki itp)  kontrolki do pliku tekstowego. Mój problem polega na tym że chciałbym aby program zapisywał/ odczytywał właściwości innych kontrolek w formie. Domyślam się że trzeba użyć tablic albo listy ale nie do końca wiem jak. Niżej zamieszczam kod.

        TypeConverter Konwersja_fonta, Konwersja_polozenia, konwersja_rozmiaru;
        string kolor, polozenie, tekst, kolor_czcionki, czcionka, rozmiar;
        string[] parametry_zarza = new string[5];
        string[] liczba_kontrolek;
        private void Form13_FormClosing(object sender, FormClosingEventArgs e)
        {


            if (File.Exists(@"g:/plik.txt"))
            {
                StreamWriter sw = new StreamWriter(@"g:/plik.txt");

                kolor = ColorTranslator.ToHtml(richTextBox1.BackColor);
                kolor_czcionki = ColorTranslator.ToHtml(richTextBox1.ForeColor);
                tekst = richTextBox1.Text;

                // Saving Font object as a string
                Konwersja_fonta = TypeDescriptor.GetConverter(typeof(Font));
                Konwersja_polozenia = TypeDescriptor.GetConverter(typeof(Point));
                konwersja_rozmiaru = TypeDescriptor.GetConverter(typeof(Size));
                czcionka = Konwersja_fonta.ConvertToString(richTextBox1.Font);
                polozenie = Konwersja_polozenia.ConvertToString(richTextBox1.Location);
                rozmiar = konwersja_rozmiaru.ConvertToString(richTextBox1.Size);

                sw.WriteLine(kolor);
                sw.WriteLine(kolor_czcionki);
                sw.WriteLine(tekst);
                sw.WriteLine(czcionka);
                sw.WriteLine(polozenie);
                sw.WriteLine(rozmiar);
                sw.Close();
            }
            else
            {
                File.Create(@"g:/plik.txt");
            }
        }

        private void Form13_Load(object sender, EventArgs e)
        {
           


            DialogResult pytanie = MessageBox.Show("Czy chesz wylosować właściwości ?", "Program", MessageBoxButtons.YesNo, MessageBoxIcon.Question);

            if (pytanie == DialogResult.Yes)
            {
                Random los = new Random();
                // foreach (Control c in Controls)
                {
                    richTextBox1.BackColor = Color.FromArgb(los.Next(256), los.Next(256), los.Next(256));
                    richTextBox1.ForeColor = Color.FromArgb(los.Next(256), los.Next(256), los.Next(256));
                    richTextBox1.Size = new Size(los.Next(richTextBox1.Width * 4), los.Next(richTextBox1.Height * 4));
                    richTextBox1.Location = new Point(los.Next(richTextBox1.Location.X * 4, richTextBox1.Location.Y * 4));
                }
            }
            if (pytanie == DialogResult.No)
            {
                if (File.Exists(@"g:/plik.txt"))
                {
                    StreamReader sr = new StreamReader(@"g:/plik.txt");
                    Konwersja_fonta = TypeDescriptor.GetConverter(typeof(Font));
                    konwersja_rozmiaru = TypeDescriptor.GetConverter(typeof(Size));
                    Konwersja_polozenia = TypeDescriptor.GetConverter(typeof(Point));
                    kolor = sr.ReadLine();
                    kolor_czcionki = sr.ReadLine();
                    tekst = sr.ReadLine();
                    czcionka = sr.ReadLine();
                    polozenie = sr.ReadLine();
                    rozmiar = sr.ReadLine();
                    var lines = File.ReadLines(@"g:/plik.txt");

                    foreach (var line in lines)
                    {

                        foreach (Control c in Controls)
                        {
                            richTextBox1.BackColor = ColorTranslator.FromHtml(kolor);
                            richTextBox1.ForeColor = ColorTranslator.FromHtml(kolor_czcionki);
                            richTextBox1.Text = tekst;
                            richTextBox1.Font = (Font)Konwersja_fonta.ConvertFromString(czcionka);
                            richTextBox1.Location = (Point)Konwersja_polozenia.ConvertFromString(polozenie);
                            richTextBox1.Size = (Size)konwersja_rozmiaru.ConvertFromString(rozmiar);
                        }
                    }
                    sr.Close();
                }
                else
                {
                    File.Create(@"g:/plik.txt");
                }
            }

        }

 

1 odpowiedź

+1 głos
odpowiedź 13 sierpnia 2019 przez piotrsz109 Stary wyjadacz (13,730 p.)
Stwórz klasę reprezentującą dane o kontrolkach oraz np.: kontruktor przyjmujący kontrolkę. Następnie zbierasz je wszystkie do listy, a ów kolekcję serializujesz do json'a i tego zapisujesz w pliku.

Pozdrawiam
komentarz 13 sierpnia 2019 przez kuba7528 Obywatel (1,320 p.)
Mógłbyś jaśniej bo nie bardzo rozumiem.
komentarz 14 sierpnia 2019 przez piotrsz109 Stary wyjadacz (13,730 p.)

Tworzysz klasę, reprezentującą właściwości kontrolki.

[System.Serializable]
class ControlViewInfo {
    public string Kolor {get; set;}
    public string Polozenie {get; set;}
    public string Tekst {get; set;}
    public string KolorCzcionki {get; set;}
    public string Rozmiar {get; set;}
    public string Czcionka {get; set;}
}

Możesz tam dodać konstruktor, w którym dodasz ustawianie tych wartości.

Następnie musisz pobrać wszystkie kontrolki.

public IEnumerable<Control> GetAllControls(ref Control control){
    foreach(var item in control.Controls){
        yield return item;
        foreach(var temp in GetAllControls(ref item){
            yield return temp;
        }
    }
}

Nie jestem pewien, czy będzie działać z ref - jeśli będzie wyrzucać błąd, wystarczy usunąć ref.

Następnie robisz foreach przez powyższe IEnumerable i wtedy z każdego elementu tworzysz instancję klasy ControlViewInfo i dodajesz ją do listy.

Na koniec serializujesz listę i wpisujesz do pliku.

Odczytywanie działa podobnie - wczytujesz z pliku, deserializujesz klasę, robisz foreach i wtedy na każdym elemencie IEnumerable ustawiasz dane z danego elementu listy.

komentarz 14 sierpnia 2019 przez kuba7528 Obywatel (1,320 p.)

@piotrsz109,

Skasowałem te 2 ref-y ale wywala dwa błędy.

W pierwszym wydaje mi się że trzeba użyć konwersji podobnej do tej jak stosowałem wcześniej ale to są tylko moje domysły. Co do drugiego to nie mam pojęcia co zrobić.

komentarz 14 sierpnia 2019 przez piotrsz109 Stary wyjadacz (13,730 p.)
Musisz w 183 linii mieć control.Controls.Cast<Control>()

Mój błąd

Podobne pytania

0 głosów
1 odpowiedź 238 wizyt
+1 głos
1 odpowiedź 6,249 wizyt
pytanie zadane 18 sierpnia 2016 w C# przez jankustosz1 Nałogowiec (36,800 p.)
0 głosów
0 odpowiedzi 161 wizyt
pytanie zadane 29 grudnia 2022 w C# przez Mati336 Użytkownik (560 p.)

93,191 zapytań

142,206 odpowiedzi

322,042 komentarzy

62,518 pasjonatów

Advent of Code 2024

Top 15 użytkowników

  1. 3053p. - dia-Chann
  2. 2998p. - Łukasz Piwowar
  3. 2993p. - Łukasz Eckert
  4. 2970p. - CC PL
  5. 2930p. - Tomasz Bielak
  6. 2907p. - Łukasz Siedlecki
  7. 2890p. - rucin93
  8. 2584p. - Adrian Wieprzkowicz
  9. 2536p. - Mikbac
  10. 2485p. - Marcin Putra
  11. 2418p. - Michal Drewniak
  12. 2239p. - Michał Telesz
  13. 2156p. - Anonim 3619784
  14. 1733p. - rafalszastok
  15. 1650p. - Mariusz Fornal
Szczegóły i pełne wyniki

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

Wprowadzenie do ITsec, tom 1 Wprowadzenie do ITsec, tom 2

Można już zamawiać dwa tomy książek o ITsec pt. "Wprowadzenie do bezpieczeństwa IT" - mamy dla Was kod: pasja (użyjcie go w koszyku), dzięki któremu uzyskamy aż 15% zniżki! Dziękujemy ekipie Sekuraka za fajny rabat dla naszej Społeczności!

...