Dziś napiszemy prostą aplikację przypominającą Notatnik - standardowy składnik
Windows. Nauczymy
się jak dodać menu do programu, poznamy również metody postępowania z kontrolką
TextBox. Dowiemy się także jak zapisać/odczytać tekst do i z pliku oraz
wykorzystamy wbudowane w .NET okienka dialogowe.

Na początek tworzymy nowy projekt, nazwa - Notatnik.
Taki sam tekst wpisujemy we właściwości Text nowo utworzonej formy, którą
nazywamy frmNotatnik. Rozmiar zostawiamy domyślny, tzn. 300x300. Dodajmy
teraz menu. W tym celu wybieramy z toolboxa MenuStrip i klikamy na
formatkę. Nazwę menu zmieniamy na menu. Po jego utworzeniu zobaczymy (w
edytorze graficznym) miejsce do wpisania tekstu, będzie tam napisane Type
Here. Klikamy w to miejsce i piszemy Plik. Następnie pod spodem pojawi się
takie same pole, w które wpisujemy Nowy, później Otwórz,
dalej Zapisz i na samym dole Zapisz jako. Na razie
zostawmy świeżo utworzone menu i zajmijmy się stworzeniem miejsca do pisania.
Dodajemy kontrolkę TextBox i nazywamy ją txtTresc. Location
dajemy na 0;24, a Size na 292;243. Klikamy na strzałeczkę przy
właściwości Anchor i wybieramy wszystkie 4 ściany (Top, Bottom,
Left, Right). Dzięki temu podczas zmiany wielkości formy okienko z
tekstem nadal będzie ją całą wypełniać (będzie "trzymało" się wszystkich 4
boków). Dodajemy jeszcze pasek pionowego
przewijania zmieniając ScrollBars na Vertical oraz pozwólmy na
pisanie w wielu linijkach poprzez ustawienie MultiLine na true.
Nasz programik jest już prawie gotowy, musimy jeszcze tylko oprogramować menu.
Zanim to zrobimy, przejdźmy do widoku kodu formy. U góry pliku dopiszmy:
using System.IO;
W przestrzeni nazw IO znajdują się klasy, dzięki którym można zapisywać do/z plików.
Dodajmy do formy jedną zmienną:
string plik = "";
Posłuży ona do zapamiętania nazwy pliku, z którym aktualnie pracujemy.
Potrzebna będzie również funkcja:
private DialogResult czyzapisac()
{
DialogResult odp = MessageBox.Show("Chcesz zapisać zmiany?",
"Notatnik",
MessageBoxButtons.YesNoCancel, MessageBoxIcon.Exclamation);
if (odp == DialogResult.Yes)
zapiszToolStripMenuItem_Click(null,
null);
return odp;
}
Przyda się podczas np. zamykania okna programu. Jeśli będzie wpisany jakiś
tekst, to padnie pytanie czy go zapisać. zapiszToolStripMenuItem_Click to funkcja (zdarzenie)
wywoływana po wybraniu opcji zapisz w menu, zaraz zajmiemy się jej
oprogramowywaniem.
Wracamy do edytora graficznego, rozwijamy menu i klikamy 2 razy na Nowy.
W nowo powstałym zdarzeniu wpisujemy:
if (txtTresc.Text != "")
{
DialogResult odp = czyzapisac();
if (odp == DialogResult.Cancel)
return;
plik = "";
txtTresc.Clear();
}
Będzie ono odpowiedzialne za wyczyszczenie starego tekstu i na życzenie
użytkownika zapisanie go do pliku. Teraz to samo (2 x klik) robimy z Otwórz,
wpisujemy kod:
if (txtTresc.Text != "")
{
DialogResult odp = czyzapisac();
if (odp == DialogResult.Cancel)
return;
plik = "";
txtTresc.Clear();
}
OpenFileDialog dialog = new OpenFileDialog();
dialog.Filter = "Plik tekstowy (*.txt)|*.txt";
dialog.Multiselect = false;
dialog.ShowDialog();
if (dialog.FileName != "")
{
plik = dialog.FileName;
StreamReader f = new StreamReader(plik);
txtTresc.Text = f.ReadToEnd();
f.Close();
}
Jego zadaniem jest sprawdzenie czy jest już coś wpisane - jeśli tak, to pada
pytanie dotyczące zapisu. Następnie tworzony jest obiekt klasy OpenFileDialog,
która umożliwia nam wybranie pliku do otwarcia. Ustawiamy filtr tak, aby można
było wybrać jedynie pliki tekstowe. Najpierw wpisujemy w nim to, co ma być wyświetlane,
czyli Plik tekstowy (*.txt), następnie pionową kreskę | i na końcu
rodzaj pliku - *.txt. Poprzez ustawienie MultiSelect na false
nie pozwalamy na wybór więcej niż jednego pliku. Możemy już wyświetlić okienko
wywołując metodę ShowDialog. Do odczytania zawartości pliku
wykorzystujemy klasę StreamReader, która pozwala odczytywać dane z
różnych strumieni (nie tylko tekstowych i nie tylko z plików). Funkcja
ReadToEnd zwróci nam string, w którym znajdzie się cała zawartość pliku. Po
wszystkim zamykamy strumień.
Teraz zajmijmy się opcją Zapisz. Standardowo dodajemy zdarzenie i
wpisujemy:
if (plik != "")
{
StreamWriter f = new StreamWriter(plik);
f.Write(txtTresc.Text);
f.Close();
}
else zapiszJakoToolStripMenuItem_Click(sender, e);
Na początku sprawdzamy czy zmienna plik zawiera jakiś tekst. Tu
uwidacznia się jej znaczenie. Jeśli zapisujemy tekst po raz pierwszy przy użyciu
Zapisz, to wywoła się Zapisz jako. Natomiast gdy tekst był już
wcześniej zapisywany, to zostanie on zapisany do tego samego pliku co
poprzednio. Podobna zasada obowiązuje w większości współczesnych programów.
Pozostało nam już tylko polecenie Zapisz jako. Postępujemy identycznie jak
poprzednio. Kod zdarzenia to:
SaveFileDialog dialog = new SaveFileDialog();
dialog.Filter = "Plik tekstowy (*.txt)|*.txt";
dialog.ShowDialog();
if (dialog.FileName != "")
{
plik = dialog.FileName;
StreamWriter f = new StreamWriter(plik);
f.Write(txtTresc.Text);
f.Close();
}
Wykorzystujemy tutaj okienko dialogowe SaveFileDialog do wyboru pliku do zapisu. Działa ono
prawie identycznie jak OpenFileDialog. Możemy jednak wskazać zarówno
istniejący plik, jak i wpisać nową, unikalną nazwę. W pierwszym przypadku
istniejący plik zostanie zmieniony, w drugim - utworzy się nowy dokument. Filtr ustawiamy tak samo jak w
Otwórz, a następnie pokazujemy okno. Jeśli coś wybraliśmy to przy pomocy
klasy StreamWriter zapisujemy pod wskazane miejsce zawartość
txtTresc.Text, po czym zamykamy strumień.
Menu już ukończone i program w zasadzie też. Po chwili zabawy możemy jednak
zauważyć, że gdy wpiszemy jakiś tekst i będziemy chcieli zamknąć aplikację to
tak właśnie się stanie. Lepiej by było gdyby padło pytanie czy zapisać plik. Aby
to umożliwić tworzymy zdarzenie FormClosing (nowość w .NET 2.0) dla naszej
formy. Wewnątrz wpisujemy:
if (txtTresc.Text != "")
{
DialogResult odp = czyzapisac();
if (odp == DialogResult.Cancel)
e.Cancel = true;
}
Funkcja czyzapisac zada odpowiednie pytanie i w
razie potrzeby zapisze plik. Jeśli nacisnęliśmy Anuluj - kończenie
działania programu zostanie przerwane, w przeciwnym wypadku aplikacja zakończy
swoje działanie.
Program ten był dość prosty do napisania, jednak pokazuje
funkcjonalność platformy .NET oraz narzędzia Visual C# 2005 Express Edition. Bez
wbudowanych okienek dialogowych nie dałoby się tak łatwo wskazać pliku do
odczytu czy zapisu. Bardzo wygodnie tworzy się również menu. Po dodaniu
MenuStrip należy jedynie powpisywać nazwy poszczególnych opcji, a żeby
oprogramować wybranie elementu wystarczy na nim 2 razy kliknąć. Oczywiście
programik można wyposażyć w kolejne opcje jak np. wyszukiwanie lub podmienianie
tekstu. Życzę miłej zabawy przy eksperymentowaniu.
Stworzony tutaj program wraz z plikami źródłowymi możemy pobrać stąd.