Witam, przyznaję, że aż głupio mi cały czas prosić o pomoc, ale dostając jedynie treści zadań ciężko jest cokolwiek napisać, jeśli wcześniej nie widziało się przykładu.

Mam do napisania PROSTY edytor dwóch rodzajów plików. Sugerowane: .txt oraz .bmp. Nie mam pojęcia jak ruszyć zrobienie edycji pliku (głównie .bmp), skoro to jest oddzielna klasa (edycja) wywoływana jeszcze w innej klasie (fabryka). Jakiekolwiek pomysły, wytknięcie błędów, itp. będzie dla mnie bardzo pomocne. Nie oczekuję, że za mnie to napiszecie - ale proszę o jakieś konkretne wskazówki.

Chodzi już o sam fakt tego, że kontrolki dodaję w klasie podgląd a edycji nie wywołuję z tej klasy, żebym mógł cokolwiek przekazać parametrem.

 
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.IO;

namespace fabrykaAbstrakcyjna
{
    public partial class Form1 : Form
    {
        private IFabrykaAbstrakcyjna f;
        private IObiekt o;

        public Form1()
        {
            InitializeComponent();
        }

        private void plikOtworz_Click(object sender, EventArgs e)
        {
            Controls.Clear();
            InitializeComponent();
            OpenFileDialog otworz = new OpenFileDialog();
            otworz.Filter = "Mapa bitowa | *.bmp; *.BMP | Dokument tekstowy | *.txt";
            otworz.Title = "Otwórz";
            otworz.ShowDialog();

            if (otworz.FileName != "")
            {
                plikZapisz.Enabled = true;

                if (Path.GetExtension(otworz.FileName) == ".txt")
                {
                    this.f = new FabrykaAbstrakcyjnaTxt();
                }
                else if (Path.GetExtension(otworz.FileName) == ".bmp")
                {
                    this.f = new FabrykaAbstrakcyjnaBmp();
                }
                o = f.dajObiekt(otworz.FileName.ToString());
                f.dajPodglad(this, o);
            }
        }

        private void plikZakoncz_Click(object sender, EventArgs e)
        {
            Application.Exit();
        }

        private void plikZapisz_Click(object sender, EventArgs e)
        {

        }
    }

    interface IFabrykaAbstrakcyjna
    {
        IObiekt dajObiekt(string sciezka);
        void dajPodglad(Form form, IObiekt o);
        void dajEdycja(IObiekt o); 
    }

    public class FabrykaAbstrakcyjnaTxt : IFabrykaAbstrakcyjna
    {
        IObiekt IFabrykaAbstrakcyjna.dajObiekt(string sciezka)
        {
            return new ObiektTxt(sciezka);
        }

        void IFabrykaAbstrakcyjna.dajPodglad(Form form, IObiekt o)
        {
            IPodlgad p = new PodgladTxt(form, o);

        }

        void IFabrykaAbstrakcyjna.dajEdycja(IObiekt o)
        {
            IEdycja e = new EdycjaTxt(o);
        }
    }

    public class FabrykaAbstrakcyjnaBmp : IFabrykaAbstrakcyjna
    {
        IObiekt IFabrykaAbstrakcyjna.dajObiekt(string sciezka)
        {
            return new ObiektBmp(sciezka);
        }

        void IFabrykaAbstrakcyjna.dajPodglad(Form form, IObiekt o)
        {
            IPodlgad p = new PodgladBmp(form, o);

        }

        void IFabrykaAbstrakcyjna.dajEdycja(IObiekt o)
        {
            IEdycja e = new EdycjaBmp(o);
        }
    }

    public abstract class IObiekt
    {
        protected string sciezkaPliku;
    }

    public class ObiektTxt : IObiekt
    {
        private StreamReader reader;
        private string tekst;

        public string Tekst
        {
            get { return tekst; }
        }

        public ObiektTxt(string sciezka)
        {
            this.sciezkaPliku = sciezka;
            reader = new StreamReader(sciezka);
            czytajPlik();
        }

        private void czytajPlik()
        {
            tekst = reader.ReadToEnd();
        }
    }

    public class ObiektBmp : IObiekt
    {
        private Bitmap g;

        public Bitmap G
        {
            get { return g; }
        }

        public ObiektBmp(string sciezka)
        {
            this.sciezkaPliku = sciezka;
            wczytajObraz();
        }

        private void wczytajObraz()
        {
            g = new Bitmap(Image.FromFile(sciezkaPliku));
        }
    }

    interface IPodlgad
    {
        void wyswietl();
    }

    public class PodgladTxt : IPodlgad
    {
        private TextBox txtPodglad;
        private ObiektTxt obiekt;
        internal PodgladTxt(Form form, IObiekt o)
        {
            obiekt = o as ObiektTxt;
            txtPodglad = new TextBox();
            txtPodglad.Multiline = true;
            txtPodglad.Location = new Point(12, 36);
            txtPodglad.Width = 464;
            txtPodglad.Height = 267;
            form.Controls.Add(txtPodglad);
            wyswietl();
        }

        public void wyswietl()
        {
            txtPodglad.Text = obiekt.Tekst;
        }

    }

    public class PodgladBmp : IPodlgad
    {
        private PictureBox obraz;
        private Bitmap bitmapa;
        private ObiektBmp obiekt;
        internal PodgladBmp(Form form, IObiekt o)
        {
            obiekt = o as ObiektBmp;
            obraz = new PictureBox();
            obraz.Width = 464;
            obraz.Height = 267;
            obraz.Location = new Point(12, 36);
            obraz.BackColor = Color.Gray;
            bitmapa = new Bitmap(obraz.Width, obraz.Height);
            form.Controls.Add(obraz);
            wyswietl();
        }

        public void wyswietl()
        {
            obraz.Image = obiekt.G;
            obraz.Refresh();
        }

    }

    interface IEdycja
    {
    }

    public class EdycjaTxt : IEdycja
    {
        internal EdycjaTxt(IObiekt e)
        {
        }
    }

    public class EdycjaBmp : IEdycja
    {
        private ObiektBmp o; 
        private Bitmap b; 
        private Graphics g; 
        private PodgladBmp p;
        
       
        internal EdycjaBmp(IObiekt e)
        {
            o = e as ObiektBmp;
            b = o.G;
            g = Graphics.FromImage(b);
            Edytuj();
        }

        void Edytuj()
        {
            g.DrawEllipse(new Pen(Color.Red), 10, 10, 10, 10);
            

        }
    }
}
    

Czy dobrze kombinuje? Ta edycja może ograniczać się do rysowania samej linii, okręgu, czegokolwiek. Jak to w ogóle ugryźć?

Zapomniałem dopisać, że wiem o tym, że fabryka powinna być Singletonem, zostawiłem to jednak na koniec.