UWAGA! Promocja dla firm - MICROSOFT OFFICE 365  na 12 miesiecy ZA DARMO! Tylko na CentrumXP.pl!
Wielka promocja Office 365 na CentrumXP.pl!
Do góry Skomentuj

Notatnik w C#

Notatnik w C#

Autor: Marcin Hałaczkiewicz Opublikowano: 15 czerwca 2006 Odsłon: 60 068

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.

Zobacz również

Komentarze

Kolejny świetny tutorial :) Oby takich jak najwięcej, bo w praktyce najlepiej nauczyć się każdego języka :) Czekam na kolejne! No i może coś z ASP.NET + SQL Server wreszcie się uda?
m010ch, 15 czerwca 2006, 16:15
Wszystko spoko, ale nie chce mi wczytać słówka StreamReader: Error 1 The type or namespace name 'StreamReader' could not be found (are you missing a using directive or an assembly reference?). Co mam zrobić?
abc, 16 czerwca 2006, 16:23
Klasa StreamReader należy do przestrzeni nazw System.IO., tak więc u góry pliku z formą (Form1.cs lub frmNotatnik.cs) powinno znajdować się: using System.IO; Moje niedopatrzenie, artykuł już poprawiony.
Marcin Hałaczkiewicz, 16 czerwca 2006, 18:20
Mam lamerskie pytanko :) Gdzie wpisac string plik = ""; bo nie mam pojecia
Davis, 21 czerwca 2006, 22:14
U góry pliku Form1.cs znajduje się taka oto linijka: public partial class frmNotatnik : Form i pod spodem klamra otwierająca. Jest to fragment definicji klasy frmNotatnik (czyli naszej formy). Jak mówię "dodajemy do formy", to mam namyśli dopisywanie zmiennych do tej właśnie klasy. Innymi słowy dopisujesz string plik = ""; zaraz po klamrze otwierającej {. Jak dalej nie wiesz o co chodzi to zajrzyj do pliku źródłowego Form1.cs (ew. frmNotatnik.cs).
Marcin Hałaczkiewicz, 22 czerwca 2006, 11:50
Wszystko ładnie pięknie dziala ale mam jedno pytanie - jak utworzyć nowe zdarzenie "FormClosing". Jakoś nie moge sobie z tym poradzić :/
whistler, 26 czerwca 2006, 17:14
Będąc w trybie graficznym musisz kliknąć gdzieś na wolnym polu formy (najlepiej na górnym, niebieskim pasku), wtedy w okienku Properties pojawią się jej właściwości. Jest tam żółta ikonka w kształcie pioruna. Po jej naciśnięciu w oknie pojawi się lista zdarzeń dla danego elementu (w tym przypadku formy). Tam znajdujesz FormClosing i klikasz 2 razy w puste pole tekstowe po prawej od nazwy zdarzenia - reszta zrobi się automatycznie.
Marcin Hałaczkiewicz, 27 czerwca 2006, 17:30
Ja bym troszke zmienil: Okienko z wyborem nazwy pliku do zapisu po kliknieciu przycisku Anuluj powinno wracac do programu a nie go zamykac.
Lukasz, 16 sierpnia 2007, 15:34
Mam pytanko... czy można ustawić tak, aby w "Zapisz" , "Zapisz jako" "Otwórz" był nowy typ pliku ?? Tak, żeby było kilka...
Lord500, 15 marca 2008, 21:57
Mam lamerskie pytanko :) Gdzie wpisac string plik = ""; bo nie mam pojecia
Polska, 3 maja 2008, 14:04
Mam pytanko niewiem gdzie wpisac string plik = "";
Mikołaj kopernik 2008, 3 maja 2008, 14:11
m010ch 15 czerwca 2006, 16:15 Kolejny świetny tutorial :) Oby takich jak najwięcej, bo w praktyce najlepiej nauczyć się każdego języka :) Czekam na kolejne! No i może coś z ASP.NET + SQL Server wreszcie się uda? abc 16 czerwca 2006, 16:23 Wszystko spoko, ale nie chce mi wczytać słówka StreamReader: Error 1
Marcin Hałaczkiewicz, 3 maja 2008, 14:58
C# dopiero poznaje i miedzy innymi z kursu tutaj zamieszczonego ale ten przyklad nie jest jakis super... Uruchamiajac cmdWynik_Click powodujemy cmdKropka.Enabled = false; jednak pozniej juz tego nie zmieniamy wiec powtorne urzycie cmdKropka nie jest mozliwe. Nalezaloby dopisac do pokazznaki() linijke: cmdKropka.Enabled = true; Autor poswiecil sporo estetyce i niezawodnosci ale pomimo ze tylko kilka razy uruchomilem pisana aplikacje to wylapalem cos takiego: po wprowadzeniu liczby, wybraniu dzialania, wprowadzeniu liczby i wybraniu "=" mozemy ponownie wprowadzic liczbe jednak nie mozemy wybrac dzialania tzn teoretycznie tak ale aplikacja wykona "=" z dzialaniem zapamietanym przy pierwszym dzialaniu. Ja widze przynajmniej dwa sposoby rozwiazania tego malego niedopatrzenia
JJJJJJJJ, 3 maja 2008, 15:12
1.Tworzymy nowy projekt 2.Wybieramy z toolboxa kontrolkę MenuStrip 3.kontrolce MenuStrip i wpisujemy Edycja niżej Wytnij kopiuj Wklej Usuń i Zaznacz wszystko. 4.Wybieramy toolboxa kontrolkę RichTextBox 5.klikamy dwa razy na Wytnij i wpisujemy kod richTextBox1.Cut(); 5.klikamy dwa razy na Kopiuj i wpisujemy kod richTextBox1.Copy(); 6.klikamy dwa razy na Wklej i wpisujemy kod richTextBox1.Paste(); 7.klikamy dwa razy na Usuń i wpisujemy kod richTextBox1.SelectedText = ""; 8.klikamy dwa razy na Zaznacz wszystko i wpisumy kod richTextBox1.SelectAll();.
gvfg, 10 czerwca 2008, 15:32
Fajna Aplikacylka tylko trache poprawek i gotowe.Np. zamiast TextBoksa trzeba dać RichTextBox.

Olo, 3 stycznia 2009, 16:35
Adres do mojego projektu. Program jest oparty na tym tutorialu, jednak został mocno zmodyfikowany i dodano wiele opcji. Myślę, że może się wam przydać. Zezwalam a wręcz zachęcam do modyfikacji i umieszczania własnych projektów.
 
http://chomikuj.pl/qic/Programowanie/c*23+Simple+Notepad+25-03-2009.zip

qic, 25 marca 2009, 14:59
Dzięki qic, przydało mi się.

carck3r, 29 marca 2009, 11:04
Wielkie dzieki bardzo mi to pomoglo :)
asusik, 26 marca 2010, 21:14
a mozna prosic o haselko do tego pliku?;">
hp21, 22 maja 2011, 23:33

Dodaj swój komentarz

Zasady publikacji komentarzyZasady publikacji komentarzy

Redakcja CentrumXP.pl nie odpowiada za treść komentarzy publikowanych na stronach Portalu
i zastrzega sobie prawo do usuwania wypowiedzi, które:

  • zawierają słowa wulgarne, obraźliwe, prowokujące i inne naruszające dobre obyczaje;
  • są jedynie próbami reklamowania stron internetowych (spamowanie poprzez umieszczanie linków);
  • przyczyniają się do złamania prawa bądź warunków licencyjnych oprogramowania (cracki, seriale, torrenty itp.);
  • zawierają dane osobowe, teleadresowe, adresy mailowe lub numery GG;
  • merytorycznie nie wnoszą nic do dyskusji lub nie mają związku z tematem komentowanego newsa, artykułu bądź pliku.

Autor:

Komentarz:

Dodaj komentarz