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.