login  Naam:   Wachtwoord: 
Registreer je!
 Tutorials

Tutorials > Gecombineerd


Gegevens:
Geschreven door:
Abbas
Moeilijkheidsgraad:
Normaal
Hits:
12768
Punten:
Aantal punten:
 (4.36)
Aantal stemmen:
14
Stem:
Niet ingelogd
Nota's:
 Lees de nota's (14)
 

Tutorial:

Zelf kladblok maken

1. Inleiding
2. Lay-out
3. Menu "Menu"
4. Menu "Bewerken"
5. Extra
6. besluit



1. Inleiding

Welkom.
In deze tutorial ga ik uitleggen hoe je een eigen simpele kladblok maakt. Onze eigen kladblok
zal enkele nuttige functionaliteiten bevatten maar niet echt geavanceerd zijn. Enkele van deze
functionaliteiten zijn: tekstbestanden openen en bewaren, een menutje met opties zoals 'knippen'
en 'plakken'. Niet echt veel moeilijk, maar het moet toch uitgelegd worden. Stap voor stap gaan we
van een lege Form naar het eindresultaat. Enige kennis over het werken met WindowsForm is wel een
vereiste. Indien je die niet hebt kan je beter even eerst mijn tutorial over het werken met Forms
lezen. Dat maakt het hier al een stuk gemakkelijker. Genoeg inleiding nu, tijd voor het echte werk!


pijl top


2. Lay-out

Open een nieuw project en kies voor een "WindowsApplication". Je geeft het een naam, kiest de locatie
en zorg dat "Create directory for solution" staat AANgevinkt. Klik daarna op OK. Je zal zien dat er
een lege Form wordt gemaakt. Als je met de rechtermuisknop klikt kan je kiezen voor "View Code".
Als je in C# werkt zal je zien dat er al een stuk code staat, in VB.NET staat er enkel de definitie
van je klasse. Dat maakt niet veel uit, de lay-out. Wat hebben we nodig?

- TextBox
- MenuStrip (uitleg volgt nog)
- saveFileDialog (uitleg volgt nog)
- openFileDialog (uitleg volgt nog)

Meer eigenlijk niet. Eerst zeten we nog enkele eigenschappen van de Form zelf. Het eigenschappen venster
kan je tonen via het menu "View" en dan "Properties Window". Stel als size 800 op 600, de FormBorderStyle
zet je op "FixedSingle", en de Text op "Mini Kladblok" of iets dergelijks, zet ook de MaximizeBox op "False".
Gebruik nu de sneltoets: Ctrl + Alt + x. Je ziet links de ToolBox verschijnen. Van hieruit kunne we de
Controls slepen op onze Form. Sleep vanuit het submenu "Menus & Toolbars" een MenuStrip naar de Form en
vanuit "Common Controls" een TextBox. Als je de TextBox geselecteerd hebt zie je rechtsboven een pijltje.
Klik hierop en vink de optie "Multiline" aan. Zet de Name eigenschap van de TextBox op "area" of iets
wat je zelf wilt, zet ook de Dock eigenschap op "Fill", dit is het middenste van de knoppen dat je ziet
als je deze optie wilt wijzigen. Zet de Name van de menuStrip op "menu". Sleep nu nog als laatste vanuit het
submenu "Dialogs" een openFileDialog en saveFileDialog naar je Form. Zet de Name eigenschap ervan op "bewaarForm"
en "openForm". Zoals je wel al zult gemerkt hebben staan er 3 icoontje vanonder aan je scherm. Deze staan daar
zodat ze niet in de weg zitten voor je Form. Nu moeten we enkel nog items aan ons menu toevoegen. Je zal zien
dat er kadertje komt met de tekst "Type here". Hier komen de namen van de menu's. Zorg dat je een menu "Menu"
en "Bewerken" hebt. Als deze er zijn klik je een keer op een menu-item en dan komt daaronder hetzelfde. Hier
voeg je voor het menu "Menu" de volgende items toe: Nieuw, Openen, Bewaren, Afsluiten. En voor het menu "Bewerken
zorg je voor: Ongedaan maken, Alles selecteren, Kopieren, Knippen, Plakken. Veel uitleg maar ik denk dat een
afbeelding ook veel duidelijkheid schept. Mijn lay-out ziet er zo uit:

Layout Form

Nu kan je je project al eens testen door te kiezen voor het menu "Debug" en dan "Start Debugging" of druk op F5.
Als alles correct is moet je nu een Form zien die niet resizable of maximaliseerbaar is. Je hebt je menu met
alle items daarin en een tekstvak dat de rest van de Form vult. Nu dat alles (eindelijk) klaar is kunnen we
met de code beginnen om alles te doen werken.

Nog iets: zorg dat je deze libraries hebt ingeldaen in je codefile:

C#VB.NET
using System;
using System.Collections;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Drawing.Printing;
using System.Text;
using System.Windows.Forms;
using System.Reflection;
using System.Diagnostics;
using System.Threading;
using System.IO;
Imports System
Imports System.Collections
Imports System.Collections.Generic
Imports System.ComponentModel
Imports System.Data
Imports System.Drawing
Imports System.Drawing.Printing
Imports System.Text
Imports System.Windows.Forms
Imports System.Reflection
Imports System.Diagnostics
Imports System.Threading
Imports System.IO




pijl top


3. Nieuw bestand, Bestand opslaan / openen

Het eerste wat we moeten doen is kijken of onze tekst is gewijzigd. Als dit niet het geval is kunnen we zonder
probleem het programma sluiten of een nieuw bestand aanmaken. Dit kunnen we nagaan door het event "TextChanged",
dat zal geactiveerd worden wanneer de tekst van ons tekstvak gewijzigd wordt. Hiervoor gebruiken we een boolean.
Als er wijzigingen zijn zetten we hem op 'true' en anders op 'false'. Dubbelklik op het tekstvak en een event
hiervoor wordt automatisch gemaakt. Zorg dat de code er zo uit ziet:

C#VB.NET
bool wijziging = false;
private void area_TextChanged(object sender, EventArgs e)
{
      wijziging = true;
}
Dim wijziging As Boolean = False
Private Sub area_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles area.TextChanged
      wijziging = True
End Sub


Nu dit klaar is kunnen we de code voor de menu-items gaan doen. We gaan stap voor stap alle items doen en beginnen
bij het menu "Menu". Het eerste item is "Nieuw". Ga naar je Form en dubbelklik op dat menu-item. Een event wordt aangemaakt.
Hierin zet je de volgende code:

C#VB.NET
if (bewaard())
{
  area.Text = "";
  wijziging = false;
}
If bewaard() = True Then
   area.Text = ""
   wijziging = False
End If


Je ziet in het if-statement staan: bewaard(). Deze functie heeft als return-waarde een boolean.
Als er wijzigingen zijn ga je naar die functie die nakijkt of het bestand
al bewaard werd of niet. Je krijg dan MessageBox, je kan dan kiezen tussen 'Yes', 'No' of 'Cancel'. Bij 'Yes' wordt je
door gestuurd naar de functie "bewaren()" (code volgt), bij 'No' wordt alles genegeerd en maak je een nieuw bestand
en 'Cancel' spreekt voor zich: er gebeurt niets. Hier is de code van de functie "bewaard()":

C#VB.NET
private Boolean bewaard()
{
   if (wijziging)
   {
       DialogResult dlg_res;
       dlg_res = MessageBox.Show("Er zijn wijzigingen. Wilt u deze opslaan?", "Wijziging", MessageBoxButtons.YesNoCancel, MessageBoxIcon.Exclamation);

       if (dlg_res == DialogResult.Yes)
       {
           return bewaren();
       }
       if (dlg_res == DialogResult.No)
       {
           wijziging = false;
           return true;
       }
       if (dlg_res == DialogResult.Cancel)
       {
           return false;
       }
   }
     return true;
}
Private Function bewaard() As Boolean

   If wijziging = True Then
       Dim dlg_res As DialogResult
       dlg_res = MessageBox.Show("Er zijn wijzigingen. Wilt u deze opslaan?", "Wijziging", MessageBoxButtons.YesNoCancel, MessageBoxIcon.Exclamation)

       If dlg_res = DialogResult.Yes Then
           Return bewaren()
       End If
       If dlg_res = DialogResult.No Then
           wijziging = False
           Return True
       End If
       If dlg_res = DialogResult.Cancel Then
           Return False
       End If
   End If
     Return True

End Function


Hieronder volgt de code voor de functie "bewaren()", ook deze geeft als return-waarde een boolean. Deze functie wordt
enkel opgeroepen indien we kiezen voor 'Yes' als ons gevraagd wordt om de wijzigingen op te slaan. In deze code gaan we
de saveFileDialog oproepen en weergeven, we zetten de standaardlocatie op de C-schijf. Als er toch geannuleerd wordt
gaan we gewoon terug naar onze kladblok. Indien we wel willen bewaren halen we de bestandsnaam op en maken we een
StreamWriter aan. Deze zorgt ervoor dat we tekstbestanden kunnen aanmaken. We maken via de StreamWriter een tekstbestand
aan met als naam onze gekozen naam en schrijven de inhoud van ons tekstvak naar het bestand, nadie maken we de
StreamWriter leeg en zetten we de wijziging terug op 'false' en returnen we 'true' (bestand bewaard). Het geheel
zit in een try-catch blok om fouten tijdens dit proces op te vangen en netjes weer te geven, anders loopt het programma
vast als er iets mis gaat. Er staat hier ook een tutorial over Foutafhandeling in .NET!
Hier is de code voor de functie "bewaren()";

C#VB.NET
private Boolean bewaren()
{
   string filename;
   try
   {
       DialogResult dlg_res;
       saveFileDialog1.InitialDirectory = "C:";
       dlg_res = saveFileDialog1.ShowDialog();

       if (dlg_res == DialogResult.Cancel)
       {
           wijziging = true;
           return false;
       }

       filename = saveFileDialog1.FileName;
       StreamWriter filesave = new StreamWriter(filename);
       filesave.WriteLine(area.Text);
       filesave.Flush();
       filesave.Close();
       wijziging = false;
       return true;
   }
   catch (Exception x)
   {
       MessageBox.Show(x.Message, "Fout!", MessageBoxButtons.OK, MessageBoxIcon.Error);
       return false;
   }
}
Private Function bewaren() As Boolean

   Dim filename As String
   Try
       Dim dlg_res As DialogResult
       saveFileDialog1.InitialDirectory = "C:"
       dlg_res = saveFileDialog1.ShowDialog()

       If dlg_res = DialogResult.Cancel Then
           wijziging = True
           Return False
       End If

       filename = saveFileDialog1.FileName
       Dim filesave As StreamWriter = New StreamWriter(filename)
       filesave.WriteLine(area.Text)
       filesave.Flush()
       filesave.Close()
       wijziging = False
       Return True

   Catch x As Exception

       MessageBox.Show(x.Message, "Fout!", MessageBoxButtons.OK, MessageBoxIcon.Error)
       Return False

   End Try

End Function


De functie bewaren zouden we ook in het event van het item "Bewaren" kunnen steken, maar als we dit doen moeten we de functie
twee keer schrijven. Een keer in het event van het menu-item en een keer waneer er wijzigingen zijn. Dat is geen nette code
Het enige wat we nu dus moeten zetten in het event van het menu-item "Bewaren", is de aanroep naar de functie "bewaren()". Zo dus:

C#VB.NET
bewaren(); bewaren()


Nu we nieuwe bestanden kunnen aanmaken en bewaren, moet we er reeds bestaande kunnen openen.
Dubbelklik op het item "Openen" van het menu "Menu" Het event wordt weer aangemaakt. Nu gaan we dus
gebruik maken van de openFileDialog. We kijken weer eerst of er geen wijzigingen zijn. In de Dialog zorgen we
dat er alleen tekstbestanden laten zien worden, zodat er geen verkeerde bestanden kunnen geopend worden.
Daarna gaan we via een try-catch blok het bestand uitlezen en de inhoud ervan in ons tekstvak plaatsen. We
geven dan ook nog mee dat er geen wijzigingen zijn, als er iets misgaat wordt er een Messagebix getoond met
een bericht over wat er misliep. Hier is de code voor het openen van een tekstbestand:

C#VB.NET
if (bewaard())
{
   openFileDialog1.FileName = "";
   openFileDialog1.Filter = "Tekstbestanden(*.txt)|*.txt";
   openFileDialog1.ShowDialog();

   try
   {
       if (File.Exists(openFileDialog1.FileName))
       {
           StreamReader lezen = File.OpenText(openFileDialog1.FileName);
           area.Text = lezen.ReadToEnd();
       }
       wijziging = false;
   }
   catch (Exception x)
   {
       MessageBox.Show(x.Message);
   }
}
If bewaard() = True Then
   openFileDialog1.FileName = ""
   openFileDialog1.Filter = "Tekstbestanden(*.txt)|*.txt"
   openFileDialog1.ShowDialog()

   Try
       If File.Exists(openFileDialog1.FileName) Then
           Dim lezen As StreamReader = File.OpenText(openFileDialog1.FileName)
           area.Text = lezen.ReadToEnd()
           wijziging = False
       End If
   Catch x As Exception
       MessageBox.Show(x.Message)
   End Try
End If


Het enige item dat er nog in het menu "Menu" zit is "Afsluiten". Dubbelklik op het item "Afsluiten" in het menu.
Ook hier gaan we weer controleren of er wijzigingen zijn aangebracht. Zo ja gaan we eerst vragen om te bewaren,
zo niet kunnen we gewoon afsluiten. Dit is maar een kort stukje code:

C#VB.NET
if (bewaard())
{
   Application.Exit();
}
If bewaard() = True Then
   Application.Exit()
End If


Hiermee zit het moeilijkste stuk van deze tutorial er op. Je kan al eens wat gaan testen met al deze menu-items en
kijken of alles naar behoren werkt. Normaal zou dit het geval moeten zijn. In het volgende stuk bespreken we het menu "Bewerken".

pijl top
4. Menu "Bewerken"

Hier zou je ook voor elk item een apart event kunnen aanmaken, maar omdat er zo weinig gebeurt in een enkel event
plaatsen we alle code die moet kunnen uitgevoerd worden in 1 event. We noemen het event "bewerken_KeuzeChanged".
LET OP: niet gaan dubbelklikken op elk menu-item dus! Je klikt op het eerste item 1 keer en gaat dan bij de eigenschappen
kijken en je zite boven de lijst met eigenschappen enkele knoppen staan. Je klikt op dat bliksem-knopje en zoekt
naar "Click". Als je die gevonden hebt plaats je er de naam van ons event in. Dit doe je ook voor de andere items van het menu.
Zoals je kan zien wordt er opgehaald welk menu-item dat er gekozen is en wordt de jusit if uitgevoerd.
De volledige code van dat iemand moet er dan als volgt uitzien:

C#VB.NET
private void bewerken_KeuzeChanged(object sender, EventArgs e)
{
   if (sender.ToString() == "Ongedaan maken")
       area.Undo();
   if (sender.ToString() == "Alles selecteren")
       area.SelectAll();
   if (sender.ToString() == "Kopiëren")
       Clipboard.SetDataObject(area.SelectedText, true);
   if (sender.ToString() == "Knippen")
       area.Cut();
   if (sender.ToString() == "Plakken")
   {
       IDataObject tekst = Clipboard.GetDataObject();
       if (tekst.GetDataPresent(DataFormats.Text))
       {
           area.SelectedText += (string)tekst.GetData(DataFormats.Text);
       }
   }
}
Private Sub bewerken_KeuzeChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ongedaanMakenToolStripMenuItem.Click, plakkenToolStripMenuItem.Click, kopiërenToolStripMenuItem.Click, knippenToolStripMenuItem.Click, allesSelecterenToolStripMenuItem.Click

   If sender.ToString() = "Ongedaan maken" Then
       area.Undo()
   End If
   If sender.ToString() = "Alles selecteren" Then
       area.SelectAll()
   End If
   If sender.ToString() = "Kopiëren" Then
       Clipboard.SetDataObject(area.SelectedText, True)
   End If
   If sender.ToString() = "Knippen" Then
       area.Cut()
   End If
   If sender.ToString() = "Plakken" Then
       Dim tekst As IDataObject = Clipboard.GetDataObject()
       If tekst.GetDataPresent(DataFormats.Text) = True Then
               area.SelectedText &= CType(tekst.GetData(DataFormats.Text), String)
       End If
   End If

End Sub


Het enige waar we nog voor moeten zorgen is dat als er in ons tekstvak geen tekst geselecteerd is, de opties
"Kopieren" en "Plakken" niet aanklikbaar zijn. Dubbelklik op de menunaam "Bewerken" en plaats hierin de volgende code:

C#VB.NET
int selectie = area.SelectionLength;
if (selectie > 0)
{
   kopiërenToolStripMenuItem.Enabled = true;
   knippenToolStripMenuItem.Enabled = true;
}
else
{
   kopiërenToolStripMenuItem.Enabled = false;
   knippenToolStripMenuItem.Enabled = false;
}
Dim selectie As Integer = area.SelectionLength
If selectie > 0 Then
   kopiërenToolStripMenuItem.Enabled = True
   knippenToolStripMenuItem.Enabled = True
Else
   kopiërenToolStripMenuItem.Enabled = False
   knippenToolStripMenuItem.Enabled = False
End If


Zo, in feite is nu onze eigen kladblok wel af al kan je er nog wel wat functionaliteiten in steken.
Ik zal er er eentje bespreken in het volgende puntje.

pijl top


5. Extra

Als eerste kunnen we ervoor zorgen dat er ook niet meer kan valsgespeeld worden bij het afsluiten. Als je nu
afsluit met het kruisje doet hij de controle niet of er wijzigingen zijn gesweest. Klik 1x op je Form en ga naar
het eigenschapen zoals bij het menu, zoek hier in de lijst naat het item: "FormClosing" en schrijf hier: "sluiten ".
Plaats hier de volgende code:

C#VB.NET
if (e.CloseReason == CloseReason.UserClosing && bewaard())
   Application.Exit();
If e.CloseReason = CloseReason.UserClosing And bewaard() = True Then
   Application.Exit()
End If


Dit is natuurlijk maar een klein extraatje, maar als je zelf nog aan zaken denkt die nuttig kunnen zijn moet
je zeker niet twijfelen om zelf iets te proberen toevoegen! Op aanvraag van iemand komt er hier nog een extra:
Bij het bewaren van een bestand hebben we de standaardlocatie op "C:" gezet. Het is natuurlijk wel iets handiger
als dit in de standaardmap van de huidige gebruiker komt. Wat moeten we hiervoor weten?

- Windowsversie (in de code staat het alleen voor XP en Vista)
- Taal van Windows (hier enkel Nederlands en Engels)
- De huidige gebruiker

Waarom niet enkel de gebruiker? Afhankelijk van de taal is de standaardlocatie in XP anders.
Bij Vista is dat niet het geval. Daarom moeten we ook de Windowsversie weten. Waar plaatsen we de code?
Voor de gemakkelijkheid van de implementatie van dit stukje code plaatsen we het in het Load event van ons programma.
Ga naar je Form en dubbelklik hierop, het Load-event wordt automatisch aangemaakt. Plaats hierin de volgende code:

C#VB.NET
int OS = System.Environment.OSVersion.Version.Major;
string taal = Thread.CurrentThread.CurrentUICulture.ThreeLetterWindowsLanguageName.ToString();
string user = System.Security.Principal.WindowsIdentity.GetCurrent().Name.ToString();
string[] array = user.Split('\');
string naam = array[1];

if (OS == 5)
{
   dir = "C:\Documents and Settings\" + naam + "\";
   if (taal == "NLD")
       dir += "Mijn Documenten";
   if (taal == "ENU")
       dir += "My Documents";
}

if (OS == 6)
{
   dir = "C:\Users\" + naam +"\Documents";
}
Dim OS As Integer = System.Environment.OSVersion.Version.Major
Dim taal As String = Thread.CurrentThread.CurrentUICulture.ThreeLetterWindowsLanguageName.ToString()
Dim user As String = System.Security.Principal.WindowsIdentity.GetCurrent().Name.ToString()
Dim array As String() = user.Split("\")
Dim naam As String = array(1)

If OS = 5 Then
   dir = "C:\Documents and Settings\" + naam + "\"
   If taal = "NLD" Then
       dir += "Mijn Documenten"
   End If
   If taal = "ENU" Then
       dir += "My Documents"
   End If
End If

If OS = 6 Then
   dir = "C:\Users\" + naam + "\Documents"
End If

Zet boven het Load-event nog dit:

C# :   string dir = "";
VB :   Dim dir As String = ""

Dit is nodig omdat anders de variabele niet gekend is in de functie "bewaren()". Nu moet je enkel nog dit doen in de functie "bewaren()":

C# :   saveFileDialog1.InitialDirectory = dir;
VB :   saveFileDialog1.InitialDirectory = dir

Ik hoop dat ook dit extraatje duidelijk is, het is ook een handige extra dat de standaardlocatie staat ingesteld op de directory van de huidige gebruiker.

pijl top


6. Besluit

Hiermee zijn we aan het definitieve einde van deze tutorial. Met een beetje inzicht in .NET en wat creativiteit
kan je veel bereiken. En een eigen kladblok of iets dergelijks maken is daar een perfect voorbeeld van.
Deze kladblok is vergelijkbaar met die van Windows XP ongeveer dus dat is zeker niet slecht. Hopelijk
vinden jullie het een interessante en vooral ook leerzame tutorial!

Aan de leden: stem aub en staaf je punten met een reactie! ;)

pijl top


« Vorige tutorial : Arrays Volgende tutorial : DataGridView Control in Forms »

© 2002-2024 Sitemasters.be - Regels - Laadtijd: 0.016s