Notatnik w C#

Notatnik w C#

Autor: Marcin Hałaczkiewicz

Opublikowano: 6/15/2006, 12:00 AM

Liczba odsłon: 94084

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.

Jak wykorzystać Copilot w codziennej pracy? Kurs w przedsprzedaży
Jak wykorzystać Copilot w codziennej pracy? Kurs w przedsprzedaży

Wydarzenia